解构 Transformer:用图解透视 AI 时代的核心模型

本文通过直观的图解,深入剖析了 Transformer 模型的核心机制,包括自注意力(Self-Attention)、位置编码(Positional Encoding)和多头注意力(Multi-Head Attention)。它不仅简化了复杂概念,还帮助读者理解 Transformer 如何在 NLP 任务中高效处理上下文关系。面对当前 AI 的快速发展,我们是否真正理解这些基础模型的内部运作?Transformer 的可解释性是否足以支撑我们在关键领域的信任?

上周我听了Acquired播客的一期节目,主题是Nvidia。这期节目讨论了Transformer:GPT中的T,以及21世纪最伟大的发明之一的有力候选者。

我走在Beech Street上,边听边想,我懂Transformer,对吧?你在训练过程中会屏蔽掉一些标记,你有一些注意力头,它们学会连接文本中的概念,你预测下一个词的概率。我从Hugging Face下载了LLMs并玩过它们。我在“聊天”功能被解决之前就使用了GPT-3。在Klaviyo,我们甚至构建了我们第一个由GPT驱动的生成式AI功能之一——主题行助手。而且,很久以前,我参与开发了一个由较老式的语言模型驱动的语法检查器。所以,也许吧。

变压器是由一支在自动翻译(例如从英语翻译成德语)方面工作的谷歌团队发明的。它在2017年通过现在著名的论文《Attention Is All You Need》被介绍给世界。我查看了这篇论文,并看了图1:

img

图1来自Attention Is All You Need

嗯……如果我真的理解了,那也只是在最模糊的水平上。我越看这张图和读这篇论文,就越意识到我对细节并不了解。以下是我写下的一些问题:

  • 在训练过程中,输入是英语的标记化句子,输出是德语的标记化句子吗?
  • 训练批次中的每个项目究竟是什么?
  • 为什么要把输出喂给模型,以及“掩码多头注意力”是如何足够防止它通过学习输出来自输出而作弊的?
  • 多头注意力究竟是什么?
  • 损失是如何计算的?难道它只是取一个源语言句子,将其全部翻译,然后计算损失吗?这显然说不通。
  • 训练完成后,究竟该输入什么来生成翻译?
  • 为什么会有三个箭头进入多头注意力块?

我相信这些问题对两类人来说很容易,听起来也很天真。第一类是那些已经使用类似模型(例如RNN、编码器-解码器)来做类似工作的人。他们一定在阅读论文时立刻就理解了谷歌团队所取得的成就以及他们是如何做到的。第二类是更多的人,他们意识到在过去的七年中,Transformer是多么重要,并花时间去学习其细节。

嗯,我想学习,我觉得最好的方法是从零开始构建模型。我很快就迷失了方向,于是决定追踪别人的代码。我发现了一个非常棒的notebook,它解释了这篇论文并在PyTorch中实现了模型。我复制了代码并训练了模型。我把所有东西(输入、批次、词汇表、维度)都保持得很小,这样我就能追踪每一步发生了什么。我发现记录图中的维度和张量有助于我理清思路。当我完成时,我已经对上面所有的问题有了相当好的答案,我会在绘制完图表后回来回答它们。

以下是整理后的笔记版本。这部分的所有内容都是针对训练单个微型批次,这意味着不同图中的所有张量都是一起的。

为了使内容易于理解,并借鉴笔记本中的想法,我们将训练模型来复制标记。例如,一旦训练完成,“dog run”应该翻译成“dog run”。

img

换句话说:

img

以下是尝试用文字描述到目前为止图中紫色部分表示的张量维度:

img

其中一个超参数是_d-model_,在论文中的基础模型中它是512。在这个例子中,我将其设置为8。这意味着我们的嵌入向量长度为8。下面是带有标记维度的主要图再次展示:

img

让我们放大查看编码器的输入:

img

img

大多数在图中显示的模块(添加 & 规范化、前馈、最终线性变换)只作用于最后一个维度(即第8维)。如果模型只发生这种情况,那么它就只能使用序列中单个位置的信息来预测单个位置。必须在某个地方它能够“混合”位置信息,而这种神奇的混合就在多头注意力模块中发生。

