Skip to content

LLMs 位置编码篇

📝通俗解释:位置编码就像给句子中的每个词语贴上"序号标签"。如果没有位置编码,模型只知道词语的意思,但不知道词语在句子中的位置关系。比如"狗咬人"和"人咬狗",词语相同但意思完全相反,这就是位置信息的重要性。


动机

由于计算资源限制,目前的大模型大多在较小的上下文长度中进行训练,在推理中,若超出预训练的长度,模型的性能将会显著降低。于是涌现出了许多基于 RoPE 的长度外推的工作,旨在让大模型能够在预训练长度之外,取得更好的效果。

📝通俗解释:就像一个学生只做过100道数学题,现在让他做200道的试卷,成绩自然会下降。大模型也类似,训练时只见过512个词的句子,现在让它处理1024个词,效果就会变差。长度外推就是为了解决这个问题。


一、什么是位置编码?

句子中不同词语之间的位置信息十分重要,但是 Self-Attention 框架无法直接利用位置信息,因此研究者提出了许多方法将位置信息编码到学习过程中。

  1. 绝对位置编码方法:将位置信息直接加入到输入中;
  2. 相对位置编码方法:研究者通过微调 Attention 的结构,使它具有识别 token 位置信息的能力。

📝通俗解释:绝对位置编码就像给每个人发一张"座位卡",上面写着"第1号"、"第2号";相对位置编码则不关心具体座位号,只关心"两个人之间隔了几个座位"。


二、为什么需要位置编码?

众所周知,Transformer 模型之所以能够取得如此卓越的效果,其中的 Attention 机制功不可没,它的本质是计算输入序列中的每个 token 与整个序列的注意力权重。假设 $q_m$ 和 $k_n$ 分别表示词向量 $q$ 位于位置 $m$ 和词向量 $k$ 位于位置 $n$,在未添加位置信息的时候:

$$q_m = q, k_n = k$$

则两者的注意力权重计算如下:

$$a_{m,n} = \frac{\exp\left(\frac{q_m^T k_n}{\sqrt{d}}\right)}{\sum_{j=1}^N \exp\left(\frac{q_m^T k_j}{\sqrt{d}}\right)}$$

我们会发现,在未加入位置信息的情况下,无论 q 和 k 所处的位置如何变化,它们之间的注意力权重 $a(m,n)$ 均不会发生变化,也就是位置无关,这显然与我们的直觉不符。对于两个词向量,如果它们之间的距离较近,我们希望它们之间的注意力权重更大,当距离较远时,注意力权重更小。

为了解决这个问题,我们需要为模型引入位置编码,让每个词向量都能够感知到它在输入序列中所处的位置信息。我们定义如下函数,该函数表示对词向量 q 注入位置信息 m,得到 $q_m$:

$$q_m = f(q, m)$$

则 $q_m$ 与 $k_n$ 之间的注意力权重可表示为:

$$a_{m,n} = \frac{\exp\left(\frac{f(q,m)^T f(k,n)}{\sqrt{d}}\right)}{\sum_{j=1}^N \exp\left(\frac{f(q,m)^T f(k,j)}{\sqrt{d}}\right)}$$

📝通俗解释:想象你在嘈杂的房间里听大家说话,如果不告诉你"谁在哪个位置"说话,你只能单纯根据声音大小来听。但如果你知道"左边的人在说话",你就会更关注左边的信息。位置编码就是给模型提供这种"空间感"。


三、什么是绝对位置编码?

绝对位置编码比较简单,研究者一般会将绝对位置信息加到输入中:在输入的第 k 个向量 $x_k$ 中加入位置向量 $p_k$ 得到 $p_k + x_k$,其中 $p_k$ 仅与 k 相关。计算 $p_k$ 的方法一般有两种:训练式位置编码与 Sinusoidal 位置编码。

📝通俗解释:绝对位置编码就像在每个单词旁边写上它的序号"第1个词"、"第2个词",让模型知道每个词的绝对位置。


3.1 训练式位置编码篇

3.1.1 什么是训练式位置编码?

训练式位置编码,顾名思义就是每个位置的位置向量会随着模型一起训练。假设模型最大输入长度为 512,向量维度为 768,我们可初始化一个 512×768 的位置编码矩阵,该矩阵将参与模型的训练,从而学习得到每个位置所对应的向量表示。

📝通俗解释:就像让模型自己学习每个位置应该长什么样,训练过程中自动找到最好的位置表示。

3.1.2 如何为每个位置的词向量注入位置信息呢?

答案是相加,如以下公式所示,其中 $p_m$ 表示第 m 个位置的位置向量:

$$q_m = f(q, m) = q + p_m$$

