全面指南!掰细了讲Transformer模型各个组件和数据流动过程,建议收藏!!

导读

最近 Transformer 模型可太火了,它作为 GPT 中的 “T”,无疑是当下人工智能领域的核心技术,甚至堪称 21 世纪最伟大发明的有力候选者。你是不是也常听到它的大名,却对其原理一知半解?

本文是一篇关于Transformer模型的详细解析,作者通过实际操作和代码追踪,深入探讨了Transformer模型的工作原理,特别是其在训练和文本生成中的具体机制。

Transformer模型是由谷歌的一个团队发明的,当时他们致力于自动翻译研究,比如将英语翻译成德语。2017年,该模型在如今大名鼎鼎的论文《Attention Is All You Need》中首次亮相。在深入 Transformer 模型的细节之前,咱们得先搞清楚一些基础概念。

词元化(Tokenization)

词元化就像是把句子拆分成一个个小零件。比如 “我喜欢苹果”,经过词元化可能就变成了 [“我”, “喜欢”, “苹果”]。在 Transformer 模型处理文本时,首先就要把输入的文本进行词元化,每个词元都被赋予一个唯一的编号,这样计算机就能 “读懂” 文本啦。

嵌入(Embedding)

这一步就像是给每个词元打造一张专属 “身份证”。把词元编号转化为一个固定长度的向量,这个向量里包含了词元的各种语义信息。比如 “苹果” 这个词元,经过嵌入后会变成一个像 [0.2, 0.5, -0.3, 0.1] 这样的向量,向量中的每个数值都承载着特定的意义,让模型能更好地理解和处理词元之间的关系。

注意力机制(Attention Mechanism)

注意力机制是 Transformer 模型的核心亮点。简单来说,它让模型在处理文本时,能像人阅读一样,重点关注某些部分。比如读到 “小明在公园里喂鸽子,它们吃得很开心”,模型能通过注意力机制把 “小明” 和 “鸽子” 联系起来,理解是小明喂鸽子,鸽子吃得开心,而不是其他混乱的关系。这样模型就能更准确地捕捉文本中的语义信息,提高处理效果。

整体架构概览

Transformer 模型采用了编码器 - 解码器(Encoder - Decoder)架构,就像两个配合默契的小伙伴。编码器负责把输入的文本 “消化” 成一种抽象的表示,这种表示包含了文本的关键信息;解码器则根据编码器的输出,一个词元一个词元地生成目标文本。

图片

编码器(Encoder)详解

多头注意力模块(Multi - Head Attention):这是编码器的 “智慧大脑”。它把嵌入后的向量分成多个 “小份”,也就是多个头(head),每个头都独立地计算注意力。假设向量大小是 512,有 8 个注意力头,那么每个头处理的向量大小就是 64。不同的头可以关注文本的不同方面,有的头可能更关注主语和谓语的关系,有的头则对时间地点等信息更敏感。最后,再把各个头的结果拼接起来,这样就能更全面地捕捉文本信息啦。

前馈网络(Feed - Forward Network):这是一个对每个位置独立进行操作的模块。它先把每个位置的向量从 8 个元素扩展到 32 个(在基础模型中是从 512 扩展到 2048),经过 ReLU 函数激活(ReLU 函数会把负数变成 0,正数保持不变),再把向量变回 8 个元素(基础模型变回 512)。虽然操作看起来简单,但这里面包含了大量的参数,模型的很多 “学习成果” 都体现在这里呢。

Add & Norm:这个模块起到了 “平衡器” 的作用。它先把多头注意力模块或前馈网络的输出与输入相加,这样可以保留原始输入的一些信息,避免在处理过程中丢失关键内容;然后进行归一化操作,把数据的分布调整到一个合适的范围,让模型训练更加稳定。

解码器(Decoder)详解

掩码多头注意力模块(Masked Multi - Head Attention):解码器中的这个模块和编码器的多头注意力模块类似,但多了一个 “掩码” 操作。训练时,模型不能 “偷看” 后面的词元信息,掩码就像是给模型戴上了一副 “眼罩”,遮住了不该看的部分。比如模型在预测 “我喜欢苹果” 中的 “苹果” 时,不能直接看到 “苹果” 这个词,只能根据前面的 “我喜欢” 来预测,这样就能保证模型真正在学习如何根据上下文进行预测。

第二个多头注意力模块:这个模块的输入比较特殊,V 和 K 来自编码器的输出,携带了源文本的信息;Q 则来自解码器上一个位置的输出。通过这个模块,解码器能把源文本信息和已经生成的部分译文信息结合起来,更好地预测下一个词元。

