共计 4459 个字符,预计需要花费 12 分钟才能阅读完成。
在钻研自注意力时,有很多的名词须要咱们着重的关注,比方填充掩码,前瞻掩码等等,但网上没有太多注意力掩码的教程和它是如何工作的信息,另外还有以下的细节须要具体的解释:
- 为什么要对多个层利用注意力掩码?、
- 为什么不沿键和查问利用注意力掩码?
- 键、查问和值权重是否混同了原始矩阵的序列程序?
所以本篇文章将通过写出矩阵来查看这些问题的细节。这样能够对掩码的工作原理有更好的理解。除此以外还能够连贯到线性层是如何跨二维工作的,这样能够解决下面第三点的疑难。
问题定义
让咱们从一个有 4 个单词的矩阵 X 开始。当这些词被转换成它们的令牌嵌入,每个令牌的嵌入大小将是 3 个值。例如上面是咱们的句子:
“a b c D”
当初让咱们把这些词变成令牌。
向量 a b c D 各有 3 个重量,这个序列实质上是由 4 个令牌符号组成的。每个令牌是 3 个值的向量。咱们把这些符号变成一个矩阵 X。
X 是由向量 a、b、c 和 D 组成的 4 × 3 矩阵这是咱们想要用自注意力来转化的矩阵。
注意力计算前的筹备
为了筹备计算注意力,咱们必须首先应用加权矩阵生成键 K、查问 Q 和值 V。对于这个句子,咱们想把它转换成一个 4 * 2 矩阵。所以每个权重矩阵的形态都是 3 或 2。例如上面是 Q 的权值矩阵 QW。
将 X 矩阵转换为 Q(查问) 矩阵的权重,上面是利用 QW 矩阵能够失去查问矩阵 Q。
计算的过程如下
当初咱们有了 Q 的示意。注意力后果矩阵中的每个向量不是所有其余令牌的线性组合。而每个向量都是其本身和一些权重的线性组合。第一个向量只是 a 的线性组合。第二个只是 b 的线性组合。这种转换不会弄乱矩阵内的序列程序。a 依然在矩阵的顶部,而 D 依然在矩阵的底部。对于将来的操作,我将应用最左边的矩阵来示意 Q,这样轻松地可视化 a、b、c 和 D 的向量,并且也能够阐明这些向量是没有被转换为彼此相结合的某种组合。
对于 K 和 V 也是相似的,所以咱们失去了从 X 矩阵和相应矩阵权重计算的 K,Q,V
当初咱们来计算这个序列的注意力。
QKᵀ矩阵
最原始的自注意力是用上面的公式来定义的
为了更容易地可视化产生了什么,我将删除 dₖ常数。《The Attention is All You Need》的作者申明,应用标量 dₖ是因为“咱们狐疑对于 dₖ的大值,点积的量级变大,将 softmax 函数推到具备十分小的梯度的区域“。所以 dₖ只是一个帮忙数值量级转换的标量,所以在本文中不必不关怀它,那么能够应用上面的公式来代替,也就是把 dₖ删除了
然而本文中是探讨的掩码遮蔽,这时等式就有点不同了,我将在接下来的局部中解释。
首先 QKᵀ矩阵计算如下。
看很简单,然而这个其实是由 Q 和 K 转置相乘失去的矩阵,咱们能够把它化简成向量积的模式。并且令牌行和列,这样以帮忙可视化矩阵示意的内容。
这样是不是就好很多了,每个值基本上都乘以另一个值,包含矩阵中的本人。这个值示意当将 V 利用到这个矩阵时 V 中的每个重量将失去多少权重。
不带掩码的注意力
在学习如何掩码注意力之前,咱们首先须要查看没有掩码的注意力是如何工作的。
计算序列注意力的下一步是对 QKᵀ矩阵利用 softmax 函数。那么就呈现了一个问题,softmax 应该利用在什么维度上? 在论文提出的自注意力中,softmax 函数利用于每一行。
在没有掩码的状况下,softmax 函数只是一个归一化函数。所以为了缩小可视化的复杂度,咱们能够不在这个矩阵中示意它。
当初只剩下最初一步了,将 QKᵀ矩阵乘以 V 矩阵。QKᵀ矩阵与 V 矩阵乘积就失去了子注意力计算的后果。
矩阵中的每个编码是 QKᵀ矩阵中的值和权重的线性组合。实际上失去的矩阵中的每一行都是 QKᵀ矩阵中的相应行和 V 矩阵中的相应列的线性组合。不带掩码的注意力模块的输入能够了解为让每个令牌留神所有其余令牌。这意味着每一个令牌对所有其余令牌都有影响。
对失去的矩阵也从新格式化一下:
QKᵀ矩阵与 V 矩阵乘积的向量示意,注意力转换实质上产生了一组新的向量,序列中的每个单词对应一个向量。
注意力的填充掩码
在应用填充掩码(padding mask)计算注意力之前,咱们须要将掩码 M 增加到等式中:
咱们曾经有了 QKᵀ和 V,然而 M 是什么样的呢? 咱们的序列是
” a b c D “
用一个更理论的例子替换这些任意:
I like coffee <PAD>
留神这里有一个 PAD 令牌。这个令牌呈现的起因是,句子的长度是变动的而矩阵并不能解决不同的大小。所以为了把很多句子放在一起作为一批解决,能够在较短句子中增加令牌,使所有句子的长度雷同。
然而应用 PAD 令牌的一个问题是 PAD 成为句子中最频繁呈现的局部。而训练时模型会留神到这一点,并谬误的认为 PAD 是句子的根底,这样就会产生很多问题。
为了避免模型对 PAD 令牌进行建模,咱们能够通过找到 QKᵀ 矩阵中 PAD 地位并进行屏蔽的办法来实现。如上例所示,D 是一个 PAD 令牌,如果咱们想要屏蔽它则须要应用与 QKᵀ 具备雷同维度的掩码,并在示意在要掩码的列上应用 -∞。M 矩阵将如下所示:
填充掩码的矩阵示意中 Dᴷ 列是被屏蔽的,但 DQ 行不是。下一步是将 M 增加到 QKᵀ
任何数值与 -∞ 相加后果都变为 -∞,所以后果列 Dᴷ 是 -∞ 列。那么当 softmax 利用于矩阵时会产生什么?
Softmax 后 Dᴷ都是 0,基本上不会影响权重矩阵中其余值的权重。这里的 D 不是其余行的一部分,而是仅在其本人的 DQ 行中。这里咱们不会放心非∞ 值的 softmax,因为该函数只是起到归一化的作用。最初让咱们看看将权重矩阵乘以 V 矩阵时失去的矩阵的样子。
通过将屏蔽 QKᵀ矩阵与 V 矩阵相乘失去最终的自注意力后果,让咱们认真看看最终的矩阵。
后果矩阵中的每一行如何没有 Dᴷ 重量。所以 D 对任何其余元素都没有影响,这意味着任何 PAD 令牌(这里的 D)对序列的其余部分都没有影响。这就是应用对填充进行掩码的起因:不心愿它影响序列中的任何其余令牌。
那么 DQ 呢,它依然存在并且没有被遮蔽掉。这是因为如果 DQ 被屏蔽了,矩阵中的 DQ 向量将在利用 softmax 变换后产生一个均匀值的向量,也就是说 DQ 将失落它之前领有的所有信息。而咱们进行掩码遮蔽的目标不是齐全去除 D 的所有信息而是让它不影响其余令牌。所以在后果矩阵中依然须要对于 D 的信息,也就是说咱们要通知模型的是那里有一个 PAD 令牌,咱们只心愿 PAD 令牌不与其余的令牌令牌产生影响,然而 PAD 令牌的地位和信息模型还是要晓得的。
那么如果同时屏蔽了 DQ 和 Dᴷ,生成的矩阵将如下所示:
填充掩码同时笼罩 DQ 和 Dᴷ时的后果能够看到,因为 DQ 和 Dᴷ 是常数,因而它们不会对后果减少太多。然而矩阵最初一部分的后果向量只是 V 的 1/4 加权重量的组合。这会导致 D 失落其本身的所有信息,这也意味着后果向量中 D 的新示意将是 D 的的一个蹩脚的示意形式。
注意力的前瞻掩码
Look-ahead mask(前瞻掩码)最后来自 Attention is All You Need 的论文。应用前瞻掩码的目标是一次在整个文本序列上训练模型而不是一次训练一个单词。原始的 Transformer 模型就是所谓的自回归模型,它仅应用过来的数据进行预测。因为最后的 Transformer 是为翻译而制作的,所以这种类型的模型是有意义的。在预测翻译后的句子时,模型会一次预测一个单词。比方:
“How are you”
该模型一次将句子翻译成西班牙语:
预测 1:给定“”,模型预测下一个词是“cómo”
预测 2:给定“cómo”,模型预测下一个词是“estás”
预测 3:给定“cómo estás”,模型预测下一个词是“<END>”,示意序列的完结
如果想让模型学习这种翻译怎么办?如果一次输出一个词,则须要输出三次并且做三次的预测,这个过程十分迟缓,因为它须要模型的 S(序列长度)个预测能力从模型中取得单句翻译。然而如果将整个句子“cómo estás <END> …”提供给它,并应用奇妙的掩码技巧,让模型就不能向前看到将来的令牌,只能看到过来的令牌。这样,只须要一个推理步骤就能从模型中取得整个句子的翻译。这就是 Look-ahead mask 的由来,所以咱们这里将他翻译为前瞻掩码。
应用前瞻掩码进行自注意力的公式与填充掩码雷同。惟一的变动与掩码无关。
前瞻掩码的矩阵在右上角有一个三角形 -∞,在其余中央是 0。让咱们看看这如何影响权重矩阵的 softmax。
应用前瞻掩码的掩码查询键矩阵的 Softmax 时,权重矩阵会失去一些乏味的后果。第一行 aQ 仅由本身 aᴷ 加权。因为 a 是序列中的第一个令牌,因而它不应受到序列中任何其余令牌的影响,没有不存在其余令牌。
在第二行,b 同时受到 a 和 b 的影响。因为 b 是第二个令牌,它应该只受第一个令牌 a 的影响。
同理在最初一行中,序列中的最初一个令牌 D 受到所有其余令牌的影响,因为它是序列中的最初一个令牌,应该具备序列中所有其余令牌的上下文。
让咱们看看掩码如何影响注意力函数的输入。
应用前瞻掩码时自注意力的最终后果,与权重矩阵相似,后果向量仅受该向量中示意的令牌之前的令牌的影响。a 的新令牌嵌入在后果向量的第一行。因为这个令牌只有它本人的上下文,它只会是它本人的组合。
第二个令牌 b 具备 a 的上下文,因而后果向量是 a 和 b 的组合。
最初一个令牌 D 具备所有其余令牌的上下文,因而后果向量是所有其余令牌的组合。
矩阵后果比照
为了可视化生成的矩阵有何不同,我将他们放在一起,下图是应用 no mask、padding mask 和 look-ahead mask 时的 self-attention 函数的最终后果
在多层中应用掩码
最初一点要阐明的是为什么要在多层中应用雷同的掩码。如果你认真看了矩阵就会发现。
首先注意力函数时能够总结为从矩阵 X 到矩阵 a 的一个繁多变换。
矩阵间的自注意力变换
向量的向量之间的自注意力变换
下面曾经讲过了,自注意力转换保留了每个向量的上下文。输入序列只是输出序列的模式变换。
假如咱们想要屏蔽所有 PAD 令牌,并且咱们认为下面问题定义中的 D 是一个 PAD 令牌。那么输入 Dᴬ 依然是一个 PAD 令牌,只是这个令牌曾经被示意为一个转换后的嵌入了。所以任何正在进行的自注意力都须要一个掩码来确保 PAD 令牌不会影响任何其余令牌。
咱们甚至能够把一个 transformer 设想成一系列的 self-attention 函数。线性层和归一化层不会弄乱令牌之间的序列关系,所以在本例中能够忽略不计。
向量的向量之间的多重自注意力转换,因为保留了自注意力层之间的序列,每个自注意力函数都须要应用雷同的掩码。在填充掩码的例子中,如果 掩码只用在第一个自注意力层上,那么序列将不受第一个自注意力层中的 PAD 令牌的影响。而在所有其余层中因为短少掩码序列将会受到 PAD 令牌的影响,这样就会产生蹩脚的后果。
总结
注意力掩码实质上是一种阻止模型看咱们不想让它看的信息的办法。这不是一种非常复杂的办法,然而它却十分无效。我心愿这篇文章能让你更好地了解掩码在自注意力中的作用,心愿以上的矩阵计算是正确的,如果有谬误,欢送指出。
https://avoid.overfit.cn/post/1042640faa8249da92e405db1cbc3738
作者:Gabriel Mongaras