1、为什么要使用位置编码?
首先我们来讲一下attention。
优点:
- 解决了长序列依赖问题
- 可以并行操作
缺点: - 开销变大了
- 位置编码问题,既然可以并行,也就是说,词语之间不存在顺序关系(打乱一句话,这句话里的每个词的词向量依然不会变)。
注意:
- 与RNN相比,RNN是一个字一个字的输入,自然每个字的循序关系信息就会保留下来,在Encoder中,一句子的每一个字(词)是并行计算的(下一节解释),所以我们在输入的时候需要提前引入位置信息。
- 随着token长度的增加,越靠后的权重越强,越靠前的权重越弱,
2、位置编码的做法
这样通过与位置编码(positional encoding)相加,则让输入向量x具有了位置信息。
具体做法
做法1:
i为偶数:
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
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)=sin(10000dmodel2ipos)
i为奇数:
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+1)} = cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}})
PE(pos,2i+1)=cos(10000dmodel2ipos)
奇数的位置是cos, 偶数的位置是sin
i是维度下标,d是总维度