NiuTrans/MTBook

Transformer mask

lidongxing opened this issue · 3 comments

能否用矩阵的形式详细说明几种mask:encoder input padding mask,encoder self-attention mask,
decoder input padding mask, decoder masked self-attention mask, encoder-decoder attention mask 谢谢。
例如:zh-en
zh: 我 喜欢 深度学习 。
en: I love deep learning .
token emdding dim: 256

1:encoder input embedding(token embedding+positional embedding) shape: [6,256]
2:encoder input padding mask:[[1][1][1][1][0][0]]

1*2输入encoder layer
encoder self-attention mask:
[[0,0,0,0,-inf,-inf],[0,0,0,0,-inf,-inf],[0,0,0,0,-inf,-inf],[0,0,0,0,-inf,-inf],[-inf,-inf,-inf,-inf,-inf,-inf]]

3:decoder input embedding(token embedding+positional embedding) shape: [6,256]
4:decoder input padding mask:[[1][1][1][1][1][0]]

5:Future mask: [[1,0,0,0,0,0][1,1,0,0,0,0][1,1,1,0,0,0][1,1,1,1,0,0][1,1,1,1,1,0][1,1,1,1,1,1]]
decoder masked self-attention mask: 4 & 5 ????????????????????? 而不是简单的5
即:[[1,0,0,0,0,0][1,1,0,0,0,0][1,1,1,0,0,0][1,1,1,1,0,0][1,1,1,1,1,0][0,0,0,0,0,0]]
最后decoder masked self-attention mask+(-inf):
[[0,-inf,-inf,-inf,-inf,-inf][0,0,-inf,-inf,-inf,-inf][0,0,0,-inf,-inf,-inf][0,0,0,0,-inf,-inf][0,0,0,0,0,-inf][-inf,-inf,-inf,-inf,-inf,-inf]]

6: encoder decoder mask:[[1,1,1,1,0,0],[1,1,1,1,0,0],[1,1,1,1,0,0][1,1,1,1,0,0][1,1,1,1,0,0][0,0,0,0,0,0]]
然后encoder decoder mask+(-inf)=
[[0,0,0,0,-inf,-inf],[0,0,0,0,-inf,-inf],[0,0,0,0,-inf,-inf][0,0,0,0,-inf,-inf][0,0,0,0,-inf,-inf][-inf,-inf,-inf,-inf,-inf,-inf]]

zh: "我 喜欢 深度学习 。pad pad"
en: "I love deep learning . pad "

不同位置mask的作用不一样,不同的实现手段上也略有不同,encoder-input-mask的作用是明确batch中padding符号的位置,以你的例子为例则encoder-input-mask为[[0,0,0,0,1,1]],在encoder自注意力机制计算的过程中,通过encoder-input-mask生成encoder-self-attention-mask,[6*[0,0,0,0,-inf,-inf]],通过将其与注意力机制中QK的结果相加后,将padding位置的数值置为-inf,使其在进行softmax操作时,分配到的权重为0。解码端的自注意力机制上,一般来说不需要padding mask,只需要future mask即可[[0,-inf,-inf,-inf,-inf,-inf] [0,0,-inf,-inf,-inf,-inf] [0,0,0,-inf,-inf,-inf] [0,0,0,0,-inf,-inf] [0,0,0,0,0.-inf] [0,0,0,0,0,0]],encoder-decoder attention mask 同样根据encoder-input-mask生成,维度是[目标语长度[0,0,0,0,-inf,-inf]],encoder-decoder attention主要是计算目标语端词语对源语中词的注意力权重,因此需要将源语中padding符号的位置进行掩盖,避免分配权重,具体你可以看一些开源系统的实现,能帮助你理解。

tks