让我们聚焦于编码器中的多头注意力模块。在接下来的图中,请记住,在我的例子中,我将超参数 h(头数)设置为2。(在论文的基础模型中,它是8。)

img

图2来自Attention Is All You Need,作者添加了注释

(2,3,8) 如何变成了 (2,2,3,4)?我们进行了一次线性变换,然后将结果分割成头数(8 / 2 = 4),并重新排列张量维度,使得我们的第二个维度是头。让我们看看一些实际的张量:

img

我们还没有做任何混合位置间信息的事情。这将在下一个缩放点积注意力块中发生。“4” 维度和 “3” 维度最终将接触。

img

图 2 来自 Attention Is All You Need,作者注释

让我们看看这些张量,但为了更容易理解,我们只看批次中的第一个项目和第一个头。换句话说,Q[0,0],K[0,0] 等。其他三个也将发生同样的事情。

img

让我们来看看最终的矩阵乘法,它是softmax输出与V之间的乘法:

img

从一开始,我们可以看到,在这次乘法之前,V中的三个位置——一直追溯到我们的原始句子“ dog run”——都只是独立地进行了操作。这次乘法首次将其他位置的信息融合进来。

回到多头注意力图,我们可以看到,concat操作将每个头的输出重新组合,使得每个位置现在由一个长度为8的向量表示。注意,在concat操作之后、线性匹配之前张量中的1.8和**-1.1与上述缩放点积注意力输出中第一个项目第一个头第一个位置的向量前两个元素中的1.8-1.1**相匹配。(接下来的两个数字也匹配,但被省略号隐藏了。)

img

现在让我们放大整个编码器:

img

起初我以为我会想详细追踪前馈块的实现。论文中称其为“位置前馈网络”,我以为这意味着它可能将信息从当前位置传递到其右侧的位置。然而,情况并非如此。“位置前馈”意味着它在每个位置上独立操作。它对每个位置执行从8个元素到32个元素的线性变换,然后进行ReLU(0和数值的最大值),最后再进行一次线性变换回到8个元素。(这是在我们的小例子中。在论文的基础模型中,它从512个元素变为2048个元素,然后再回到512个元素。这里有很多参数,可能这就是大量学习发生的地方!)前馈的输出又回到了(2,3,8)。

暂时离开我们的玩具模型,这里展示的是论文基础模型中的编码器结构。输入和输出维度匹配真是太好了!

img

现在,让我们放大整个视图,以便我们可以查看解码器。

img

我们不需要追踪解码器的大部分内容,因为它与我们刚刚在编码器一侧看到的非常相似。然而,我标记的部分 AB 是不同的。A 是不同的,因为我们使用了掩码多头注意力。这必须是魔法发生的地方,以便在训练过程中不“作弊”。B 我们稍后再讨论。但首先,让我们隐藏内部细节,并记住我们想要从解码器中得到的大致图景。

img

为了真正强调这个观点,假设我们的英语句子是“她抚摸了狗”,而我们翻译成猪拉丁语后的句子是“eshay etpay ethay ogday”。如果模型已经有了“eshay etpay ethay”,并且正在尝试推测下一个词,那么“ogday”和“atcay”都是高概率的选择。考虑到完整的英语句子“她抚摸了狗”的上下文,它真的应该能够选择“ogday”。然而,如果模型在训练过程中看到了“ogday”,它就不需要学习如何根据上下文进行预测,它只需要学会复制即可。

让我们看看掩码是如何工作的。我们可以稍微跳一下,因为 A 的前一部分工作方式与之前完全相同,它应用线性变换并将事物拆分成头部。唯一的区别是进入缩放点积注意力部分的维度是 (2,2,2,4),而不是 (2,2,3,4),因为我们的原始输入序列长度为两个。这里是缩放点积注意力部分。就像我们在编码器端所做的那样,我们只关注批次中的第一个项目和第一个头部。

img

这次我们有一个掩码。让我们看看 softmax 输出和 V 之间的最终矩阵乘法。

img

现在我们准备好查看B,解码器中的第二个多头注意力机制。与另外两个多头注意力块不同,我们不是输入三个相同的张量,因此我们需要思考V、K和Q分别是什么。我用红色标注了输入。我们可以看到V和K来自编码器的输出,维度为(2,3,8)。Q的维度为(2,2,8)。