📝通俗解释:把位置向量想象成"位置添加剂",直接加到词向量上,就像在菜里加调料一样简单。

3.1.3 训练式位置编码应用场景

训练式位置编码广泛应用于早期的 Transformer 类型的模型,如 BERT、GPT、ALBERT 等。

3.1.4 训练式位置编码存在哪些问题?

模型不具有长度外推性,因为位置编码矩阵的大小是预设的,若对其进行扩展,将会破坏模型在预训练阶段学习到的位置信息。例如将 512×768 扩展为 1024×768,新拓展的 512 个位置向量缺乏训练,无法正确表示 512~1023 的位置信息。但早期大家对长文本输入的需求并不如现在迫切。

📝通俗解释:就像一个只背了512个单词的词典,突然要查第513个单词,词典里根本没有。所以训练式位置编码无法处理超过训练长度的文本。


3.2 Sinusoidal 位置编码篇

3.2.1 什么是 Sinusoidal 位置编码?

Sinusoidal 位置编码是谷歌在 Transformer 模型中提出的一种绝对位置编码,它的形式如下,其中 d 表示词向量的维度,k 表示位置索引,2i 和 2i+1 表示位置向量的分量索引,例如 $p_{k,2i}$ 和 $p_{k,2i+1}$ 分别表示位置 k 的位置向量的第 2i 和第 2i+1 个分量:

$$ \begin{cases} p_{k,2i} = \sin(k/10000^{2i/d}) \ p_{k,2i+1} = \cos(k/10000^{2i/d}) \end{cases} $$

📝通俗解释:Sinusoidal 使用正弦和余弦函数来生成位置信息。不同维度使用不同频率的波,频率 = 1/波长。这样设计的好处是:位置信息是连续的、有规律的,模型可以轻松推断出任意位置的关系。

3.2.2 Sinusoidal 位置编码有哪些优点?

1. 周期性

Sinusoidal 位置编码的每个分量都是正弦或余弦函数,所有每个分量的数值都具有周期性。如下图所示,每个分量都具有周期性,并且越靠后的分量,波长越长,频率越低。

📝通俗解释:就像音乐中的高低音,频率高的波动快(短波长),频率低的波动慢(长波长)。这样不同位置会形成独特的"节奏模式"。

2. 远程衰减性

Sinusoidal 位置编码还具有远程衰减的性质,具体表现为:对于两个相同的词向量,如果它们之间的距离越近,则他们的内积分数越高,反之则越低。如下图所示,我们随机初始化两个向量 q 和 k,将 q 固定在位置 0 上,k 的位置从 0 开始逐步变大,依次计算 q 和 k 之间的内积。我们发现随着 q 和 k 的相对距离的增加,它们之间的内积分数震荡衰减。

📝通俗解释:这符合直觉——离得越近的词关系越密切,注意力应该更强;离得远的词关系疏远,注意力自然减弱。Sinusoidal天然具有这个特性。


四、什么是相对位置编码?

前面讲到相对位置编码是微调 Attention 矩阵的计算方式,先看看绝对位置编码怎样计算 Attention 矩阵:

$$ \begin{aligned} q_m &= W_q(x_m + p_m) \ k_n &= W_k(x_n + p_n) \ q_m^T k_n &= x_m^T W_q^T W_k x_n + x_m^T W_q^T W_k p_n + p_m^T W_q^T W_k x_n + p_m^T W_q^T W_k p_n \quad (1) \end{aligned} $$

可以看到计算 Attention 矩阵的过程如公式(1)所示,其中第一项和位置信息无关,第二至四项和位置信息相关。因此研究者通常是直接修改第二至四项的内容,直接在 Attention 矩阵中添加相对位置信息。常见的有以下几种方法:

XLNet 式:如(2)所示,XLNet 将(1)中的二至四项都做了改变,具体地将 $p_n$ 替换为了相对位置编码 $\tilde{R}_{n-m}$,将 $p_m$ 换成了两个可以训练的向量 $u,v$。

$$q_m^T k_n = x_m^T W_q^T W_k x_n + x_m^T W_q^T \tilde{W}k \tilde{R} + u^T W_q^T W_k x_n + v^T W_q^T \tilde{W}k \tilde{R} \quad (2)$$

T5 式:如(3)所示,它的作者认为输入和位置间不应过多交互,因此将第二、三项删除,将第四项都替换为一个可学习的偏置 $b_{m,n}$,这仅仅是在 Attention 矩阵的基础上加一个可训练的偏置项而已,十分简单。

$$q_m^T k_n = x_m^T W_q^T W_k x_n + b_{m,n} \quad (3)$$

