Transformers 直观解释——不仅是如何工作,而且为什么工作得这么好
输入序列如何到达Attention模块
注意力模块存在于编码器堆栈中的每个编码器中,以及解码器堆栈中的每个解码器中。我们将首先放大编码器的注意力。
Attention in the Encoder:
举个例子,假设我们正在研究一个英语到西班牙语的翻译问题,其中一个示例源序列是“The ball is blue”。目标序列是“La bola es azul”。
源序列首先通过嵌入和位置编码层,该层为序列中的每个单词生成嵌入向量。嵌入被传递到编码器,首先到达注意力模块。
在注意力机制中,嵌入序列通过三个线性层,产生三个独立的矩阵——称为查询、键和值。这是用于计算注意力分数的三个矩阵。
要记住的重要一点是,这些矩阵的每一“行”对应于源序列中的一个单词。
The flow of the source sequence:源序列的流程
每个输入行都是序列中的一个单词
我们理解注意力机制的方式是从源序列中的单个单词开始,然后跟随它们通过 Transformer 的路径。特别是,我们希望关注注意力模块内部发生的事情。
这将帮助我们清楚地了解源序列和目标序列中的每个单词如何与源序列和目标序列中的其他单词相互作用。
因此,当我们进行解释时,请重点关注对每个单词执行的操作以及每个向量如何映射到原始输入单词。我们不需要担心许多其他细节,例如矩阵形状、算术计算的细节、多个注意力头等等,如果它们与每个单词的去向不直接相关的话。
因此,为了简化解释和可视化,我们忽略嵌入维度并仅跟踪每个单词的行。
The flow of each word in the source sequence :源序列中每个单词的流程
每个单词都会经历一系列可学习的转换
每个这样的行都是通过一系列转换(嵌入、位置编码和线性层)从其相应的源字生成的。
所有这些转换都是可训练的操作。这意味着这些操作中使用的权重不是预先确定的,而是由模型学习的,从而产生所需的输出预测。
Linear and Embedding weights are learned:学习线性和嵌入权重
关键问题是,Transformer 如何计算出哪一组权重能够带来最佳结果?请记住这一点,因为我们稍后会再讨论它。
注意力分数——查询和关键词之间的点积
注意力执行几个步骤,但在这里,我们将只关注线性层和注意力分数。
Multi-head attention :多头注意力
Attention Score calculation:注意力分数计算
从公式中我们可以看出,Attention 的第一步是在 Query (Q) 矩阵和 Key (K) 矩阵的转置之间进行矩阵乘法(即点积)。观察每个单词发生了什么。
我们生成一个中间矩阵(我们称之为“因子”矩阵),其中每个单元格都是两个单词之间的矩阵乘法。
Dot Product between Query and Key matrices :
查询矩阵和关键矩阵之间的点积
例如,第四行中的每一列对应于第四个查询词与每个关键字之间的点积。
查询矩阵和关键矩阵之间的点积:
注意力分数——查询关键词和值词之间的点积
下一步是这个中间“因子”矩阵和值(V)矩阵之间的矩阵乘法,以产生由注意力模块输出的注意力分数。这里我们可以看到第四行对应于第四个查询词矩阵乘以所有其他关键字K和值V。
Dot Product between Query-Key and Value matrices :
查询键和值矩阵之间的点积
这会产生由注意力模块输出的注意力分数向量 (Z)。
考虑输出分数的方法是,对于每个单词,它是“值”矩阵中每个单词的编码值,并由“因子”矩阵加权。因子矩阵是该特定单词的查询值与所有单词的键值的点积。
Attention Score is a weighted sum of the Value words:
注意力分数是价值词的加权总和
查询词、关键词和值词的作用是什么?
查询词可以解释为我们正在计算注意力的词。键和值词是我们正在关注的词,即。该词与查询词的相关程度如何。
Attention Score for the word “blue” pays attention to every other word :
“blue”一词的注意力分数会关注所有其他单词
例如,对于句子“The ball is blue”,单词“blue”的行将包含“blue”与其他每个单词的注意力分数。这里,“blue”是查询词,其他词是“Key/Value”。
还有其他操作正在执行,例如除法和 softmax,但我们可以在本文中忽略它们。它们只是更改矩阵中的数值,但不影响矩阵中每个单词行的位置。它们也不涉及任何词间交互。
点积告诉我们单词之间的相似度
因此,我们已经看到,注意力分数通过进行点积,然后将它们相加,捕获特定单词与句子中每个其他单词之间的关系。但是矩阵乘法如何帮助 Transformer 确定两个单词之间的相关性呢?
要理解这一点,请记住查询、键和值行实际上是具有嵌入维度的向量。让我们仔细看看这些向量之间的矩阵乘法是如何计算的。
Each cell is a dot product between two word vectors :
每个单元格都是两个词向量之间的点积
当我们在两个向量之间进行点积时,我们将数字对相乘,然后将它们相加。
- 如果两个配对数字(例如上面的“a”和“d”)均为正数或均为负数,则乘积将为正数。该乘积将增加最终的总和。
- 如果一个数为正数,另一个数为负数,则乘积将为负数。该乘积将减少最终的总和。
- 如果乘积为正,则两个数字越大,对最终求和的贡献就越大。
这意味着如果两个向量中对应数字的符号对齐,则最终的和会更大。
Transformer 如何学习单词之间的相关性?
点积的概念也适用于注意力分数。如果两个单词的向量更加对齐,则注意力分数会更高。
那么我们想要 Transformer 的行为是什么呢?
我们希望句子中彼此相关的两个单词的注意力分数较高。我们希望两个彼此不相关的单词的分数较低。
例如,对于句子“黑猫喝牛奶”,“牛奶”一词与“喝”非常相关,可能与“猫”相关性稍差,与“黑”无关。我们希望“牛奶”和“饮料”产生较高的注意力分数,“牛奶”和“猫”产生稍低的分数,而“牛奶”和“黑色”产生可忽略不计的分数。
这是我们希望Transformer 模型学习产生的输出。
为此,“牛奶”和“饮料”的词向量必须对齐。 “牛奶”和“猫”的向量会有所不同。对于“牛奶”和“黑色”来说,它们会有很大不同。
让我们回到我们一直牢记的一点——Transformer 如何计算出哪一组权重将给它带来最好的结果?
词向量是根据词嵌入和线性层的权重生成的。因此,Transformer 可以学习这些嵌入、线性权重等,以生成上述所需的词向量。
换句话说,它将以这样的方式学习这些嵌入和权重:如果句子中的两个单词彼此相关,那么它们的单词向量将对齐。从而产生更高的注意力分数。对于彼此不相关的单词,单词向量将不会对齐,并且会产生较低的注意力分数。
因此,“牛奶”和“饮料”的嵌入将非常一致,并产生很高的注意力分数。对于“牛奶”和“猫”,它们会有所不同,产生稍低的分数;而对于“牛奶”和“黑色”,它们会有很大不同,产生较低的分数。
这就是注意力模块背后的原理。
总结——是什么让 Transformer 运转起来?
查询Q和键K之间的点积计算每对单词之间的相关性。然后将该相关性用作“因子”来计算所有值V的加权和。该加权和作为注意力分数输出。
Transformer 学习嵌入等,从而使彼此相关的单词更加对齐。
这是引入三个线性层并为查询、键和值创建三个版本的输入序列的原因之一。这为注意力模块提供了更多参数,它可以学习这些参数来调整词向量的创建。
Transformer 中的编码器自注意力
Transformer 中使用了 Attention 在三个地方:
- 编码器中的自注意力——源序列关注自身
- 解码器中的自注意力——目标序列关注自身
- Decoder 中的 Encoder-Decoder-attention — 目标序列关注源序列
在编码器自注意力中,我们计算源句子中每个单词与源句子中每个其他单词的相关性。这种情况发生在堆栈中的所有编码器中。
Transformer 中的解码器自注意力
我们刚刚在编码器自注意力中看到的大部分内容也适用于解码器中的注意力,但有一些微小但显着的差异。
解码器中的注意力:
在解码器自注意力中,我们计算目标句子中每个单词与目标句子中每个其他单词的相关性。
Transformer 中的编码器-解码器注意力
在Encoder-Decoder Attention中,Query是从目标句子中获取的,Key/Value是从源句子中获取的。因此,它计算目标句子中每个单词与源句子中每个单词的相关性
编码器-解码器注意力:
结论
希望这能让您更好地感受到 Transformer 设计的优雅。另请阅读我的系列中的其他 Transformer 文章,以深入了解为什么 Transformer 现在已成为如此多深度学习应用程序的首选架构。
出自:
https://towardsdatascience.com/transformers-explained-visually-not-just-how-but-why-they-work-so-well-d840bd61a9d3
更多推荐
所有评论(0)