通常在训练NLP模型时,batch中的句子长度不相等,这个时候会对没有达到规定长度的句子会进行pad操作(一般用0进行pad),如下图所示(绿色是进行pad的部分):

但是PAD会引起以下几个问题。
如上图所示,对于矩阵:
对a进行mean-pooling:
进行pad之后:
对pad_a进行mean-pooling:
mean\_pad\_a=\frac{3+7+11+2+1+8+5}{10}=3.7
对比mean_a和mean_pad_a发现:pad操作影响mean-pooling。

如上图所示,矩阵b=[-1, -3, -9, -11, -7, -2, -8],pad之后的矩阵mean\_b=[-1, -3, -9, -11, -7, -2, -8, 0, 0, 0]。
分别对其进行max-pooling:
max\_b = -1
max\_pad\_b=0
对比max_a和max_pad_a发现:pad操作影响max-pooling。
attention技术是目前NLP任务的必备选项,在attention的计算中通常最后一步是使用softmax进行归一化操作,将数值转换为概率。但是如果直接对pad之后的向量进行softmax操作,那么pad的部分也会分摊一部分概率,这就导致有意义的部分(非pad部分)的概率之和不等于1。
mask是相对于pad而产生的技术,具备告诉模型一个向量有多长的功效。mask矩阵有如下特点:
mask矩阵是与pad之后的矩阵具有相同的shape;mask矩阵只有1和0两个值,如果值为1表示对应的pad矩阵中该位置有意义,如果值为0表示对应的pad矩阵中该位置无意义。在第1部分中的两个向量的mask矩阵(m=[1,1,1,1,1,1,1,0,0,0])如下图所示:

mean\_a=\frac{sum(pad\_a \cdot m)}{sum(m)}
在进行max_pooling时,只需要将pad的部分的值足够小即可,可以将mask矩阵中值为0的位置替换的足够小(如:10^{-10}),则不会影响max_pooling计算。
max\_b=max(pad\_b-(1-m) \times 10^{10})
该问题的解决方式跟max_pooling一样,就是将pad的部分足够小,使得e^x的值非常接近于0,以至于可以忽略。
softmax(x)=softmax(x-(1-m) \times 10^{10})
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。