【NLP高频面题 - LLM架构篇】旋转位置编码RoPE如何进行外推?
重要性:★★★ 💯
NLP Github 项目:
-
NLP 项目实践:fasterai/nlp-project-practice
介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用,分享大模型算法工程师的日常工作和实战经验
-
AI 藏经阁:https://gitee.com/fasterai/ai-e-book
介绍:该仓库主要分享了数百本 AI 领域电子书
-
AI 算法面经:fasterai/nlp-interview-handbook#面经
介绍:该仓库一网打尽互联网大厂NLP算法面经,算法求职必备神器
-
NLP 剑指Offer:https://gitee.com/fasterai/nlp-interview-handbook
介绍:该仓库汇总了 NLP 算法工程师高频面题
调整旋转角提升外推效果
位置线性内插(Position Interpolation,PI)
RoPE 位置线性内插(base和位置线性内插的效果对比):
关于"位置线性内插(Position Interpolation)"方法的图示说明。对于预训练2048长度,外推4096长度:
左上角图示:
- 这部分是LLM 预训练的长度。
- 蓝色点代表输入的位置索引,它们都在0到2048的范围内,即预训练范围内。
- 这意味着给模型提供的输入序列长度没有超过它预训练时的最大长度。
右上角图示:
- 这部分展示了所谓的"长度外推"(Extrapolation)情况。
- 在这种情况下,模型被要求处理位置索引超出2048的情况,直到4096(由红色点表示)。
- 这些位置对于模型来说是"未见过的",因为在预训练时它们并没有涉及。
- 当模型遇到这种更长的输入序列时,其性能可能会受到影响,因为它没有被优化来处理这种情况。
左下角图示:
- 这部分展示了"位置线性内插"方法的应用。
- 为了解决模型处理更长序列时的问题,研究者们提出了一个策略:将位置索引本身进行下采样或缩放。
- 具体来说,他们将原本在[0, 4096]范围内索引(由蓝色和绿色点表示)缩放到[0, 2048]的范围内。
- 通过这种方式,所有的位置索引都被映射回了模型预训练时的范围内,从而帮助模型更好地处理这些原本超出其处理能力的输入序列。
RoPE位置编码:
可以看出,在外推(Extrapolation)时,红色点超出了预训练时的位置编码。
为了解决这个问题,位置线性内插的核心思想是通过缩放位置索引 ,使得模型能够处理比预训练时更长的序列,而不损失太多性能。
微调少量长文本,位置线性内插就能推理长文本:
NTK-Aware Scaled RoPE
位置线性内插虽然效果不错,但是插值方法是线性的,这种方法在处理相近的token时可能无法准确区分它们的顺序和位置。因此,研究者提出了一种非线性的插值方案,它改变RoPE的base而不是比例,从而改变每个RoPE维度向量与下一个向量的"旋转"速度。
新的方法被称为"NTK-Aware Scaled RoPE",它允许LLaMA模型在无需任何微调且困惑度降低到最小的情况下扩展上下文长度。这种方法基于Neural Tangent Kernel(NTK)理论和RoPE插值进行改进。
可以看到,公式(15)只是对base进行了放大,但是实验效果却非常好。为什么会取得这样的效果?
为了解开这个谜底,我们需要理解RoPE的构造可以视为一种 𝛽 进制编码 ,在这个视角之下,NTK-aware Scaled RoPE可以理解为对进制编码的不同扩增方式。
进制和维度
模型和优化器都不容易分辨相邻的数字。总的来说,基于梯度的优化器只能处理好不大不小的输入,太大太小都容易出问题。
将3位整数n以一个三维向量[a,b,c]来输入,a,b,c分别是n的百位、十位、个位。这样,我们既缩小了数字的跨度,又没有缩小相邻数字的差距,代价是增加了输入的维度------刚好,神经网络擅长处理高维数据。
如果想要进一步缩小数字的跨度,我们还可以进一步缩小进制的基数,如使用8进制、6进制甚至2进制,代价是进一步增加输入的维度。
进制转换
有没有不用新增维度,又能保持相邻差距的方案呢?有,就是进制转换。
刚才说到,我们关心的场景主要利用序信息,原来训练好的模型已经学会了875 > 874,而在16进制下同样有875 > 874,比较规则是一模一样的(模型根本不知道你输入的是多少进制)。唯一担心的是每个维度超过9之后(10~15)模型还能不能正常比较,但事实上一般模型也有一定的泛化能力,所以每个维度稍微往外推一些是没问题的。所以,这个转换进制的思路,甚至可能不微调原来模型也有效!
另外,为了进一步缩窄外推范围,我们还可以换用更小的13进制而不是16进制。这个进制转换的思想,实际上就对应着前面的NTK-aware scaled RoPE。
位置编码
位置n的旋转位置编码(RoPE),本质上就是数字n的β进制编码
由于位置编码更依赖于序信息,而进制转换基本不改变序的比较规则,所以NTK-aware Scaled RoPE在不微调的情况下直接扩大base,也能在更长Context上取得不错的效果。
NTK-Aware Scaled RoPE和RoPE β进制的关系
提出者基于NTK相关结果的直觉,推导了NTK-aware Scaled RoPE。假设要扩大k倍范围表示,根据NTK-Aware Scaled RoPE,高频外推、低频内插。
如果从前面的进制转换的角度分析 ,直接外推会将外推压力集中在"高位(m较大)"上,而位置内插则会将"低位(m较小)"的表示变得更加稠密,不利于区分相对距离。而NTK-aware Scaled RoPE其实就是进制转换,它将外推压力平摊到每一位上,并且保持相邻间隔不变,这些特性对明显更倾向于依赖相对位置的LLM来说是非常友好和关键的,所以它可以不微调也能实现一定的效果。
位置插值和NTK-Aware Scaled RoPE的实验效果:
不同插值方法的效果(这里的scale是指位置插值中扩大的倍数k,alpha是指NTK中的lambda参数或者是公式(15)中的alpha参数)
再看一下苏神的实验结论(表中的数据表示准确率),当 k = 8时,结论如下:
测试长度 | 512(训练) | 4096(外推) |
---|---|---|
Baseline | 49.91% | 23.16% |
PI-RoPE(位置线性内插) | 49.91% | 13.54% |
NTK-RoPE | 49.41% | 39.27% |
上面的结论是没有经过长文本微调的结果,其中Baseline就是外推,PI(Positional Interpolation)就是Baseline基础上改内插,NTK-RoPE就是Baseline基础上改NTK-aware Scaled RoPE。
从表中我们得出以下结论:
1、直接外推的效果不大行
2、内插如果不微调,效果也很差
3、NTK-RoPE不微调就取得了不错的外推结果