1. PAD的问题
通常在训练NLP模型时,batch中的句子长度不相等,这个时候会对没有达到规定长度的句子会进行pad
操作(一般用0
进行pad),如下图所示(绿色是进行pad的部分):
但是PAD会引起以下几个问题。
1.1 mean-pooling的问题
如上图所示,对于矩阵:
a
=
[
3
,
7
,
11
,
2
,
1
,
8
,
5
]
a = [3, 7, 11, 2, 1, 8, 5]
a=[3,7,11,2,1,8,5]
对a
进行mean-pooling
:
m
e
a
n
_
a
=
3
+
7
+
11
+
2
+
1
+
8
+
5
7
=
5.2857
mean\_a=\frac{3+7+11+2+1+8+5}{7}=5.2857
mean_a=73+7+11+2+1+8+5=5.2857
进行pad
之后:
p
a
d
_
a
=
[
3
,
7
,
11
,
2
,
1
,
8
,
5
,
0
,
0
,
0
]
pad\_a=[3, 7, 11, 2, 1, 8, 5, 0, 0, 0]
pad_a=[3,7,11,2,1,8,5,0,0,0]
对pad_a
进行mean-pooling
:
m
e
a
n
_
p
a
d
_
a
=
3
+
7
+
11
+
2
+
1
+
8
+
5
10
=
3.7
mean\_pad\_a=\frac{3+7+11+2+1+8+5}{10}=3.7
mean_pad_a=103+7+11+2+1+8+5=3.7
对比mean_a
和mean_pad_a
发现:pad
操作影响mean-pooling
。
1.2 max-pooling的问题
如上图所示,矩阵
b
=
[
−
1
,
−
3
,
−
9
,
−
11
,
−
7
,
−
2
,
−
8
]
b=[-1, -3, -9, -11, -7, -2, -8]
b=[−1,−3,−9,−11,−7,−2,−8],pad
之后的矩阵
m
e
a
n
_
b
=
[
−
1
,
−
3
,
−
9
,
−
11
,
−
7
,
−
2
,
−
8
,
0
,
0
,
0
]
mean\_b=[-1, -3, -9, -11, -7, -2, -8, 0, 0, 0]
mean_b=[−1,−3,−9,−11,−7,−2,−8,0,0,0]。
分别对其进行max-pooling
:
m
a
x
_
b
=
−
1
max\_b = -1
max_b=−1
m
a
x
_
p
a
d
_
b
=
0
max\_pad\_b=0
max_pad_b=0
对比max_a
和max_pad_a
发现:pad
操作影响max-pooling
。
1.3 attention的问题
attention
技术是目前NLP
任务的必备选项,在attention
的计算中通常最后一步是使用softmax
进行归一化操作,将数值转换为概率。但是如果直接对pad之后的向量进行softmax
操作,那么pad的部分也会分摊一部分概率,这就导致有意义的部分(非pad部分)的概率之和不等于1
。
2. mask
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
]
m=[1,1,1,1,1,1,1,0,0,0]
m=[1,1,1,1,1,1,1,0,0,0])如下图所示:
2.1 解决mean_pooling的问题
m e a n _ a = s u m ( p a d _ a ⋅ m ) s u m ( m ) mean\_a=\frac{sum(pad\_a \cdot m)}{sum(m)} mean_a=sum(m)sum(pad_a⋅m)
2.2 解决max_pooling的问题
在进行max_pooling
时,只需要将pad
的部分的值足够小即可,可以将mask
矩阵中值为0
的位置替换的足够小(如:
1
0
−
10
10^{-10}
10−10),则不会影响max_pooling
计算。
m
a
x
_
b
=
m
a
x
(
p
a
d
_
b
−
(
1
−
m
)
×
1
0
10
)
max\_b=max(pad\_b-(1-m) \times 10^{10})
max_b=max(pad_b−(1−m)×1010)
2.3 解决attention的问题
该问题的解决方式跟max_pooling
一样,就是将pad
的部分足够小,使得
e
x
e^x
ex的值非常接近于0
,以至于可以忽略。
s
o
f
t
m
a
x
(
x
)
=
s
o
f
t
m
a
x
(
x
−
(
1
−
m
)
×
1
0
10
)
softmax(x)=softmax(x-(1-m) \times 10^{10})
softmax(x)=softmax(x−(1−m)×1010)