1.masked multi-head attention用来干什么?作用是啥?
一句话,需要mask掩码来实现并行训练。
2. 那并行化有什么用?
可以用来加速模型的训练过程。
举个栗子。
假设我们要训练一个翻译模型,将英文"I love you"翻译成德文"Ich liebe dich"。编码器以并行模式工作 - 它可以在恒定数量的步骤内生成输入序列("I love you")的向量表示(步骤的数量不取决于输入序列的长度)。
假设编码器生成了向量表示为11、12、13(分别代表I love you,实际上,这些向量会更长,因为我们忽略了其它标记,如-序列的开始、-序列的结束等),但为简单起见,我们使用了短向量。
在训练期间,我们知道I love you翻译成德语,应该是"Ich liebe dich"(在训练期间我们总是知道期望的输出,也就是监督学习)。假设"Ich liebe dich"这些词的向量表示是21、22、23。
I love you
11、12、13
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个操作(通常情况下,每个输入需要执行一个操作)。此外,每次迭代都会有累积误差。
此外,我们不使用注意力机制,因为我们只关注单个先前的输出。
由于我们实际上知道期望的输出(是21、22、23),所以我们可以调整这个过程,直接并行化操作输入。而不用等待前一步的输出。
并行操作 #A. 输入:11, 12, 13。尝试预测21。
并行操作 #B. 输入:11, 12, 13,以及21。尝试预测22。
并行操作 #C. 输入:11, 12, 13,以及21, 22。尝试预测23。
这个算法可以并行执行,而且不会累积误差。这个算法使用了注意力机制(即查看所有先前的输入),因此在进行预测时可以考虑上下文的更多信息。
这就是我们需要掩码的地方。训练算法知道整个期望的输出(21, 22, 23)。它为每个并行操作隐藏(掩码)已知输出序列的一部分。
当执行 #A 时,它会隐藏(掩码)整个输出。
当执行 #B 时,它会隐藏第2和第3个输出。
当执行 #C 时,它会隐藏第3个输出。
掩码本身是通过以下方式实现的(来自原始论文):
我们通过在softmax的输入中屏蔽(设置为-∞)与非法连接对应的所有值来在缩放的点积注意力中实现这一点。
注意:在推理过程中(而不是训练中),解码器以顺序(而不是并行)模式工作,因为它最初不知道输出序列。但这与RNN方法不同,因为Transformer推理仍然使用自注意力并查看所有先前的输出(而不仅仅是最近的一个)。
注意2:对于非翻译应用,掩码可以有不同的用法。例如,对于语言建模,掩码可以用于隐藏输入句子中的某些单词,模型将在训练期间使用