DeBERTa 式:和 T5 的构造相反,它舍弃了公式(1)中第四项,保留了第二、三项并将位置信息替换为了相对位置向量 $\tilde{R}_{n-m}$。

$$q_m^T k_n = x_m^T W_q^T W_k x_n + x_m^T W_q^T W_k \tilde{R}{n-m} + \tilde{R}^T W_q^T W_k x_n \quad (4)$$

📝通俗解释:相对位置编码不关心"第几个词",而关心"两个词之间隔了多远"。这更符合人类理解语言的方式——我们说"这个词和那个词有关",通常是指它们在语义上的关系,而不是它们在句子中的绝对位置。


五、旋转位置编码 RoPE 篇

5.1 旋转位置编码 RoPE 思路是什么?

作用在每个 Transformer 层的 Self-Attention 块,在计算完 Q/K 之后,旋转位置编码作用在 Q/K 上,再计算 Attention Score。

📝通俗解释:RoPE的思路很巧妙——不对词向量"加分",而是对词向量"旋转"。就像把每个词放在一个圆盘上,根据位置旋转不同的角度。两个词向量的"旋转角度差"就代表了它们的相对位置。

5.2 推导一下旋转位置编码 RoPE?

Attention 的核心运算是内积,所以我们希望经过内积的结果能够带有相对信息。那么我们希望 $q_m$ 和 $k_n$ 的内积仅与输入 $x_m, x_n$ 和他们的相对位置 $m-n$ 有关,那么我们可以假设存在函数 $g$,使得:

$$q_m^T k_n = g(x_m, x_n, m-n)$$

为了方便理解我们可以先考虑二维形式,然后借助复数的运算法则来理解。首先分别用复数的指数形式表示各个向量变化,即有:

$$ \begin{aligned} q_m &= (W_q x_m) e^{im\theta} \ k_n &= (W_k x_n) e^{in\theta} \ q_m^T k_n &= Re[(W_q x_m)(W_k x_n)^* e^{i(m-n)\theta}] \end{aligned} $$

📝通俗解释:这里用到了复数的性质。向量内积可以写成复数乘积的实部:$<a, b> = Re(a \cdot b^*)$。通过让每个位置的向量乘以 $e^{im\theta}$(旋转因子),两个向量的内积就自然包含了相对位置信息 $(m-n)\theta$。

PS1. 向量内积与复数乘积的关系为 $\langle i, j \rangle = Re(i \cdot j^*)$,其中 Re 表示复数的实部。

PS2. 这个形式证明过程可以参考论文的 3.4.1 节。但是要注意的是向量内积是标量,而 $g(x_m, x_n, m-n)$ 是复数标量,所以其公式(21) 应改为:

$$q_m^T k_n = \langle f_q(x, m), f_k(x, n) \rangle = Re[g(x_m, x_n, m-n)]$$

这样公式(24)才好理解。

以 $q_m$ 为例,假设 $e^{im\theta}$ 表示为模长为1的复数,根据复数乘法的几何意义,$(W_q x_m)e^{im\theta}$ 变换实际上对应着向量 $W_q x_m$ 的旋转,所以我们称之为"旋转式位置编码",它还可以写成矩阵形式:

$$q_m = \begin{pmatrix} \cos m\theta & -\sin m\theta \ \sin m\theta & \cos m\theta \end{pmatrix} W_q x_m$$

以 $q_m$ 为例,考虑多维情况,可以得到旋转式位置编码的一般形式为:$q_m = R^d_{\Theta, m} W_q x_m$,其中:

$$ R^d_{\Theta, m} = \begin{pmatrix} \cos m\theta_1 & -\sin m\theta_1 & 0 & 0 & \cdots & 0 & 0 \ \sin m\theta_1 & \cos m\theta_1 & 0 & 0 & \cdots & 0 & 0 \ 0 & 0 & \cos m\theta_2 & -\sin m\theta_2 & \cdots & 0 & 0 \ 0 & 0 & \sin m\theta_2 & \cos m\theta_2 & \cdots & 0 & 0 \ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \ 0 & 0 & 0 & 0 & \cdots & \cos m\theta_{d/2} & -\sin m\theta_{d/2} \ 0 & 0 & 0 & 0 & \cdots & \sin m\theta_{d/2} & \cos m\theta_{d/2} \end{pmatrix} $$

📝通俗解释:这个矩阵把词向量的每两个维度配对,每对做一个2D旋转。不同维度对使用不同的旋转频率 $\theta_i$。这样,高频维度能捕捉精细的位置差异,低频维度捕捉粗糙的位置信息。

PS3. 矩阵 $R^d_{\Theta, m}$ 为正交矩阵,它不会改变向量的模长,因此通常来说它不会改变原模型的稳定性。

