∈ R d 为其对应的位置编码,d d d 为位置编码的维度,d ≡ 0 ( m o d 2 ) d \equiv 0 (\mod 2) d ≡ 0 ( mod 2 ) ,则函数f : N → R d f : \mathbb{N} \rightarrow \mathbb{R}^d f : N → R d 即为位置编码函数,其定义如下:p t ⃗ ( i ) = f ( t ) ( i ) : = { sin ( ω k . t ) , if i = 2 k cos ( ω k . t ) , if i = 2 k + 1 \begin{align*} \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} \end{align*} p t ( i ) = f ( t ) ( i ) := { sin ( ω k . t ) , cos ( ω k . t ) , if i = 2 k if i = 2 k + 1
其中
ω k = 1 1000 0 2 k / d \omega_k = \frac{1}{10000^{2k / d}} ω k = 1000 0 2 k / d 1
从定义中我们可以看出三角函数的频率ω k \omega_k ω k 沿着向量维度不断减小,因此它的波长形成了一个2 π 2 \pi 2 π 到10000 ⋅ 2 π 10000 \cdot 2 \pi 10000 ⋅ 2 π 的等比数列。
对于第t t t 个单词的位置编码p t ⃗ \vec{p_t} p t ,可以看成由不同频率的正弦余弦对 组成的向量(d d d 为偶数):
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} p t = sin ( ω 1 . t ) cos ( ω 1 . t ) sin ( ω 2 . t ) cos ( ω 2 . t ) ⋮ sin ( ω d /2 . t ) cos ( ω d /2 . t ) d × 1
直观理解 你可能会想知道为什么要用不同频率的正弦余弦对的组合来编码位置信息?
其实这是一个很简单的想法,考虑用二进制编码来表示一个数字的情况:
0 : 0 0 0 0 8 : 1 0 0 0 1 : 0 0 0 1 9 : 1 0 0 1 2 : 0 0 1 0 10 : 1 0 1 0 3 : 0 0 1 1 11 : 1 0 1 1 4 : 0 1 0 0 12 : 1 1 0 0 5 : 0 1 0 1 13 : 1 1 0 1 6 : 0 1 1 0 14 : 1 1 1 0 7 : 0 1 1 1 15 : 1 1 1 1 \begin{align*} 0: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{0}} & & 8: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{0}} \\ 1: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{1}} & & 9: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{1}} \\ 2: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{0}} & & 10: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{0}} \\ 3: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{1}} & & 11: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{0}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{1}} \\ 4: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{0}} & & 12: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{0}} \\ 5: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{1}} & & 13: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{0}} \ \ \color{red}{\texttt{1}} \\ 6: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{0}} & & 14: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{0}} \\ 7: \ \ \ \ \color{orange}{\texttt{0}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{1}} & & 15: \ \ \ \ \color{orange}{\texttt{1}} \ \ \color{green}{\texttt{1}} \ \ \color{blue}{\texttt{1}} \ \ \color{red}{\texttt{1}} \\ \end{align*} 0 : 0 0 0 0 1 : 0 0 0 1 2 : 0 0 1 0 3 : 0 0 1 1 4 : 0 1 0 0 5 : 0 1 0 1 6 : 0 1 1 0 7 : 0 1 1 1 8 : 1 0 0 0 9 : 1 0 0 1 10 : 1 0 1 0 11 : 1 0 1 1 12 : 1 1 0 0 13 : 1 1 0 1 14 : 1 1 1 0 15 : 1 1 1 1
可以看到每个位置的比特都在以特定的频率周期性 变化,最低位每过一个数字就会变化一次,次低位每过两个数字就会变化一次,依次类推。
对于浮点数空间,使用二进制编码是极其浪费的。因此我们可以使用更适合浮点数空间的三角函数来引入周期性 。在位置编码中,正弦余弦函数相当于二进制编码中的比特位,通过改变它们的频率,我们相当于控制了不同的比特位。
位置编码如何结合到词向量中 在 Transformer 中,位置编码是通过加法 的方式结合到词向量中的,即对于一个句子[ w 1 , . . . w n ] [w_1,...w_n] [ w 1 , ... w n ] 中的第t t t 个单词w t w_t w t ,Transformer 的输入为:
ψ ′ ( w t ) = ψ ( w t ) + p t ⃗ \begin{align*} \psi^\prime(w_t) = \psi(w_t) + \vec{p_t} \end{align*} ψ ′ ( w t ) = ψ ( w t ) + p t
其中ψ ( w t ) \psi(w_t) ψ ( w t ) 为单词w t w_t w t 的词向量,p t ⃗ \vec{p_t} p t 为单词w t w_t w t 的位置编码。
由上式可知,位置编码的维度d d d 必须与词向量的维度相同 ,这样才能保证它们可以相加。
相对位置 正弦位置编码的另一个特点是,它能让模型更加轻松地捕捉到相对位置信息 。下面是原论文中的一段话:
We chose this function because we hypothesized it would allow the model to easily learn to attend by relative positions, since for any fixed offsetk k k ,P E p o s + k PE_{pos+k} P E p os + k can be represented as a linear function ofP E p o s PE_{pos} P E p os .
即对于任意固定的偏移量k k k ,位置编码P E p o s + k PE_{pos+k} P E p os + k 总能被P E p o s PE_{pos} P E p os 线性表示。
笔者水平有限,在这里就不进行证明了。
除此之外,正弦位置编码的另一个特点是,相邻时间步长之间的距离是对称的(正弦位置编码对距离的衡量是无向的),即P E p o s ⋅ P E p o s + k = P E p o s ⋅ P E p o s − k PE_{pos} \cdot PE_{pos+k} = PE_{pos} \cdot PE_{pos-k} P E p os ⋅ P E p os + k = P E p os ⋅ P E p os − k
其他问题 为什么位置编码与词向量结合是使用相加而不是连接 首先,连接位置编码与词向量会提高输入的维度,这将提高模型的参数量 。
其次,从前文的图中可以看出,位置编码的信息并不是均匀分布于每个维度之上,而是几乎所有的位置信息都分布在较低的维度之内(在原文中,词向量的维度为512 512 512 维)。由于 Transformer 的 Word Embedding 层是重新训练的,因此可能 Word Embedding 层在训练过程中根本没有往靠前维度存储语义信息,以免干扰位置编码。在这种情况下,512 512 512 维的位置编码与512 512 512 维的词向量相加似乎就等价 于x x x 维的位置编码与512 − x 512-x 512 − x 维的词向量连接。
位置编码信息如何传递到模型深层 理论上,位置编码信息在经过自注意力机制层 或者前馈神经网络层 后,就会被丢失。但 Transformer 为各个网络层添加了残差连接 ,这使得位置编码信息可以通过残差链接来逐步传递到模型的深层。
为什么要同时使用正弦和余弦函数 只有同时使用正弦和余弦函数才能将sin ( x + k ) \sin(x+k) sin ( x + k ) 和cos ( x + k ) \cos(x+k) cos ( x + k ) 表示为sin ( x ) \sin(x) sin ( x ) 和cos ( x ) \cos(x) cos ( x ) 的线性变换,即位置编码P E p o s PE_{pos} P E p os 一定要包含正弦和余弦函数才能线性表示P E p o s + k PE_{pos+k} P E p os + k ,这对模型捕获相对位置信息 具有很大的帮助。
小嗷犬
分享技术,记录生活
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小嗷犬 !