输出层(Output Layer):经过前面一系列的处理,解码器最后通过一个线性变换和 Softmax 函数,把输出转化为词汇表上每个词元的概率分布。模型会选择概率最高的词元作为预测结果,逐步生成完整的译文。

整体流程详解

本文构建一个小型的Transformer模型,并使用PyTorch进行实现和训练,来深入理解模型的各个组件和数据流动过程。例如,训练完成后,“dog run” 应该输出 “dog run”。

图片展示训练模型复制标记的示例,包括训练数据、词汇表、张量维度等信息

换句话说:

图片(此处插入图:进一步说明训练时输入和预测的标记,以及防止模型 “作弊” 的情况)

这里尝试用文字解释一下目前图表中(紫色标注的)张量维度的含义:

图片(此处插入图:详细解释张量维度的含义,如批次大小、序列长度、词汇表大小等)

超参数之一是 ,在论文的基础模型中它的值为512。在这个示例中,本文将其设为8。这意味着我们的嵌入向量(embedding vectors)长度为8。下面是再次展示的主图表,很多地方都标注了维度:图片(此处插入图:标注了更多维度信息的Transformer模型架构图,涵盖编码器、解码器、注意力模块等部分)

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

图片

图片(此处插入图:展示编码器输入的张量及相关解释,包括位置编码对嵌入向量的影响)

图表中大多数模块(如Add & Norm、Feed Forward、最后的线性变换)都只对最后一个维度(即8)进行操作。如果只是这样,模型就只能利用序列中单个位置的信息来预测单个位置。模型肯定在某个地方对不同位置的信息进行了 “融合”,而这个神奇的操作就发生在多头注意力模块中。

让我们放大看看编码器中的多头注意力模块。在接下来的图表中,请记住,在我的示例中,我将超参数 (头的数量)设为2(论文基础模型中是8)。

图片(此处插入图:标注了作者注释的多头注意力模块图,展示了线性变换、拼接、缩放点积注意力等操作及张量维度变化)

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

图片(此处插入图:展示多头注意力模块中输入张量V、K、Q的具体数值,解释它们之间的关系及维度变化原因)

我们还没有进行任何跨位置信息融合的操作,这将在接下来的缩放点积注意力模块中实现。“4” 维度和 “3” 维度最终会相互作用。

图片(此处插入图:标注了作者注释的缩放点积注意力模块图,展示了矩阵乘法、SoftMax、掩码(可选)、缩放等操作及张量维度变化)

让我们看看张量,但为了便于理解,我们只看批次中的第一个元素和第一个头,即Q[0,0]、K[0,0] 等。其他三个元素也会进行相同的操作。

图片

让我们看看SoftMax输出和V之间的最后一次矩阵乘法:

图片(此处插入图:展示缩放点积注意力模块中最后一次矩阵乘法的计算过程及结果,说明其对不同位置信息的融合作用)

从最开始梳理可以发现,在这次乘法之前,V中三个位置的元素,一直回溯到原始句子 “dog run”,都只是独立进行操作。这次乘法首次融合了其他位置的信息。

回到多头注意力模块的图表,我们可以看到,拼接操作将每个头的输出重新组合在一起,这样每个位置现在都由一个长度为8的向量表示。注意,拼接后、线性变换前的张量中的1.8和 -1.1,与上面缩放点积注意力模块输出中,批次中第一个元素的第一个头的第一个位置向量的前两个元素1.8和 -1.1相匹配(接下来的两个数字也匹配,只是被省略号隐藏了)。

图片(此处插入图:再次展示多头注意力模块图,突出拼接前后张量数值的对应关系)

现在让我们把视角放大到整个编码器:

图片(此处插入图:展示整个编码器的输入、输出及中间操作的张量,包括位置编码、多头注意力、前馈网络等部分)

起初,本想详细追踪前馈网络模块。论文中它被称为 “逐位置前馈网络(position-wise feed-forward network)”,我原以为这意味着它可能会将一个位置的信息传递到右侧的位置。但并非如此,“逐位置” 意味着它对每个位置独立进行操作。在我们的小示例中,它对每个位置进行一次线性变换,将8个元素转换为32个,应用ReLU函数(取0和该数中的较大值),然后再进行一次线性变换变回8个元素。(在论文的基础模型中,是从512转换为2048,再变回512。这里有很多参数,很可能模型的大部分学习过程都发生在这里!)前馈网络的输出维度又变回了(2,3,8)。

