Transformer 中的mask

简单聊聊transformer里的mask ——转载自链接一

1.padding mask

在encoder和decoder两个模块里都有padding mask,位置是在softmax之前,为什么要使用padding mask,是因为由于encoder和decoder两个模块都会有各自相应的输入,但是输入的句子长度是不一样的,计算attention score会出现偏差,为了保证句子的长度一样所以需要进行填充但是用0填充的位置的信息是完全没有意义的(多余的),经过softmax操作也会有对应的输出,会影响全局概率值,因此我们希望这个位置不参与后期的反向传播过程。以此避免最后影响模型自身的效果,既在训练时将补全的位置给Mask掉,也就是在这些位置上补一些无穷小(负无穷)的值,经过softmax操作,这些值就成了0,就不在影响全局概率的预测。

pytorch nn.Transformer的mask理解 - 知乎 (zhihu.com) //padding mask 讲得比较细

2.Sequence MASK

sequence MASK是只存在decoder的第一个mutil_head_self_attention里,为什么这样做?是因为在测试验证阶段,模型并不知道当前时刻的输入和未来时刻的单词信息。也就是对于一个序列中的第i个token解码的时候只能够依靠i时刻之前(包括i)的的输出,而不能依赖于i时刻之后的输出。因此我们要采取一个遮盖的方法(Mask)使得其在计算self-attention的时候只用i个时刻之前的token进行计算

举例:“我爱中国共产党”,假如要预测“中”这个词,那么当前时刻的输入就是“我”以及“爱”的输入的叠加,一部分来自"我“的信息输出,一部分来自”爱”的信息输出,如果没有mask将后面的单词信息遮住,那么后面的单词对要预测的这个字“中”也会有相应的信息贡献,在训练的时候整个句子的前后字词的位置是已知的,所以不遮挡模型也是可以运行的,因为本身模型输入时就已经知道了句子的整个信息(也就是ground truth embeding)。 但是在进行模型预测(测试新的输入句子)时,输入的句子是未知的,随机的,模型不知道句子的信息,只能通过上一层的输出和原始的输入知道要预测字的前一个信息,进而依次预测后面的字的信息。这就造成了在训练时模型多训练了“中”后面的词,增加了训练时间,消耗了本没必要的空间及时间。在一开始训练时就mask掉,节省时间的同时也降低了过拟合的风险,提高了模型泛化能力。浅析Transformer训练时并行问题 - 知乎 (zhihu.com)

 //Sequence mask 讲得比较细

【Pytorch】Transformer中的mask ——转载自链接三

简单层面讲了TransformerDecoder进行并行

(165条消息) Transformer decoder中masked attention的理解_寺里LZS的博客-CSDN博客 

参考资料

简单聊聊transformer里的mask - 知乎 (zhihu.com)//大白话,讲的很好

(167条消息) Transformer 中的mask_Caleb_L的博客-CSDN博客_transformer中的mask

【Pytorch】Transformer中的mask - 知乎 (zhihu.com) //结合Pytorch代码解释,梳理一下Pytorch实现的Transformer是如何做mask操作的。

这个视频与这篇博客配套使用,讲的很清楚了

全网最详细Transformer中的mask操作及代码详解【推荐】【系列10-4-2】_哔哩哔哩_bilibili

transformer 中的 mask 操作-范仁义-读书编程笔记 (fanrenyi.com)//需要科学上网maybe

发表回复