网站怎么做域名实名认证吗,微信应用开发公司,关键对话,wordpress 4.0 伪静态输入序列如何到达Attention模块
注意力模块存在于编码器堆栈中的每个编码器中#xff0c;以及解码器堆栈中的每个解码器中。我们将首先放大编码器的注意力。
Attention in the Encoder#xff1a;
举个例子#xff0c;假设我们正在研究一个英语到西班牙语的翻译问题以及解码器堆栈中的每个解码器中。我们将首先放大编码器的注意力。
Attention in the Encoder
举个例子假设我们正在研究一个英语到西班牙语的翻译问题其中一个示例源序列是“球是蓝色的”。目标序列是“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