📝通俗解释:正交矩阵就像"旋转",只会改变方向,不会改变长度。这保证了加入位置编码后,词向量的"强度"不变,模型训练更稳定。

5.3 旋转位置编码 RoPE 有什么优点?

旋转位置编码通过绝对位置编码的方式实现了相对位置编码,有良好的外推性。

📝通俗解释:RoPE巧妙地"曲线救国"——用绝对位置的旋转操作,实现了相对位置的效果。它就像给每个位置发了一张"旋转角度卡",两个卡片的"角度差"就是相对位置。而且这个角度可以无限延伸,所以外推性好。

5.4 旋转位置编码 RoPE 被哪些 LLMs 应用?

LLaMA、GLM-130B、PaLM 等大语言模型就采用了旋转位置编码 RoPE。


六、长度外推问题篇

6.1 什么是长度外推问题?

  • 长度外推问题:训练、推理的长度不一致问题,主要体现在以下两方面:
    • 问题一:位置编码不一致(推理的时候有训练没见过的位置编码);
    • 问题二:Attention Span 大小不一致(推理的时候 Attention Span 更大,导致熵增);

📝通俗解释:长度外推就像让一个只做过小学数学题的学生去做高中数学题,虽然都是数学,但难度和复杂度完全不同。模型在短文本上训练,却要在长文本上推理,这就是"外推"。

6.2 长度外推问题的解决方法有哪些?

  • 问题一解决方法:ALiBi、KERPLE、Sandwich、XPOS、PI、NTK-RoPE(目前看起来这个最强,不用 Finetune);
  • 问题二解决方法:Softmax 的时候加一个 $\log 512 - \log n$ 系数;

📝通俗解释:问题一的解决方法都是让位置编码"更平滑"或"更有规律",这样模型即使看到没见过的位置,也能合理推断。问题二的解决方法是在计算注意力时,给远距离的词加一个"距离惩罚",让模型不要过度关注太远的内容。


七、ALiBi (Attention with Linear Biases) 篇

7.1 ALiBi 思路是什么?

在计算完 Attention Score 后,直接为 Attention Score 矩阵加上一个预设好的偏置矩阵。

📝通俗解释:ALiBi的思路非常直接——不需要复杂的旋转或学习,直接在注意力分数上"减分"。两个词隔得越远,减分越多,这样模型自然会更关注近处的词。

7.2 ALiBi 的偏置矩阵是什么?有什么作用?

$$ \begin{bmatrix} q_1 \cdot k_1 & & & & \ q_2 \cdot k_1 & q_2 \cdot k_2 & & & \ q_3 \cdot k_1 & q_3 \cdot k_2 & q_3 \cdot k_3 & & \ q_4 \cdot k_1 & q_4 \cdot k_2 & q_4 \cdot k_3 & q_4 \cdot k_4 & \ q_5 \cdot k_1 & q_5 \cdot k_2 & q_5 \cdot k_3 & q_5 \cdot k_4 & q_5 \cdot k_5 \end{bmatrix} + \begin{bmatrix} 0 & & & & \ -1 & 0 & & & \ -2 & -1 & 0 & & \ -3 & -2 & -1 & 0 & \ -4 & -3 & -2 & -1 & 0 \end{bmatrix} \cdot m $$

  • ALiBi 的偏置矩阵:根据 q 和 k 的相对距离来惩罚 Attention Score
  • 作用:相对距离越大,惩罚项越大,相当于两个 Token 的距离越远,相互贡献就越小。

📝通俗解释:这个偏置矩阵是一个对角线为0的三角矩阵,对角线下方是 -1, -2, -3, -4...。比如第5个词和第1个词的距离是4,所以要减去4×m(m是一个缩放系数)。这就像给远距离的词之间"设置障碍",距离越远障碍越大。

7.3 ALiBi 有什么优点?

ALiBi 位置编码有良好的外推性。

📝通俗解释:因为ALiBi的偏置是预先设定好的(不依赖具体位置值),而是看相对距离,所以无论位置多大,只要相对距离相同,惩罚就相同。这就是它能外推的原因。

7.4 ALiBi 被哪些 LLMs 应用?

BLOOM 就采用了这种位置编码。


总结

位置编码方法类型外推性代表模型
训练式绝对位置编码BERT、GPT
Sinusoidal绝对位置编码✅(有限)Transformer
RoPE旋转位置编码LLaMA、GLM-130B
ALiBi线性偏置BLOOM

📝通俗解释:位置编码的发展历程就是"为了让模型能处理更长文本"的过程。从最初的需要训练位置向量,到用数学公式生成位置信息,再到旋转和偏置技术,每一代都在解决"长度外推"这个核心问题。

基于 MIT 许可发布