- NLP问题中,位置的相关信息是非常重要的信息、
- 如在RNN中,就能自然的处理出位置的相关信息
- 但是在transformer模型中,由于self-attention的方法,会导致位置信息的丢失
最简单的形式
P E ( p o s i t i o n e m b e d d i n g ) = p o s = 0 , 1 , 2 , . . . , T − 1 PE(position embedding)=pos=0,1,2,...,T-1 PE(positionembedding)=pos=0,1,2,...,T−1
- 缺点:这样处理,在文本长的时候,PE的值会很大,影响了原来word embedding 的向量空间
归一化
P E = p o s T − 1 PE=\frac{pos}{T-1} PE=T−1pos
- 这样所有的位置编码都会落在[0,1]之间
- 缺点: 不过,这样不同文本长度的位置编码步长是不相同的,我们最关心的就是相对次序的关系
Attention is All You Need
- 1、 要提现同一单词在不同位置的区别
- 2、要体现一定的先后次序关系,并且一定范围内的编码差异不依赖文本长度,具有一定不变性,且又要落在一定范围内
所以,有界的周期性函数能满足
简单构造为
P
E
(
p
o
s
)
=
s
i
n
(
p
o
s
α
)
PE(pos)=sin({pos\over \alpha})
PE(pos)=sin(αpos),这样可以通过调节
α
\alpha
α来反应一定的区间内的相对编码信息。
α
\alpha
α较大的时候,波长比较长,相邻字之间的位置编码之间的差异比较小。
- 不过这样在
α
\alpha
α较大的时候,相邻字符之间的位置差异提现的不明显;在
α
\alpha
α较小的时候在长文本的时候会有问题。
我们假设字嵌入的维度是 d m o d e l d_{model} dmodel,所以也要用一个维度相同的向量来表示位置编码向量—— [ − 1 , 1 ] d m o d e l [-1,1]^{d_{model}} [−1,1]dmodel
所以构造为
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
1000
0
2
i
d
m
o
d
e
l
)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
1000
0
2
i
d
m
o
d
e
l
)
PE(pos,2i)=sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})\\ PE(pos,2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})\\
PE(pos,2i)=sin(10000dmodel2ipos)PE(pos,2i+1)=cos(10000dmodel2ipos)
- 这里波长从 2 π 2\pi 2π到 10000 ⋅ 2 π 10000\cdot 2\pi 10000⋅2π都有,每个pos在不同的维度都有一个编码。事实上,sin和cos交替,或者只是前一半(1~ d m o d e l / 2 d_{model}/2 dmodel/2)用sin,后一半用cos,这两种方式并没有什么性能上的差别,交替只是使编码更加的丰富,采用不同的波长也只是使用了一个手段来解决上面的问题,增加了函数的多样性来适应各种情况。
数学上这种编码在k固定时,关系是线性的
- 就是可以用PE(k)和PE(pos)的组合来表示PE(pos+k),这样就具有了表示相对位置的能力
- 这里不必深究这种函数是怎么得到的,很有可能就是凭经验来的
- 缺点:但是这种编码方式还是缺乏位置的方向关系,下面证明
TENER: Adapting Transformer Encoder for Named Entity Recognition
- 这篇论文证明了上面方法对方向性信息的缺失
性质
对偏置k和位置t, P E t + k T P E t PE_{t+k}^TPE_t PEt+kTPEt只取决于k
- 这可以说明两个位置向量的点积可以反映单词间的距离
证明
P
E
t
=
[
s
i
n
(
c
0
t
)
c
o
s
(
c
0
t
)
⋮
s
i
n
(
c
d
2
−
1
t
)
c
o
s
(
c
d
2
−
1
t
)
]
PE_t = \left[\begin{matrix} sin(c_0t)\\ cos(c_0t)\\ \vdots\\ sin(c_{\frac{d}{2}-1}t)\\ cos(c_{\frac{d}{2}-1}t) \end{matrix}\right]
PEt=⎣⎢⎢⎢⎢⎢⎡sin(c0t)cos(c0t)⋮sin(c2d−1t)cos(c2d−1t)⎦⎥⎥⎥⎥⎥⎤
c
i
=
1
1000
0
2
i
d
c_i=\frac{1}{10000^{\frac{2i}{d}}}
ci=10000d2i1
有
P
E
t
T
P
E
t
+
k
=
∑
j
=
0
d
2
−
1
c
o
s
(
c
j
k
)
PE_t^TPE_{t+k}=\sum_{j=0}^{\frac{d}{2}-1}cos(c_jk)
PEtTPEt+k=j=0∑2d−1cos(cjk)
对于偏置k和位置t, P E t T P E t − k = P E t T P E t + k PE_t^T PE_{t-k}=PE_{t}^TPE_{t+k} PEtTPEt−k=PEtTPEt+k
- 这说明原本的编码位置不能分辨方向
证明
令
j
=
t
−
k
j=t-k
j=t−k
P
E
t
T
P
E
t
+
k
=
P
E
j
T
P
E
j
+
k
=
P
E
t
−
k
T
P
E
t
PE_t^TPE_{t+k}=PE_j^TPE_{j+k}=PE_{t-k}^TPE_t
PEtTPEt+k=PEjTPEj+k=PEt−kTPEt
引入Q、K矩阵后原本的距离感知被削弱
- 这时候得到编码为 P E t T W q T W k P E t + k = P E t T W P E t + k PE_t^TW_q^TW_kPE_{t+k}=PE_t^TWPE_{t+k} PEtTWqTWkPEt+k=PEtTWPEt+k
- 这样使得原本的距离关系不那么明确
解决方法
Q
,
K
,
V
=
H
W
q
,
H
W
k
,
H
W
v
R
t
−
j
=
[
⋯
s
i
n
(
t
−
j
1000
0
2
i
d
k
)
c
o
s
(
t
−
j
1000
0
2
i
d
k
)
⋯
]
T
A
t
,
j
r
e
l
=
Q
t
K
j
T
+
Q
t
R
t
−
j
T
+
u
K
j
T
+
v
R
t
−
j
T
A
t
t
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
A
r
e
l
)
V
Q,K,V=HW_q,HW_k,HW_v\\ R_{t-j}=[\cdots sin(\frac{t-j}{10000^{\frac{2i}{d_k}}})cos(\frac{t-j}{10000^{\frac{2i}{d_k}}})\cdots ]^T\\ A_{t,j}^{rel}=Q_tK_j^T+Q_tR^T_{t-j}+uK_j^T+vR_{t-j}^T\\ Attn(Q,K,V)=softmax(A^{rel})V
Q,K,V=HWq,HWk,HWvRt−j=[⋯sin(10000dk2it−j)cos(10000dk2it−j)⋯]TAt,jrel=QtKjT+QtRt−jT+uKjT+vRt−jTAttn(Q,K,V)=softmax(Arel)V
式子中的u、v为可学习的参数
- 我们有
R t = [ s i n ( c 0 t ) c o s ( c 0 t ) ⋮ s i n ( c d 2 − 1 t ) c o s ( c d 2 − 1 t ) ] R − t = [ − s i n ( c 0 t ) c o s ( c 0 t ) ⋮ − s i n ( c d 2 − 1 t ) c o s ( c d 2 − 1 t ) ] R_t = \left[\begin{matrix} sin(c_0t)\\ cos(c_0t)\\ \vdots\\ sin(c_{\frac{d}{2}-1}t)\\ cos(c_{\frac{d}{2}-1}t) \end{matrix}\right] R_{-t} = \left[\begin{matrix} -sin(c_0t)\\ cos(c_0t)\\ \vdots\\ -sin(c_{\frac{d}{2}-1}t)\\ cos(c_{\frac{d}{2}-1}t) \end{matrix}\right] Rt=⎣⎢⎢⎢⎢⎢⎡sin(c0t)cos(c0t)⋮sin(c2d−1t)cos(c2d−1t)⎦⎥⎥⎥⎥⎥⎤R−t=⎣⎢⎢⎢⎢⎢⎡−sin(c0t)cos(c0t)⋮−sin(c2d−1t)cos(c2d−1t)⎦⎥⎥⎥⎥⎥⎤ - R t R_t Rt和 R − t R_{-t} R−t的不同使得具有了方向的信息
- 其实就是简单的在attention的时候把相对的前后关系引入
上面的这些用公式的方法,都是基于经验的关系,并没有针对样本进行学习或说有先验关系,感觉不是很有鲁棒性
Convolutional Sequence to Sequence Learning
- 由于使用卷积,也会失去位置信息
- 所以对于样本输入的词向量要加上一个位置编码向量,这个位置编码向量用朴素embedding的方式
- 这个就是不使用公式,而是直接使用样本训练出来的
- 最终向量 e = w + p = ( w 1 + p 1 , w 2 + p 2 , . . . , w n + p n ) e=w+p=(w_1+p_1,w_2+p_2,...,w_n+p_n) e=w+p=(w1+p1,w2+p2,...,wn+pn)
这种直接对位置信息进行embedding的方法也是一种好方法