暂时抛开我们的简易模型,看看论文基础模型中的编码器是什么样的。输入和输出维度相匹配,这一点非常好!

图片(此处插入图:展示论文基础模型中编码器的架构,包含多个编码器层,输入和输出维度均为(batch size, sequence length, 512))

现在让我们把视角拉到最大,看看解码器。

图片(此处插入图:展示Transformer模型架构图,重点突出解码器部分,包括掩码多头注意力模块、第二个多头注意力模块及相关输入输出张量)

解码器部分的大部分内容与我们刚刚看过的编码器部分非常相似,所以不需要详细追踪。不过,我标记为A和B的部分有所不同。A部分不同是因为我们使用了掩码多头注意力机制,训练时防止 “作弊” 的关键肯定就在这里。B部分我们稍后再看。但首先,我们先忽略内部细节,记住我们希望从解码器得到什么结果。

图片(此处插入图:简化后的解码器示意图,突出输入信息和预测目标,强调训练时防止模型 “作弊” 的原理)

为了更深入理解这一点,假设我们的英语句子是 “she pet the dog”,翻译成猪拉丁语(Pig Latin)是 “eshay etpay ethay ogday”。如果模型已经有了 “eshay etpay ethay”,并尝试预测下一个单词,“ogday” 和 “atcay” 都是概率较高的选择。结合 “she pet the dog” 这个完整英语句子的上下文,模型应该能够选择 “ogday”。然而,如果模型在训练时能看到 “ogday”,它就不需要学习如何利用上下文进行预测,只需学会复制即可。

让我们看看掩码是如何起作用的。我们可以跳过前面一部分,因为A部分的开头与之前的操作完全相同,都是应用线性变换并将数据拆分成头。唯一的区别是,进入缩放点积注意力部分的维度是(2,2,2,4),而不是(2,2,3,4),因为我们的原始输入序列长度为2。这是缩放点积注意力部分。和编码器部分一样,我们只看批次中的第一个元素和第一个头。

图片(此处插入图:详细展示解码器中掩码多头注意力模块的缩放点积注意力部分的计算过程,包括掩码的应用及对结果的影响)

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

图片(此处插入图:展示掩码多头注意力模块中最后一次矩阵乘法的结果,突出掩码对信息传递的限制作用)

注意第一个矩阵右上角的0.0,它来自掩码。现在,当我们进行乘法运算(类似于求加权平均值)时,输出的第一个位置就无法从第二个位置获取任何信息,但第二个位置可以从第一个和第二个位置获取信息。如果我们的序列更长,SoftMax输出的矩阵可能是这样的:

