本文图文并茂地解析了Transformer模型,深入了解其内部机制,核心概念与应用,助力读者理解并应用该模型。
原文标题:独家 | 用图逐层解析Transformer
原文作者:数据派THU
冷月清谈:
怜星夜思:
2、文章中提到,在训练过程中使用了掩码(mask)机制。那么,除了防止模型“作弊”外,掩码机制还有哪些其他的应用场景?
3、文章中提到Beam Search(束搜索),这是一种常用的解码策略。你觉得除了Beam Search,还有哪些其他的解码策略?它们各自的优缺点是什么?
原文内容
文:Eric Silberstein翻译:周梓溢校对:陈超本文约6200字,建议阅读10+分钟你到底输入了什么,你到底得到了什么,你是如何用Transformer生成文本的?
用图逐层解析Transformer
在 Beacon街道上边走边听,我在想,我是了解Transformer的,对吧?Transformer在训练过程中掩蔽了Token,让注意力头将文本中的概念联系起来,以此来预测下一个单词的概率。我已经从 Hugging Face 下载大语言模型并尝试使用。早些时候,当我在使用 GPT-3时,它的“聊天”部分还被完全开发出来。在 Klaviyo,我们甚至在我们的主题词助手中构建了第一批由 GPT 驱动的生成式AI功能。很久以前,我还开发过一个由老式语言模型驱动的语法检查器。Transformer也许是这样吧。
Transformer 是 Google 的一个团队提出的,这个团队致力于自动翻译,例如从英语到德语。它于 2017 年著作 Attention Is All You Need 中被介绍给全世界。我调出论文,看了看图 1(下图所示):
-
在训练期间,输入是英语的标记化句子,输出是德语的标记化句子吗?
-
单个训练批次中的每个项目到底是什么?
-
为什么要将模型输出的结果喂给模型,“带有掩码的多头注意力 ”如何足以防止它通过从输出的结果中学习输出来作弊?
-
究竟什么是多头注意力?
-
损失究竟是如何计算的?不可能是把一个源语言句子翻译完整,然后计算损失,这不合理。
-
训练后,究竟喂进去什么才能生成翻译?
-
为什么有三个箭头指向多头注意力模块?
我敢肯定,这些问题对两类人来说很容易而且听起来很幼稚。第一种是已经使用相似模型(例如 RNN、编码器-解码器)来做相似事情的人。当他们阅读论文时,一定立刻就明白 Google 团队完成了什么以及他们是如何做到的。第二个是更多的人意识到Transformers 在过去七年中的重要性,并花时间了解细节。
我想学习,我认为最好的方法是从头开始构建模型。我很快就迷失了方向,并决定跟着别人写的代码学习。我找到了这个很棒的笔记本,它解释了这篇论文并在 PyTorch 中实现了这个模型。我复制了代码并训练了模型。我把所有东西(输入、Batch、词汇、维度)都保持得很小,这样我就可以追踪每一步发生的事情。我发现,注意图表上的维度和张量有助于我保持理顺思路。当我完成时,我对上述所有问题都有了很好的答案,我将在解析完图表之后回答它们。
以下是我的笔记整理版本。这部分的所有内容都是为了训练一个单一的小批量,这意味着不同图表中的所有张量都是一起的。
为了便于理解并从 Notebook 中复制想法,我们将训练模型来复制 Token。例如,经过训练,“dog run”应该翻译成“dog run”。
让我们放大编码器中的多头注意力模块。对于下一张图,请记住在我的示例中,我将超参数 h(头数)设置为 2。(在论文的基本模型中,它是 8)。
让我们看看张量,但为了更容易理解,我们只查看batch中的第一项和第一个头数。换句话说,就是Q[0,0]、K[0,0] 等。其他三个注意力头也会发生同样的情况。
回到多头注意力图,我们可以看到 concat 将每个头的输出重新放在一起,因此每个位置现在都由长度为 8 的向量表示。请注意,在 concat 之后但线性之前的张量中的 1.8 和 -1.1 与向量中前两个元素的 1.8 和 -1.1 匹配,这些元素来自上面所示的缩放点积注意的输出中批处理中第一项中第一个头的第一个位置。(接下来的两个数字也匹配,但它们被省略号隐藏了。
暂且先不谈我们的玩具模型,下面是论文中基本模型中编码器的样子。输入和输出尺寸一致,这一点非常好!
让我们看看掩码是如何做到这一点的。我们可以跳过前面这部分,因为 A 的第一部分的工作方式与之前完全相同,它用线性转换并将内容拆分为多个头。唯一的区别是进入缩放的点积注意力部分的维度是 (2,2,2,4) 而不是 (2,2,3,4),因为我们的原始输入序列的长度为 2。下面是缩放的点积注意力部分。正如我们在编码器端所做的那样,我们只关注批处理中的第一项和第一个头。
稍后我们将计算损失。不过,首先,即使只是看一眼,您也可以了解模型的运行情况。
上图没有对标签做平滑处理。在实际论文中,损失计算对标签进行平滑处理,并使用 KL Divergence 损失。我认为在没有平滑的情况下,这与交叉熵相同或类似。这是与上面相同的图表,但使用了标签平滑。
使用训练过的模型
首先,我们来做一个翻译,看看它是怎样工作的。
现在我们将 [1,5] 输入到解码器中。(如果我们使用束大小为 2 进行束搜索,我们可以改为输入包含 [1,5] 和 [1,4] 的Batch,这是下一个最有可能的Batch。)
回到上面的问题
在训练期间,输入是英语的标记化句子,输出是德语的标记化句子吗?
训练Batch中的每个项目到底是什么?
-
项目的 “x” 有两个部分。第一部分是源句子的所有Token。第二部分是目标句子的所有Token,除了最后一部分。
-
项目的 “y” (label) 是目标句子的所有Token,除了第一个Token。由于源句子和目标句子的第一个 Token 始终是相同的,因此我们不会浪费或丢失任何训练数据。
有些微妙的是,如果这是一个分类任务,比如模型必须拍一张图并输出一个类(房子、汽车、兔子等),我们会将Batch中的每个项目看作是为损失计算贡献一个“分类”。但是,在这里,Batch中的每个项目都将为损失计算贡献(number_of_Tokens_in_target_sentence – 1) 个“分类”。
为什么要将模型输出的结果输入到模型中,“带有掩码的多头注意力 ”如何足以防止它通过从输出的结果中学习输出来作弊?
如果您将模型输出的结果输入到模型中去,模型可以学习基于源句子的含义和到已经翻译的单词来预测翻译的结果。尽管模型中做了很多事情,但信息在位置之间移动的唯一时间是在注意力步骤上。即使我们将翻译后的句子输入到解码器中,但第一次注意力计算会使用掩码将所有超出我们预测之外的位置信息归零。
究竟什么是多头注意力?
我可能要问一下究竟什么是注意力,因为这是更核心的概念。多头注意力的意思是把向量切分成组,关注这些组,然后将这些组重新放在一起。例如,如果向量的大小为512 并且有 8 个头,注意力会独立地对 8 组进行关注,每组包含一整批完整位置,每个位置都有一个大小为 64 的向量。如果你眯着眼睛,你可以看到每个头最终是怎样学会关注某些相关概念的,就像可视化一样展示,一个头将如何学习一个代词所指的是什么单词。
损失究竟是如何计算的?不可能是把一个源语言句子翻译完整,然后计算损失,这不合理。
对。我们不会一次性翻译一个完整的句子并计算整体句子相似度或类似的东西。损失的计算方式就和其他多分类问题一样。这里的类别就是词汇表的各个Token。诀窍是,我们只使用当时应该拥有的信息独立预测目标句子中每个Token的类。标签是目标句子中的实际Token。基于预测值和标签,我们可以通过交叉熵计算损失。(事实上,我们会 使标签“平滑 ”化来处理标签的非绝对性,同义词也能起到同样的作用。)
训练后,究竟输入什么来生成翻译?
不能一次性输入一些内容,让模型直接给出翻译结果。需要多次使用该模型。首先,把源句子输入到模型的编码器部分,得到一个抽象的、有深度的句子版本。然后,把编码信息和起始Token输入到模型的解码器部分。这就可以预测目标句子中的第二个Token。然后根据输入的内容和第二个 Token来预测第三个Token。重复这个动作,直到得到一个完整的翻译句子。(但事实上,模型会考虑每个位置使用多个高概率Token,每次输入多个候选序列,并根据总概率和长度损失选择最终翻译的句子。)
为什么有三个箭头进入多头注意力模块?
我猜有三个原因。1) 说明解码器中的第二个多头注意力区块的部分输入来自编码器,部分来自解码器中的前一个区块。2) 解释注意力算法是如何工作的。3)暗示在实际注意力发生之前,三个输入中的每一个都经历了各自独立的线性变换。
结论
它很漂亮!如果不是因为它非常有用,我可能不会这么想。我现在体会到了人们第一次看到它工作时的感觉。这个用很少代码就能表达的优雅、可训练的模型学会了如何翻译人类语言,并击败了几十年来建立的复杂机器翻译系统。它神奇、聪明,令人难以置信。你可以看到下一步是怎么说的,而不用在意翻译的句子。让我们在互联网上的每一点文本上使用这种技术—大语言模型就这样诞生了!
除非另有说明,否则所有图片均由作者提供,包含作者对 Attention Is All You Need 中的图表的注释 。
编辑:黄继彦
译者简介
作者简介
周梓溢,广州大学统计学在读学生,数据科学爱好者。在学习中时常翻阅数据科学英文文献,一直在学习的路上,希望在学习过程输出一些有意义的事情。很高兴加入数据派THU翻译组这个大家庭,期望与大家共同探索数据科学,一起「无限进步」!
翻译组招募信息
工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。
你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。
其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。
点击文末“阅读原文”加入数据派团队~
转载须知
如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。
发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。