尝试回答一下。
下图截取自Transformer原论文对Attention应用的说明:
decoder层有2个应用了attention的地方。
一个是self-attention层,其中的q,k,v都来自decoder内部的计算;
另一个是encoder-decoder attention层,该层的k和v,来自encoder的输出。
注意红线部分,这里作者用的是come from,也就是说encoder的输出并不直接是k和v,而是通过某种转换得到了一组k和v,而这种转换应该和encoder以及decoder中的self-attention层中的k和v的计算方式是一样的,只不过计算时使用的embedding用的是最后一层encoder的输出。
下面来说mask attention,其实就是上图中的第三个attention的应用。mask attention是decoder的self-attention层使用的,也是decoder和encoder的self-attention层唯一不同的地方。作者说:”我们为了保护decoder的auto-regressive 属性,需要通过mask的方式来阻止decoder中左向的信息流“。我们知道auto-regressive的基本思想是下一个观测值约等于前n个观测值的某种线性加权和。所以后n个值(这里对应上面提到的左向信息流)是没有意义的,所以作者通过mask的方式,将后n个值,也就是decoder中self-attention层的scaled dot-product 阶段的当前处理词的后面位置的词的scaled dot-product结果都设置成负无穷。