1.Decoder
其实从图中是可以看出来,decoder 的结构和 encoder 结构基本类似,其中的 sublayer 基本一样,无非就是多了一个 masked-multi-head-attention 结构。当然它依然遵循 multi-head-attention的基本原则。所以同样地,我们先来讲解 decoder 中的sublayer。
1.1 Masked-Multi-Head-Attention
Masked 是什么意思呢,从名字上可以看出来是 ”掩盖“ 的意思,其实归根结底就是一个意思,我们在做推理的时候,例如需要翻译 ‘I have a cat’ 也就是翻译 I 的时候,我们需要掩盖 I 之后的内容。翻译 have 的时候,需要掩盖 have 后面的内容。也就是我们希望目前时刻是看不到未来时刻的输入。
我在一篇博文中看到一个比较好的解释,放到这。
‘Masked 操作是为了避免解码器在训练的时候看到当前时刻看到以后时间的信息。对于t时刻的query,应该只看到key(1), key(2),...key(t-1)的数据,因为key(t)在当前时刻还不存在。Masked的作用是使对应value的权值为0,对于query(t)和未来时刻的key的内积,赋值为负无穷大(-inf),这样使用softmax计算权值为0,所以计算output的时候只用到了t-1以前时刻的key-value pair的信息。保证了训练时和预测时的情况是一样的。’
回到论文原文:
“ Similarly, self-attention layers in the decoder allow each position in the decoder to attend to
all positions in the decoder up to and including that position. We need to prevent leftward
information flow in the decoder to preserve the auto-regressive property. We implement this
inside of scaled dot-product attention by masking out (setting to −∞) all values in the input
of the softmax which correspond to illegal connections. ”
文中的意思是我们需要避免解码器中的左向信息流,关于如何避免左倾信息流。由于解码器是用于生成文本的,它需要按照文本的顺序逐个生成单词。因此,解码器中的信息流应该是从右向左的,即下一个单词依赖于前面的单词。如果允许左向信息流,就会破坏这种顺序,导致生成错误的文本。因此,我们需要阻止解码器中的左向信息流,以保持其自动回归属性。
其实和上面的解释是一样的就是为了在翻译的过程中翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。
上图就是我自己画的 decoder 的流程,我们将输入矩阵先正常 QK 操作,然后接下来我们需要乘以 mask 后的输入矩阵,然后在进行 V 操作这样也就获得了 Masked - Multi - Head - Attention的输出,然后通过 Add - Norm 。再将 encoder 的输出交给正常的多头注意力即可。
也就是原始图的这部分
然后其实讲完这里,decoder基本就讲完了,剩下的上一篇基本都讲过。
其实回看 Transformer ,确实是非常具有创新点,不管是 position embedding 的操作,还是非常牛逼的 self - attention ,都是非常让人惊叹的操作。我想说 DL 领域的论文都应该是这样的创新,而不是用一个模型去做一个任务,然后讲一个故事就完了。最近我一直了解经典的模型,从LeNet到 ResNet ,每一次我看完确实是做出了非常牛逼的创新,所以他们才能成为这个领域的 base 。希望自己以后做出有意义的科研。
就写到这,有错请指正。如果你也感兴趣,一起讨论。
参考:
https://arxiv.org/abs/1706.03762
【精选】层层剖析,让你彻底搞懂Self-Attention、MultiHead-Attention和Masked-Attention的机制和原理_masked self-attention-CSDN博客
Transformer模型详解(图解最完整版) - 知乎