关于Transformer中的位置编码(Positional Encoding)

🌟关于位置编码(The Positional Encoding)

学习笔记,大部分内容翻译自 https://kazemnejad.com/blog/transformer_architecture_positional_encoding/

image.png

Why:为什么输入需要position embedding

(1)对于任何语言,词的位置和顺序都是非常重要的组成部分,它们决定了一个句子的语法和实际的语义。

(2)RNNs方法本身是一种顺序结构,天生就包括了词序信息,以连续的方式逐字分析一个句子。但是,Transformer 结构摒弃了循环的机制,使用了多头注意力的机制。优点是,加速了网络的训练时间,并能捕获更长的句子依赖关系。当句子中的所有单词同时并行的输入到网络中,模型本身无法知道每个词在句子中的相对和绝对的位置信息。

因此,需要将词序信号加到词向量上帮助模型学习这些信息,位置编码(Positional Encoding)就是用来解决这种问题的方法。

What:什么是位置编码

为了解决模型学习不到句子的词序问题,一个可行的解决方法就是对每个词增加一些位置信息(“piece of information”),这种“piece of information”称为位置编码。

How:如何实现位置编码

一种做法,就是分配0-1之间的数值给每个时间步,其中0表示第一个词,1表示最后一个词。这种方法虽然简单,但是会带来很多问题。一个问题就是,无法知道在一个特定区间范围内到底存在多少个单词。换句话说,不同句子之间的时间步差值没有任何的意义。

另一种做法,就是线性分配一个数值给每个时间步。第一个词给1,第二个词给2,等等。这种方法的问题是,值不仅会变得相当大,而且模型也会遇到比训练中所有句子都要长的句子。另外,训练集不一定会包括所有长度值的句子,这会影响模型的泛化能力。

因此,一个好的方法需要满足:

  • 对于每个时间步得到一个独特的编码
  • 不同长度的句子间,任意两个时间步间的距离应该是保持一致的。
  • 模型应该能毫不费力地泛化到更长的句子,它的值应该是有界的。
  • 它必须是确定性的

Transformer的作者提出了一种简单但非常创新的位置编码方法,能够满足上面的所有要求。首先,它是一个d维的向量,包括了在句子中词的具体位置信息,而不是一个值。第二,这种编码没有被整合到模型中,而是用这个向量让每个词具有它在句子中的位置信息。换句话说,通过注入词的顺序信息来增强模型的输入。

t表示一个输入句子中期望的位置, p t ⃗ ∈ R d \vec{p_t}\in \mathbb{R}^d pt Rd 表示对应的编码,d表示编码的维度。 f : N → R d f:\mathbb{N}\rightarrow\mathbb{R}^d f:NRd 表示产生输出编码向量的函数,定义如下:

p t ⃗ ( i ) = f ( t ) ( i ) : = { sin ⁡ ( ω k . t ) , if  i = 2 k cos ⁡ ( ω k . t ) , if  i = 2 k + 1 \vec{p_t}^{(i)}=f(t)^{(i)}:= \begin{cases} \sin(\omega_k.t), & \text{if}\ i=2k\\ \cos(\omega_k.t), & \text{if}\ i=2k+1 \end{cases} pt (i)=f(t)(i):={sin(ωk.t),cos(ωk.t),if i=2kif i=2k+1
其中,频率 ω k \omega_k ωk定义如下
ω k = 1 1000 0 2 k / d \omega_k=\frac{1}{10000^{2k/d}} ωk=100002k/d1
从函数定义看出,频率沿着向量的维度k增加而减少。因此,它在波长上形成 2 π 2\pi 2π 100 ⋅ 2 π 100\cdot 2\pi 1002π几何级数,也就是说,位置编码是一个包含每个频率的正弦和余弦对(d能被2整除)
p t ⃗ = [ sin ⁡ ( ω 1 . t ) cos ⁡ ( ω 1 . t ) sin ⁡ ( ω 2 . t ) cos ⁡ ( ω 2 . t ) ⋮ sin ⁡ ( ω d / 2 . t ) cos ⁡ ( ω d / 2 . t ) ] d × 1 \vec{p_t}= \begin{bmatrix} \sin(\omega_1.t)\\ \cos(\omega_1.t)\\ \\ \sin(\omega_2.t)\\ \cos(\omega_2.t)\\ \\ \vdots\\ \\ \sin(\omega_{d/2}.t)\\ \cos(\omega_{d/2}.t)\\ \end{bmatrix}_{d\times 1} pt = sin(ω1.t)cos(ω1.t)sin(ω2.t)cos(ω2.t)sin(ωd/2.t)cos(ωd/2.t) d×1
image.png

有了位置编码,如何将位置信息嵌入到每个词向量呢?原始论文将位置编码加到模型的输入之上 ψ ′ ( w t ) = ψ ( w t ) + p t ⃗ \psi'(w_t)=\psi(w_t)+\vec{p_t} ψ(wt)=ψ(wt)+pt
对于句子中每个词 w t w_t wt,计算对应的词嵌入后加上位置编码,输入到模型中。为了保证这种相加操作正确,位置向量的维度等于词向量的维度,即 d W E = d P E d_{WE}=d_{PE} dWE=dPE

相对位置的线性关系

正弦曲线函数的位置编码的另一个特点是,它能让模型毫不费力地关注相对位置信息。

简单的证明见https://kazemnejad.com/blog/transformer_architecture_positional_encoding/#:~:text=%5D-,Proof%3A,-Let

正弦位置编码的另一个特点是相邻时间步长之间的距离是对称的,并且随着时间的推移衰减得很好。

实验证明,使用相对位置编码要比绝对位置编码要好。

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值