[[#,0,0,0],
[#,#,0,0],
[#,#,#,0],
[#,#,#,#]]

现在我们来看看B部分,即解码器中的第二个多头注意力模块。与其他两个多头注意力模块不同,这里输入的不是三个相同的张量,所以我们需要弄清楚哪个是V、哪个是K、哪个是Q。我用红色标注了输入。可以看到,V和K来自编码器的输出,维度是(2,3,8),Q的维度是(2,2,8)。

图片(此处插入图:展示解码器中第二个多头注意力模块的输入及相关张量维度)

和之前一样,我们直接跳到缩放点积注意力部分。V和K的维度是(2,2,3,4)(批次中有两个元素、两个头、三个位置、向量长度为4),Q的维度是(2,2,2,4),这虽然能说得通,但也有点让人困惑。

图片(此处插入图:展示解码器中第二个多头注意力模块的缩放点积注意力部分的计算过程及张量维度变化)

尽管我们是从编码器输出中 “读取” 信息,而编码器输出的 “序列” 长度为3,但经过一系列矩阵运算,最终得到了我们想要的维度(2,2,2,4)。让我们看看最后一次矩阵乘法:

图片(此处插入图:展示解码器中第二个多头注意力模块最后一次矩阵乘法的结果,解释输出向量与编码器输出向量之间的关系)

每个多头注意力模块的输出会相加在一起。我们直接跳到解码器的输出部分,看看如何将其转换为预测结果:

图片(此处插入图:展示解码器输出经过线性变换、SoftMax等操作后得到预测概率的过程,以及与标签对比计算损失的相关信息)

线性变换将我们从(2,2,8) 的维度转换到(2,2,5)。可以把这看作是嵌入的逆过程,只不过不是从长度为8的向量转换为单个标记的整数标识符,而是转换为在包含5个标记的词汇表上的概率分布。在我们的小示例中,这些数字可能看起来有点奇怪。在论文中,当进行英语到德语的翻译时,更像是从大小为512的向量转换到包含37000个词的词汇表。

马上我们就要计算损失了。不过,即便只是匆匆一瞥,你也能大致了解模型的表现。

图片(此处插入图:展示预测概率和标签的对比,直观呈现模型预测的正确与否)

模型只预测对了一个标记,这并不奇怪,因为这是我们的第一个训练批次,所有结果都只是随机的。这个图表的好处在于,它清晰地表明这是一个多分类问题。类别就是词汇表中的单词(在这个例子中有5个类别)。这也是我之前感到困惑的地方,我们是对翻译句子中的每个标记进行预测(并打分),而不是对整个句子进行一次预测。让我们来实际计算一下损失。

图片(此处插入图:展示损失计算的具体过程,以交叉熵为例)

例如,如果 -3.2 变成了 -2.2,我们的损失就会降到5.7,朝着我们期望的方向下降,因为我们希望模型学习到,第一个标记的正确预测是4。

上面的图表没有展示标签平滑(label smoothing)的过程。在实际的论文中,损失计算使用了标签平滑,并采用KL散度损失。我认为在没有平滑的情况下,它与交叉熵损失是相同或相似的。下面是同样的图表,但包含了标签平滑的过程。

图片(此处插入图:展示包含标签平滑的损失计算图表,解释其原理和作用)

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

图片(此处插入图:展示计算编码器和解码器中参数数量的相关信息,以简易模型为例说明计算方法)

作为一个合理性检查,在我们的简易模型中,前馈网络模块有一次从8到32再回到8的线性变换(如上文所述),所以参数数量为8×32(权重) + 32(偏置) + 32×8(权重) + 8(偏置) = 52。请记住,在论文的基础模型中, 为512, 为2048,并且有6个编码器层和6个解码器层,参数数量会多得多。

使用训练好的模型

现在让我们看看如何输入源语言文本并得到翻译后的文本。这里我仍然使用一个简易模型,这个模型经过训练可以通过复制标记来 “翻译”。不过,与上面的示例不同,这个模型的词汇表大小为11, 为512(上面的示例中词汇表大小为5, 为8)。

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

图片(此处插入图:展示输入源句子和得到的 “翻译” 句子,标注出翻译错误的位置)

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

图片(此处插入图:展示源句子输入编码器的过程及编码器输出张量的维度)

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

图片(此处插入图:展示第一个标记输入解码器后,经过一系列操作得到预测概率的过程,包括SoftMax、线性变换等)

在论文中,他们使用束搜索(beam search),束宽为4,这意味着在这一步我们会考虑概率最高的4个标记。为了简化操作,我将使用贪心搜索(greedy search)。你可以把它看作是束宽为1的束搜索。从图表顶部读取,概率最高的标记是5(上面的输出是概率的对数,概率最高的仍然是数值最大的那个。在这个例子中是 -0.0,实际上是 -0.004,但我只保留一位小数。模型非常确定5是正确的!exp(-0.004) = 99.6%)。

现在我们将[1,5] 输入到解码器中(如果我们使用束宽为2的束搜索,我们可以输入一个包含[1,5] 和[1,4] 的批次,[1,4] 是下一个最有可能的结果)。

图片(此处插入图:展示[1,5] 输入解码器后,经过一系列操作得到预测概率的过程)

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

图片(此处插入图:展示[1,5,4] 输入解码器后,经过一系列操作得到预测概率的过程)

得到输出3。以此类推,直到我们得到一个表示句子结束的标记(我们的示例词汇表中没有这个标记),或者达到最大长度。

最后的最后

感谢你们的阅读和喜欢,作为一位在一线互联网行业奋斗多年的老兵,我深知在这个瞬息万变的技术领域中,持续学习和进步的重要性。

为了帮助更多热爱技术、渴望成长的朋友,我特别整理了一份涵盖大模型领域的宝贵资料集。

这些资料不仅是我多年积累的心血结晶,也是我在行业一线实战经验的总结。

这些学习资料不仅深入浅出,而且非常实用,让大家系统而高效地掌握AI大模型的各个知识点。如果你愿意花时间沉下心来学习,相信它们一定能为你提供实质性的帮助。

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

大模型知识脑图

为了成为更好的 AI大模型 开发者,这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

经典书籍阅读

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。

在这里插入图片描述

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下

在这里插入图片描述

640套AI大模型报告合集

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

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值