img

和之前一样,我们跳到缩放点积注意力部分。V和K具有维度(2,2,3,4)——批处理中的两个项目,两个头,三个位置,长度为四的向量——这是有道理的,但同时也有些令人困惑,Q的维度为(2,2,2,4)。

img

尽管我们“读取”的是编码器输出,其中“序列”长度为三,但 somehow 所有矩阵运算都正确进行,我们最终得到了所需的维度(2,2,2,4)。让我们看看最后的矩阵乘法:

每个多头注意力块的输出都被加在一起。让我们跳过一些步骤,看看解码器的输出并将其转换为预测结果:

img

线性变换将**(2,2,8)转换为(2,2,5)**。想象一下,这就像是反转嵌入,只不过我们不是从一个长度为8的向量转换为一个单个标记的整数标识符,而是转换为一个包含5个标记词汇的概率分布。在我们这个小小的例子中,这看起来有点滑稽。在论文中,当它们将英语翻译成德语时,这更像是从一个大小为512的向量转换到一个包含37,000个词汇的词汇表。

我们很快就会计算损失。不过,即使只看一眼,你也能大致感受到模型的表现如何。

img

它只猜对了一个token。毫不奇怪,因为这是我们第一次训练批次,所有这些都是随机的。这个图表的一个优点是它清楚地表明这是一个多类分类问题。类别是词汇(在这个例子中有5个类别),这也是我之前感到困惑的地方,我们对翻译句子中的每个token(而不是每个句子)进行一次预测(和评分)。不是每个句子一次预测。让我们进行实际的损失计算。

img

例如,如果-3.2变成了-2.2,我们的损失将降低到5.7,朝着期望的方向移动,因为我们希望模型学习到对于那个第一个token的正确预测是4。

上面的图表省略了标签平滑。在实际情况中,损失计算会平滑标签并使用KL散度损失。我认为在没有平滑的情况下,这应该等同于或类似于交叉熵。下面是上面相同图表,但加入了标签平滑。

img

让我们也快速看一下编码器和解码器中学习的参数数量:

img

作为一个合理性检查,我们玩具模型中的前馈块从8到32的线性变换,然后再回到8(如上所述),因此是8 * 32(权重)+ 32(偏置)+ 32 * 8(权重)+ 8(偏置)= 52。记住,在论文的基础模型中,d-model 是512,d-ff是2048,并且有6个编码器和6个解码器,那里会有更多的参数。

使用训练好的模型

现在让我们看看如何将源语言文本输入并获取翻译文本输出。我这里仍然使用一个玩具模型,该模型被训练通过复制标记来进行“翻译”,但与上面的例子不同,这个模型使用的是11个词汇量的大小,而_d-model_的大小是512。(在上面的例子中,词汇量大小是5,而_d-model_是8。)

首先,让我们进行一次翻译。然后我们将看看它是如何工作的。

img

第一步是将源句子输入到编码器中,并保留其输出,在这个例子中,输出是一个维度为(1, 10, 512)的张量。

img

第二步是将输出中的第一个标记输入到解码器中,并预测第二个标记。我们知道第一个标记,因为它总是 = 1。

img

在论文中,他们使用了大小为4的 beam search,这意味着我们将会考虑当前点概率最高的4个标记。为了简化,我将改用贪婪搜索。你可以将其视为大小为1的 beam search。所以,从图表顶部开始,概率最高的标记是编号5。(上面的输出是概率的对数。最高的概率仍然是最大的数字。在这种情况下是-0.0,实际上是-0.004,但我只显示了小数点后一位。模型非常确信5是正确的!exp(-0.004) = 99.6%)

现在我们将[1,5]输入到解码器中。(如果我们使用大小为2的 beam search,我们可以输入包含[1,5]和[1,4]的批次,这是下一个最可能的。)

img

现在我们将[1,5,4]输入:

img

并且退出 3。以此类推,直到我们得到一个表示句子结束的标记(在我们的示例词汇中不存在)或者达到最大长度。

回到上述问题,现在我可以大部分回答我最初的问题了。

在训练过程中,输入是英语分词句子,输出是德语分词句子吗?

