Transformer中的MASK主要分为两部分:Padding Mask和Sequence Mask两部分
对于Transformer而言,每次的输入为:[batch_size,seq_length,d_module]结构,由于句子一般是长短不一的,而输入的数据需要是固定的格式,所以要对句子进行处理。
通常会把每个句子按照最大长度进行补齐,所以当句子不够长时,需要进行补0操作,以保证输入数据结构的完整性
但是在计算注意力机制时的Softmax函数时,就会出现问题,Padding数值为0的话,仍然会影响到Softmax的计算结果,即无效数据参加了运算。
为了不让Padding数据产生影响,通常会将Padding数据变为负无穷,这样的话就不会影响Softmax函数了
Self-Attention Masked只发生在Decoder操作中,在Decoder中,我们的预测是一个一个进行的,即输入一个token,输出下一个token,在网上看到一个很好的解释如下:
假设我们当前在进行机器翻译
输入:我很好
输出:I am fine
接下来是Decoder执行步骤
第一步:
·初始输入: 起始符 + Positional Encoding(位置编码)
·中间输入:(我很好)Encoder Embedding
·最终输出:产生预测“I”
第二步:
·初始输入:起始符 + “I”+ Positonal Encoding
·中间输入:(我很好)Encoder Embedding
·最终输出:产生预测“am”
第三步:
·初始输入:起始符 + “I”+ “am”+ Positonal Encoding
·中间输入:(我很好)Encoder Embedding
·最终输出:产生预测“fine”
上面就是Decoder的执行过程,在预测出“I”之前,我们是不可能知道‘am’的,所以要将数进行Mask,防止看到当前值后面的值,如下图所示:当我们仅知道start的时候,后面的关系是不知道的,所以start和“I”以及其它单词的Score都为负无穷,当预测出“I”之后,再去预测“am”,最终得到下面第三个得分矩阵。
最后经过Softmax处理之后,得到最终的得分矩阵
最后不要忘了Decoder中依然采用的是Masked Multi-Head Attention,即多次进行Mask机制