414 Chapter 12. 基于自注意力的模型 肖桐 朱靖波
12.3 位置编码
在使用循环神经网络进行序列的信息提取时,每个时刻的运算都要依赖前一个
时刻的输出,具有一定的时序性,这也与语言具有顺序的特点相契合。而采用自注
意力机制对源语言和目标语言序列进行处理时,直接对当前位置和序列中的任意位
置进行建模,忽略了词之间的顺序关系,例如图12.6中两个语义不同的句子,通过自
注意力得到的表示
˜
h(机票) 却是相同的。
h(沈阳) h(到) h(广州) h(机票) h(机票)
...
α
1
= 0.2
α
2
= 0.3
α
3
= 0.1
α
i
= 0.3
h(广州)
h(到)
h(沈阳)
h(机票) h(机票)
...
α
1
= 0.1
α
2
= 0.3
α
3
= 0.2
α
i
= 0.3
˜
h(机票) = 0.2 × h(沈阳) + 0.3 × h(到) +
0.1 × h(广州) + ... + 0.3 × h(机票)
图 12.6 “机票”的更进一步抽象表示
˜
h 的计算
为了解决这个问题,Transformer 在原有的词向量输入基础上引入了位置编码,
来表示单词之间的顺序关系。位置编码在 Transformer 结构中的位置如图12.7,它是
Transformer 成功的一个重要因素。
Self-Attention
Add & LayerNorm
Feed Forward Network
Add & LayerNorm
Embedding
+
Position
编码器输入: 我 很 好
编码器
Self-Attention
Add & LayerNorm
Encoder-Decoder Attention
Add & LayerNorm
Feed Forward Network
Add & LayerNorm
Output layer
Embedding
+
Position
解码器输入: <sos> I am fine
解码器
解码器输出: I am fine <eos>
图 12.7 Transformer 输入与位置编码
位置编码的计算方式有很多种,Transformer 使用不同频率的正余弦函数,如公
12.3 位置编码 415
式(12.3)和(12.4)所示:
PE(pos,2i) = sin(
pos
10000
2i/d
model
) (12.3)
PE(pos,2i + 1) = cos(
pos
10000
2i/d
model
) (12.4)
式中 PE(·) 表示位置编码的函数,pos 表示单词的位置,i 代表位置编码向量中的第几
维,d
model
是 Transformer 的一个基础参数,表示每个位置的隐藏层大小。因为,正
余弦函数的编码各占一半,因此当位置编码的维度为 512 时,i 的范围是 0-255。在
Transformer 中,位置编码的维度和词嵌入向量的维度相同(均为 d
model
),模型通过
将二者相加作为模型输入,如图12.8所示。
e(沈阳) e(到) e(广州) e(的) e(机票)
h(沈阳)
h(到)
h(广州)
h(的)
h(机票)
⊕ ⊕ ⊕ ⊕ ⊕
PE(1) PE(2) PE(3) PE(4) PE(5)
沈阳
到
广州
的
机票
...
...
...
...
图 12.8 位置编码与词编码的组合
那么为什么通过这种计算方式可以很好的表示位置信息?有几方面原因。首先,
正余弦函数是具有上下界的周期函数,用正余弦函数可将长度不同的序列的位置编
码的范围都固定到 [−1, 1],这样在与词的编码进行相加时,不至于产生太大差距。另
外位置编码的不同维度对应不同的正余弦曲线,这为多维的表示空间赋予一定意义。
最后,根据三角函数的性质,如公式(12.5)和(12.6):
sin(α + β) = sinα ·cosβ + cosα ·sinβ (12.5)
cos(α + β) = cosα ·cosβ −sinα ·sinβ (12.6)
可以得到第 pos + k 个位置的编码,如公式(12.7)和(12.8):
PE(pos + k,2i) = PE(pos,2i) ·PE(k,2i + 1) +
PE(pos,2i + 1) ·PE(k,2i) (12.7)
PE(pos + k,2i + 1) = PE(pos,2i + 1) ·PE(k, 2i + 1) −
PE(pos,2i) ·PE(k, 2i) (12.8)
即对于任意固定的偏移量 k,PE(pos + k) 能被表示成 PE(pos) 的线性函数,换句话
说,位置编码可以表示词之间的距离。在实践中发现,位置编码对 Transformer 系统
416 Chapter 12. 基于自注意力的模型 肖桐 朱靖波
的性能有很大影响。对其进行改进也会带来进一步的性能提升
[462]
。