阅读Transformer paper 后,我也有同样的问题。我在互联网上没有找到该问题的完整详细答案,所以我将尝试解释我对 Masked Multi-Head Attention 的理解。
简短的回答是——我们需要掩蔽来使训练并行。并且并行化很好,因为它可以让模型训练得更快。
这是一个解释这个想法的例子。假设我们训练将“我爱你”翻译成德语。编码器以并行模式工作 - 它可以在恒定步数内生成输入序列(“我爱你”)的矢量表示(即步数不取决于输入序列的长度)。
假设编码器生成数字11, 12, 13 作为输入序列的向量表示。实际上,这些向量会更长,但为简单起见,我们使用较短的向量。同样为简单起见,我们忽略了服务令牌,例如 - 序列的开头、 - 序列的结尾等。
在训练期间,我们知道翻译应该是“Ich liebe dich”(我们在训练期间总是知道预期的输出)。假设“Ich liebe dich”词的预期向量表示是21, 22, 23。
如果我们以顺序模式训练解码器,它看起来就像是循环神经网络的训练。将执行以下顺序步骤:
- 顺序操作 #1。输入:
11, 12, 13。
- 试图预测
21。
- 预测的输出不会完全是
21,假设是21.1。
- 顺序操作 #2。输入:
11, 12, 13,还有 21.1 作为之前的输出。
- 试图预测
22。
- 预测的输出不会完全是
22,假设是22.3。
- 顺序操作 #3。输入
11, 12, 13,也输入22.3作为前一个输出。
- 试图预测
23。
- 预测的输出不会完全是
23,假设是23.5。
这意味着我们需要进行 3 个顺序操作(一般情况下 - 每个输入一个顺序操作)。此外,我们将在每次下一次迭代中累积错误。此外,我们不使用注意力,因为我们只查看单个先前的输出。
由于我们实际上知道预期的输出,我们可以调整流程并使其并行。无需等待上一步输出。
- 并行操作#A。输入:
11, 12, 13。
- 并行操作#B。输入:
11, 12, 13,还有21。
- 并行操作#C。输入:
11, 12, 13,还有21, 22。
该算法可以并行执行,也不会累积错误。该算法使用注意力(即查看所有先前的输入),因此在进行预测时需要考虑更多有关上下文的信息。
这里是我们需要掩蔽的地方。训练算法知道整个预期输出 (21, 22, 23)。它为每个并行操作隐藏(屏蔽)这个已知输出序列的一部分。
- 当它执行 #A - 它隐藏(屏蔽)整个输出。
- 当它执行 #B 时 - 它会隐藏第 2 和第 3 输出。
- 当它执行 #C - 它隐藏第三个输出。
屏蔽本身的实现如下(来自original paper):
我们通过屏蔽在缩放的点积注意力中实现这一点
输出(设置为 -∞)softmax 输入中的所有值
对应非法连接
注意:在推理(非训练)期间,解码器以顺序(非并行)模式工作,因为它最初不知道输出序列。但它与 RNN 方法不同,因为 Transformer 推理仍然使用自我注意并查看所有先前的输出(但不仅仅是前一个)。
注意 2:我在某些材料中看到,掩蔽可用于非翻译应用的不同方式。例如,对于语言建模,掩码可用于从输入句子中隐藏一些单词,并且模型将在训练期间尝试使用其他非掩码单词(即学习理解上下文)来预测它们。