Transformer技术在过去几年中在自然语言处理(NLP)领域掀起了风暴。现在,它们也被成功地应用于NLP之外的应用程序中。
Transformer之所以具有强大的能力,是因为它拥有注意力(Attention)模块。这是因为Transformer能够捕捉序列中每个单词与其他每个单词之间的关系。
但至关重要的问题是,它究竟是如何做到这一点的呢?
在这篇文章中,我们将尝试回答这个问题,并理解它执行的计算为何如此。
在我的Transformer系列文章中还有一些额外的文章。在那些文章中,我们学习了Transformer架构,并逐步了解了它们在训练和推理过程中的运行方式。我们也深入探究了其内部机制,详细了解了它们的具体工作原理。
我们的目标不仅是理解某事物如何工作,还要理解它为何以这种方式工作。
- 功能概览(了解Transformer的用途以及为何它们比RNN更优秀。架构的组成部分,以及训练和推理过程中的行为)https://towardsdatascience.com/transformers-explained-visually-part-1-overview-of-functionality-95a6dd460452
- 工作原理(从头到尾的内部操作。数据如何流动以及执行了哪些计算,包括矩阵表示)https://towardsdatascience.com/transformers-explained-visually-part-2-how-it-works-step-by-step-b49fa4a64f34
- 多头注意力(Transformer中的注意力模块的内部工作原理)https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853
如果对一般语言处理应用感兴趣,我还有其他一些文章你可能会喜欢。
- 束搜索(语音识别和NLP应用中常用的增强预测的算法)https://towardsdatascience.com/foundations-of-nlp-explained-visually-beam-search-how-it-works-1586b9849a24
- Bleu分数(Bleu分数和词错误率是NLP模型的两个关键指标)https://towardsdatascience.com/foundations-of-nlp-explained-bleu-score-and-wer-metrics-1a5ba06d812b
为了理解Transformer为何有效,我们必须专注于注意力机制。我们先从输入的数据开始,然后看它是如何处理这些输入的。
输入序列是如何到达注意力模块的呢?
注意力模块存在于编码器堆栈中的每一层编码器,以及解码器堆栈中的每一层解码器。我们首先将重点放在编码器注意力上。
以一个例子来说,假设我们正在处理一个英语到西班牙语的翻译问题,其中的一个样本源序列是“The ball is blue”。目标序列是“La bola es azul”。
源序列首先通过嵌入和位置编码层,为序列中的每个单词生成嵌入向量。嵌入被传递到编码器,在编码器中它首先到达注意力模块。
在注意力机制内部,经过嵌入的序列通过三个线性层,产生三个单独的矩阵——称为Query、Key和Value。这三种矩阵用于计算注意力分数。
需要记住的关键点是,这些矩阵的每一行对应源序列中的一个单词。
每一行输入对应序列中的一个单词
为了理解注意力机制的工作原理,我们从源序列中的单个单词开始,然后跟踪它们通过Transformer的路径。特别是,我们想要关注注意力模块内部发生的事情。
这将帮助我们清晰地看到源序列和目标序列中的每个单词是如何与源序列和目标序列中的其他单词互动的。
因此,在我们进行这个解释时,专注于对每个单词执行的操作,以及每个向量是如何映射到原始输入单词的。我们不需要担心很多其他细节,如矩阵形状、算术计算的具体细节、多个注意力头部等,只要它们与每个单词的去向直接相关即可。
因此,为了简化解释和可视化,让我们忽略嵌入维度,只跟踪每个单词的行。
每个单词都会经历一系列可学习的转换。
每一行都是通过一系列转换从其对应的源单词生成的——嵌入、位置编码和线性层。
所有这些转换都是可训练的操作。这意味着在这些操作中使用的权重不是预先决定的,而是通过模型学习的,以便产生所需的输出预测。
关键问题在于,Transformer是如何确定能够给出最佳结果的一组权重的?请记住这一点,稍后我们还会回到这个问题。
注意力分数——查询词和键词之间的点积
注意力执行多个步骤,但在这里,我们将仅关注线性层和注意力分数。
如我们从公式中所见,注意力的第一步是在查询(Q)矩阵和键(K)矩阵的转置之间执行矩阵相乘(即点积)。观察每个单词发生了什么变化。
我们生成一个中间矩阵(我们可以称之为“因子”矩阵),其中每个单元格是两个单词之间的矩阵乘法。
例如,第四行中的每一列对应于第四个查询词与所有键词之间的点积。
注意力分数——查询-键点积与值单词之间的点积
下一步是在这个中间“因子”矩阵和值(V)矩阵之间执行矩阵乘法,以产生由注意力模块输出的注意力分数。在这里我们可以看到,第四行对应于第四个查询词矩阵与所有其他键和值单词的乘积。
这产生了由注意力模块输出的注意力分数向量(Z)。
思考输出分数的方式是,对于每个单词,它是“值”矩阵中每个单词的编码值,通过“因子”矩阵加权。因子矩阵是特定单词的查询值与所有单词的键值的点积。
查询、键和值词语的作用是什么?
查询词可以被理解为我们正在计算注意力的词。键和值词是我们关注的词,即它与查询词的相关性如何。
例如,在句子“The ball is blue”中,与“blue”对应的行将包含“blue”与其他每个词的注意力评分。在这里,“blue”是查询词,其他词是“键/值”。
还有其他操作,如除法和softmax,但在本文中我们可以忽略它们。它们只是改变矩阵中的数值值,并不影响矩阵中每个单词行的位置。它们也不涉及任何单词之间的交互。
点积告诉我们单词之间的相似性
所以我们看到,通过执行点积并将它们相加,注意力分数捕获了特定单词与其他句子中每个单词之间的交互。但是,矩阵乘法如何帮助变换器确定两个单词之间的相关性呢?
为了理解这一点,记住查询、键和值行实际上是有嵌入维度的向量。让我们仔细看看这些向量之间的矩阵乘法是如何计算的。
当我们对两个向量执行点积时,我们乘以数字对,然后将它们相加。
- 如果两个配对的数字(例如,上面的'a'和'd')都是正数或都是负数,那么乘积将是正数。乘积将增加最终求和。
- 如果一个数字是正数而另一个是负数,那么乘积将是负数。乘积将减少最终求和。
- 如果乘积是正数,两个数字越大,它们对最终求和的贡献就越大。
这意味着,如果两个向量中对应数字的符号一致,最终求和将会更大。
Transformer是如何学习单词之间的相关性的?
点积的概念同样适用于注意力评分。如果两个单词的向量越对齐,注意力评分就会越高。
那么,Transformer想要实现的行为是怎样的呢?
我们希望两个在句子中相互相关性高的单词能够产生较高的注意力评分。而对于两个无关的单词,评分则应该较低。
例如,在句子“黑猫喝牛奶”中,“牛奶”与“喝”相关性高,与“猫”的相关性稍低,与“黑”完全无关。我们希望“牛奶”与“喝”产生较高的注意力评分,对于“牛奶”与“猫”则产生较低的评分,而“牛奶”与“黑”则产生几乎可以忽略的评分。
这就是模型学习输出的目标。
为了实现这一点,"牛奶"与"喝"的单词向量必须对齐。"牛奶"与"猫"的向量会有一些分歧。而"牛奶"与"黑"的向量则会非常不同。
让我们回到我们一直放在心里的那个点——Transformer是如何找出能够给出最优结果的权重集的?
单词向量是基于词嵌入和线性层的权重生成的。因此,Transformer能够学习这些嵌入、线性权重等,以生成所需的单词向量。
换句话说,它会以一种方式学习这些嵌入和权重,使得在句子中有相互相关性的两个单词,它们的单词向量会对齐,从而产生较高的注意力评分。而对于不相关的两个单词,它们的单词向量不会对齐,从而产生较低的注意力评分。
因此,"牛奶"与"喝"的嵌入会非常对齐,产生较高的注意力评分。对于"牛奶"与"猫",它们会有些分歧,从而产生较低的评分。而对于"牛奶"与"黑",它们会非常不同,从而产生较低的评分。
这就是注意力模块背后的原则。
总结 - 什么使得Transformer工作?
点积运算在Query和Key之间进行,用于计算每对单词之间的相关性。然后,这种相关性作为“因子”用于计算所有Value单词的加权和。这个加权和输出为注意力分数。
Transformer以一种方式学习词嵌入等,使得相关联的词更加对齐。
这是引入三个线性层并为Query、Key和Value创建三种输入序列版本的原因之一。这样给注意力模块提供了一些额外的参数,它能够学习调整创建词向量的过程。
Transformer中的编码器自我注意力
注意力在Transformer中有三个地方被使用:
- 编码器中的自我注意力——源序列关注自身
- 解码器中的自我注意力——目标序列关注自身
- 解码器中的编码器-解码器注意力——目标序列关注源序列
在编码器自我注意力中,我们计算源句子中每个单词与其他所有单词的相关性。这种计算在堆栈中的所有编码器中都会发生。
Transformer中的解码器自我注意力
我们刚才看到的大部分编码器自我注意力的内容同样适用于解码器中的注意力,只是有几点小但重要的不同。
在解码器自我注意力中,我们计算目标句子中每个单词与其他每个单词的相关性。
Transformer中的编码器-解码器注意力
在编码器-解码器注意力中,查询是从目标句子中获得的,而键/值是从源句子中获得的。因此,它计算目标句子中每个单词与源句子中每个单词的相关性。
总结
希望这能让你对Transformer设计的优雅之处有一个良好的理解。也请阅读我系列中的其他Transformer文章,以深入了解为什么Transformer现在成为了许多深度学习应用的首选架构。
最后,如果你喜欢这篇文章,你可能会喜欢我关于音频深度学习、地理定位机器学习和批规范化等其他系列文章。