是的,差不多是这样。

训练批次中的每个项目具体是什么?

每个项目对应一对翻译句子。

  • 项目的“x”部分有两个部分。第一部分是源句子的所有标记。第二部分是目标句子的所有标记,除了最后一个。
  • 项目的“y”(标签)是目标句子的所有标记,除了第一个。由于源句和目标句的第一个标记总是 ,我们不会浪费或丢失任何训练数据。

什么是微妙的是,如果这是一个分类任务,比如说模型需要接收一张图片并输出一个类别(房子、汽车、兔子等),我们会认为批次中的每个项目都对损失计算贡献了一个“分类”。然而,在这里,批次中的每个项目将对损失计算贡献(目标句子中的token数量 - 1)“分类”。

为什么要把输出喂给模型,以及“掩码多头注意力”如何足够防止它通过学习输出从输出中作弊?

您将输出数据输入模型,以便模型能够学习根据源句子的意义以及迄今为止已翻译的单词来预测翻译。尽管模型中发生了很多事情,但信息在位置之间移动的唯一时间是注意力步骤期间。虽然我们确实将翻译的句子输入到解码器中,但第一次注意力计算使用掩码将预测位置之外的所有信息置零。

多头注意力究竟是什么?

我可能本应该先问问“注意力”究竟是什么,因为那才是更核心的概念。多头注意力意味着将向量分割成组,对每组进行注意力处理,然后将组重新组合起来。例如,如果向量的尺寸是512,且有8个头,那么注意力将在8个独立的组上分别进行,每个组包含一个完整批次的所有位置,每个位置都有一个64大小的向量。如果你眯起眼睛看,可以想象到每个头最终可能会学习到关注某些相关概念,就像那些著名的可视化展示一个头如何学习一个代词所指的单词。

损失是如何计算的?不可能直接拿一个源语言句子,将其全部翻译,然后计算损失,这没有意义。

正确。我们并不是一次性翻译整个句子,然后计算整体句子的相似度或类似的东西。损失的计算方式与其他多类分类问题类似。类别就是我们的词汇表中的标记。技巧在于,我们独立地为目标句子中的每个标记预测一个类别,仅使用在那个时刻应该拥有的信息。标签是目标句子中的实际标记。使用预测和标签,我们通过交叉熵计算损失。(实际上,我们会对标签进行“平滑处理”,以考虑到它们不是绝对的,有时一个同义词可能同样有效。)

训练后,你究竟输入什么来生成翻译?

无法一次性将内容输入并让模型在单次评估中输出翻译。你需要多次使用模型。首先,将源句子输入到模型的编码器部分,并得到一个表示句子意义的编码版本,这种意义以某种抽象、深入的方式表示。然后,将这个编码信息和起始标记 输入到模型的解码器部分。这样你就可以预测目标句子中的第二个标记。接着,将 和第二个标记输入以预测第三个标记。重复这个过程,直到得到完整的翻译句子。(实际上,对于每个位置,你考虑多个高概率的标记,每次输入多个候选序列,并根据总概率和长度惩罚来选择最终的翻译句子。)

为什么有三个箭头进入多头注意力块?

我猜有三个原因。1) 为了表明解码器中的第二个多头注意力块的部分输入来自编码器,部分来自解码器中的前一个块。2) 为了暗示注意力算法的工作原理。3) 为了暗示这三个输入在发生实际注意力之前都经历了各自独立的线性变换。

结论

这真是太美了!如果不是因为它如此实用,我可能不会这样想。我现在能感受到人们第一次看到这个系统工作时可能会有的一种感觉。这个优雅且可训练的模型,用很少的代码就能表达,学会了如何翻译人类语言,并击败了数十年来建立的复杂机器翻译系统。这太令人惊讶、聪明且难以置信了。你可以看到下一步是如何说的,忘了翻译句子对吧,让我们把这项技术应用到互联网上的每一篇文本上——LLMs(大型语言模型)就这样诞生了!

(我敢打赌上面有一些错误。请告知。)

除非另有说明,所有图片均由作者提供,或包含作者对_Attention Is All You Need_中图表的注释。

如何零基础入门 / 学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

read-normal-img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值