关于mask层

  • 2020 年 12 月 23 日
  • AI

看attention的时候很多例子都是基于nlp的,而nlp中常常会用到mask的概念,这里总结一下。

“让Keras更酷一些!”:层中层与mask – 科学空间|Scientific Spacesspaces.ac.cn

下文摘自上述的文章:

虽说RNN可以处理不定长的序列,因为句子的长短常常是不一的,但是真正应用到工程层面,我们还是需要使用padding进行补0使得所有的input都保持一样的长度。

这里用简单的向量来描述padding的原理。假设有一个长度为5的向量:

经过padding变成长度为8:

当你将这个长度为8的向量输入到模型中时,模型并不知道你这个向量究竟是“长度为8的向量”还是“长度为5的向量,填充了3个无意义的0”。为了表示出哪些是有意义的,哪些是padding的,我们还需要一个mask向量(矩阵):

这是一个0/1向量(矩阵),用1表示有意义的部分,用0表示无意义的padding部分。

所谓mask,就是x和m的运算,来排除padding带来的效应。比如我们要求x的均值,本来期望的结果是:

但是由于向量已经经过padding,直接算的话就得到:

会带来偏差。更严重的是,对于同一个输入,每次padding的零的数目可能是不固定的,因此同一个样本每次可能得到不同的均值,这是很不合理的。有了mask向量m之后,我们可以重写求均值的运算:

这里的⊗是逐位对应相乘的意思。这样一来,分子只对非padding部分求和,分母则是对非padding部分计数,不管你padding多少个零,最终算出来的结果都是一样的。

如果要求xx的最大值呢?我们有max([1,0,3,4,5])=max([1,0,3,4,5,0,0,0])=5,似乎不用排除padding效应了?在这个例子中是这样,但还有可能是:

经过padding后变成了

如果直接对padding后的x求max,那么得到的是0,而0不在原来的范围内。这时候解决的方法是:让padding部分足够小,以至于max(几乎)不可能取到padding部分,比如

正常来说,神经网络的输入输出的数量级不会很大,所以经过x−(1−m)×10**10后,padding部分在−10**10这个数量级中,可以保证取max的话不会取到padding部分了。

处理softmax的padding也是如此。在Attention或者指针网络时,我们就有可能遇到对变长的向量做softmax,如果直接对padding后的向量做softmax,那么padding部分也会平摊一部分概率,导致实际有意义的部分概率之和都不等于1了。解决办法跟max时一样,让padding部分足够小足够小,使得e**x足够接近于0,以至于可以忽略:

上面几个算子的mask处理算是比较特殊的,其余运算的mask处理(除了双向RNN),基本上只需要输出

x⊗m

就行了,也就是让padding部分保持为0。