Transformer的详细深入理解( 三 )


第一个block 的输入为句子单词的表示向量矩阵 , 后续block 的输入是前一个block 的输出 , 最后一个block 输出的矩阵就是编码信息矩阵 C , 这一矩阵后续会用到中 。
4.结构
上图红色部分为的block 结构 , 与block 相似 , 但是存在一些区别:
包含两个 Multi-Head层 。
4.4.1 第一个 Multi-Head
block 的第一个 Multi-Head采用了操作 , 因为在翻译的过程中是顺序翻译的 , 即翻译完第 i 个单词 , 才可以翻译第 i+1 个单词 。通过操作可以防止第 i 个单词知道 i+1 个单词之后的信息 。下面以 “我有一只猫” 翻译成 “I have a cat” 为例 , 了解一下操作 。
下面的描述中使用了类似的概念 , 在的时候 , 是需要根据之前的翻译 , 求解当前最有可能的翻译 , 如下图所示 。首先根据输入 “” 预测出第一个单词为 “I” , 然后根据输入 “ I” 预测下一个单词 “have” 。
可以在训练的过程中使用并且并行化训练 , 即将正确的单词序列 ( I have a cat) 和对应输出 (I have a cat ) 传递到。那么在预测第 i 个输出时 , 就要将第 i+1 之后的单词掩盖住 , 注意 Mask 操作是在 Self- 的之前使用的 , 下面用 0 1 2 3 4 5 分别表示 “ I have a cat ” 。
第一步:是的输入矩阵和 Mask 矩阵 , 输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量 , Mask 是一个 5×5 的矩阵 。在 Mask 可以发现单词 0 只能使用单词 0 的信息 , 而单词 1 可以使用单词 0, 1 的信息 , 即只能使用之前的信息 。
第二步:接下来的操作和之前的 Self- 一样 , 通过输入矩阵X计算得到Q,K,V矩阵 。然后计算Q和 KQ的转置乘积。
第三步:在得到其乘积之后需要进行  , 计算score , 我们在之前需要使用Mask矩阵遮挡住每一个单词之后的信息 , 遮挡操作如下:
得到 Mask [QKT] 之后在 Mask [QKT]上进行  , 每一行的和都为 1 。但是单词 0 在单词 1, 2, 3, 4 上的score 都为 0
第四步:使用 Mask [公式]与矩阵 V相乘 , 得到输出 Z , 则单词 1 的输出向量 [公式] 是只包含单词 1 信息的 。
第五步:通过上述步骤就可以得到一个 Mask Self- 的输出矩阵  , 然后和类似 , 通过 Multi-Head拼接多个输出 ,  然后计算得到第一个 Multi-Head的输出Z , Z与输入X维度一样 。
4.4.2 第二个 Multi-Head
block 第二个 Multi-Head变化不大 ,  主要的区别在于其中 Self- 的 K, V矩阵不是使用 上一个block 的输出计算的 , 而是使用的编码信息矩阵 C 计算的 。
根据的输出 C计算得到 K, V , 根据上一个block 的输出 Z 计算 Q (如果是第一个block 则使用输入矩阵 X 进行计算) , 后续的计算方法与之前描述的一致 。
这样做的好处是在的时候 , 每一位单词都可以利用到所有单词的信息 (这些信息无需 Mask) 。
4.4.3预测输出单词
block 最后的部分是利用预测下一个单词 , 在之前的网络层我们可以得到一个最终的输出 Z , 因为 Mask 的存在 , 使得单词 0 的输出 Z0 只包含单词 0 的信息 , 如下:
根据输出矩阵的每一行预测下一个单词
这就是block 的定义 , 与一样 ,  是由多个block 组合而成 。
五、总结
与 RNN 不同 , 可以比较好地并行训练 。
本身是不能利用单词的顺序信息的 , 因此需要在输入中添加位置  , 否则就是一个词袋模型了 。