绝对位置编码与相对位置编码:介绍了绝对位置编码和相对位置编码的基本原理,包括三角函数编码和旋转位置编码(RoPE)的运作机制 。
窗口外推的概念与意义:详细阐述了什么是窗口外推,为什么窗口外推对于语言模型的重要性,以及当前的研究挑战 。
当前窗口外推技术的现状:分析了不同的窗口外推方法及其各自的优缺点,如限制注意力流派和调整旋转速度流派 。
未来展望:展望了未来窗口外推技术的发展方向,特别是对 RoPE 的进一步研究和模型架构优化的可能性 。
二、绝对位置编码
1. 三角位置编码介绍
三角函数式 (Sinusoidal) 位置编码是在原 Transformer 模型中使用的一种绝对位置编码,其函数形式是:
其中 $p_{k,2i},p_{k,2i+1}$ 分别是位置索引 $k$ 处的编码向量的第 $2i,2i+1$ 个分量。在一般实践中 n=10000。
2. 性质
对于每个 dimension 而言,有
因此对于每个横坐标而言,都是一个正弦波,且波长和 dimension 大小是指数关系。这里说明了低 dimension 存储了高频分量,而高 dimension 存储了低频分量。
对于每个 token 而言,每个奇数坐标的正弦值如下所示:
波动是随着 token 靠后变大的,最终波长趋于 2πn/k。
还有个性质就是对于每一对(cos 和 sin),平方和为 1。
计算 qkv 的时候,我们知道有:
于是点积形式:
我们实际需要:
即所有的 p_n,p_m 都转化为 delta 的形式,这样就不存在基坐标的表示形式,有利于我们建模(具有平移不变性)。
3. 推论
另一个有用的推论,对于 p_2=p_1+k,有:
可以看到绝对位置编码是可以分解的,系数和 k 有关。但这个分解的结构性质告诉我们如果需要外推则需要两个域内的特征表示。
三、相对位置编码
1. 静态位置编码
ALiBi 的做法是不添加 position embedding,然后添加一个静态的不学习的 bias。
具体而言:
其中 n 为 attention 头个数:
效果也挺好。
2. 旋转位置编码
(1)小背景
什么是旋转矩阵,将二维的点逆时针绕原点旋转 θ 的表示。
目标,每个词都在单位圆上的 unique 位置,每个词(或者任意间隔的词)的距离显然一致(在 L2 空间上)。
(2)推理
在二维空间,内积空间退化为点积形式(其中⟨x,y⟩=x^T My 且 M=I),我们首先让这个部分表示为相对位置编码:
因为我们在二维空间,则可以用复数推理,复数的内积有:
假设存在复数等于该式子,利用欧拉公式有:
假设初始辐角为 ϕ_0=0,幅值为 1,一些特解:
递推公式:
这里多少角度其实无所谓,因此有解:
高维偶数空间的表示(注意这里只表达了在每个子空间上 ϕ_0=0,幅值为 1 的形式)。
为什么这是对的,因为内积是线性的。
(3)远程衰减
当距离趋于无穷时,有:
如果使用三角位置编码的方式,即:
因此内积可以被写作:
最后一步假设位置编码向量长度趋于无穷。
这个编码确实有衰减趋势。
但不代表就这一种合理的衰减形式,只要单调递减且大于 0 基本都没有太大的问题。
(4)矩阵形式
于是对于任意的 qkv 而言,有这样一般的嵌入(这里只写了 q 向量,其他向量也是如此):
二维嵌入:
RoPE 中,将 hidden states 的每两维看做一个二维坐标系,位置编码从“加”的方式变为对 hidden states 做“旋转”的方式参与计算,这也符合上述内容。
不同的“二维坐标系”(一般为头大小 128/2=64 个)有不同的旋转单位角,因此表达了不同频率的信息。每个子空间的旋转角为:
在 llama 中设置:
这个矩阵为什么保证了相对位置,因为:
其中旋转矩阵的转置就是往相反的方向旋转,于是该式子自然成立,保证了相对位置的一致性。
因为该矩阵是稀疏的,因此有:
注意⊗是逐位乘法,也可以写成点积的形式,效果一样。
(5)N 进制编码
比如要编码更长的数字,在不损失数字精度的方案的情况下,有图示的几种解法:
这个例子中的数字在 RoPE 中就是旋转角度。
- 前两者可以比较稳妥的解决该问题
- 第一种虽然 .5 不在训练数据中,但三位数字的序关系是保持的
- 加大 base 虽然可能在某个 token 上出现大于等于 10 的数字,但三位数字序关系依旧是存在的
- 缩小 base (看上去是反其道而行,我明明希望能在有限 context 的窗口表示,但我用了更多的窗口)实际上是希望模型能够更好的泛化低位的部分,但表示的 token 数量变长了导致长序列理解能力会有问题(毕竟更长了,而且他也没有学习更长范围,也就是超过三位数字的序关系),这个效果不是太好。还有一种解释就是更高的频率模型其实也没有泛化(因为仅仅是把基频变高了而已,落入到了未泛化区间)
四、外推能力
1. 外推动机
外推:让语言模型能够以一定的性能理解并生成超过其预训练窗口长度的文本。
为什么需要外推?
- 在应用中,有时会要求语言模型阅读或生成长度数万甚至数十万的文本,这超过了一般模型训练窗口的数倍至数十倍;
- 目前典型的语言模型预训练窗口长度为 2k~8k,更大的窗口会提高训练算力需求,降低训练效率。
补充一下知识:
这个是 LM 的对数似然:logP(x)=∑_(i=1)^n▒log P(x_i |x_1,x_2,…,x_(i-1) )。
这个是 perplexity,可以看到两者是一致的:最小化 perplexity 等于最大化 LM 的对数似然:"Perplexity" (x)=exp(-1/n ∑_(i=1)^n▒log P(x_i |x_1,x_2,…,x_(i-1) ))。
为什么当前的 RoPE based LLM 难以“无痛”外推?
- 理论上,得益于“旋转”操作周期性的本质,RoPE 的方案可以建模任意长度的序列;
- 但实际上,在推理时,模型对训练阶段没有“见过”的长度序列的建模效果显著地变差,具体表现为 perplexity 快速上升到完全不可用。
我们发现高频分量是充分学习的,因此可以外推,而低频分量不行。
2. 实现外推的方式
目前常见的有这几种形式:
(1)限制注意力流派
既然直接外推时对远程信息建模会出现 OOD 问题,那最直接的方式是在“少看”甚至“不看”远程信息的情况下建模长序列(只要我的建模序列的一个 layer 上的感受野大小和训练时保持一致即可)。
比如 SWA(在 Mistral 的报告中有)。
或者 Alibi 的将远处的 token 压低概率,使得其不出现在感受野中。
(2)调整旋转速度流派
既然对长距离的信息建模崩坏是因为“旋转”了“没见过”的角度,那么就让推理时的各token 间的相对旋转角度的区间映射回训练过的“熟悉”区间上去!
那么如何回到原来的训练分布上?
旋转角度=相对距离*单位角
①位置内插
第一种就是很朴素的位置内插(Extending Context Window of Large Language Models via Positional Interpolation),这样修改了相对距离。
也就是将原始训练长度 L 外推到 L^' 上,即加上一个线性变换:
然而,位置内插并不算长度外推方案,至少不是免训练的长度外推方案,因为位置内插之后同样会有 PPL 爆炸的问题。原因也不难理解,尽管位置内插避免了远处的位置越界问题,但这同时压缩了邻近 Token 的距离,严重扰乱了模型的局部分辨率,而众所周知语言模型本身就是一个非常依赖于局部关系的任务,所以扰乱了局部自然就没法预测准了。
不过,这也并非说位置内插就没有价值了。我们知道,需要长度外推的读者,无外乎是两种情况:一种是没有资源去做长文本微调,希望能够从短文本模型直接得到一个可用的长文本模型,这种需求对长度外推的效果要求会比较高,位置内插就不适合他们了;另一种是有资源去做长文本微调,研究长度外推纯粹是为了得到一个更好的初始化模型,这种情况对模型修改带来的初始损失容忍度比较高,只要能够通过微调快速弥补回损失掉的效果即可,位置内插正好是属于此类方法。Meta 的论文显示,经过 PI 之后,仅需 1000 步左右的长文本训练,就可以得到一个行之有效的长文本模型,这比不做任何修改直接微调的训练效率高出很多。
这种方案的一种修改则是 NTK-by-parts:
基于这个规则(高频的不插值,低频的插值,中间的线性过渡)对于长度为d 的第 i 维,比率为:
给出 ramp function:
对于 llama 而言,这里的超参数为:
缩放形式为:
其实就是位置内插的加权平均,超过 β 就不插值,低于 α 就纯插值。
②NTK(减小单位角)
第二种基于 YaRN: Efficient Context Window Extension of LargeLanguage Models 的 NTK-aware 方式。
就是缩小每个字空间的单位角(这是一种非线性变换)。
其中 α 为缩放系数,这实际上有以下的好处,首先:不是将 RoPE 的每个维度平均缩放一个因子,而是通过减少对高频区域的缩放和增加对低频区域的缩放(即高频不缩放,低频才缩放),从而将插值压力分散到多个维度,尤其是较低的维度。我们可以计算一下调节的比率。
当 i→1 时,比率趋近于 1;
当 i→d/2 时,比率趋近于 1/α。
③增大单位角
第三种是反而是在预训练的过程调小 base,让模型充分感知 at least 一个周期的频谱,这样是否在推理的阶段不需要做任何操作呢?
实际上不行,不行是因为效果差。
3. 外推能力评测
大海捞针测试是大语言模型信息检索能力的重要参考。通过在长文本中随机插入关键信息,形成大型语言模型(LLM)的Prompt。该测试旨在检测大型模型是否能从长文本中提取出这些关键信息,从而评估模型处理长文本信息提取的能力,这可以反映LLM对长文本的理解基础能力。
在给定文本块中插入一段信息之后检索该 needle。
4. 长文本信息依赖
我们发现如果把 base 变小,即使模型已经充分感知到了 rotation(因为在 context 长度上已经转过了至少一圈)但效果很差。我们在前面已经了解到了相对位置编码(这里特指旋转位置编码)是有远程衰减性质的。
如果 base 变大的话远距离的 token 压制变小,因此长文本的 attention 会比 base 小的要大一点,因此小 base 损失了很大一部分 attention 的能力。这也能从上面的实验中看出。这里我们可以更具体地表达这部分内容。定义:
其中前半部分为相似 token 间注意力的期望,后半部分是随机 token 间注意力的期望,假设 qk 是 i.i.d. 的,且各自的均值和方差为 μ,σ,且 k^*=q+ϵ,则有:
五、问答环节
Q1:位置编码(旋转位置编码)的物理意义与直观解释?
A1:单位角代表了旋转速度。旋转速度快的,那么建模了距离较近的信息,远的则建模较远信息。
Q2:外推的价值,是否需要建模长距离(可以讲前面的变成摘要)?
A2:这不矛盾。模型可以有能力阅读所有的文本,但毕竟这是二次复杂度的(attention operation),当然也可以对长文本去做一个切片,或者说去做一个分割,这是应用决定的。
Q3:BERT 可以做相对位置编码吗?
A3:没有不可以,但目前没人做。
Q4:9.11<9.9可以用 PE 解决吗?
A4:这个是 LLM 在理解和感知 token 上的问题,和 PE 没什么关系。
Q5:外推效果有损,衡量指标是什么?能到原来的多少?
A5:base 调小在前面说了虽然 ppl 还可以但效果很差,对位置感知很混沌,因为丧失了对长距离的感知。ppl 相对稳定,但比原来的有上移。衡量指标指标就是 ppl 和 needle seeking。base 变大的话对模型性能影响不大,完全可以接受。