详解基于调整RoPE旋转角度的大模型长度外推方法
作者: AINLP 来源: AINLP
01
前言
旋转位置编码RoPE (Rotary Position Embedding) 被广泛应用于目前的大模型中,包括但不限于Llama、Baichuan、ChatGLM、Qwen等。但RoPE却有着较弱的长度外推性,也就是在推理时,当模型的输入长度超出训练长度时,模型的性能会急剧下降,具体表现为困惑度的急剧上升。如下图所示,我们评测了LLaMA2-7B在不同输入长度中的困惑度,当评测长度为8192时,模型的困惑度急剧上升。
于是涌现出了一系列基于RoPE的大模型长度扩展的工作,并且取得了非常优秀的效果。在本文中,我们将对这些方法进行介绍,包括线性插值、NTK-Aware插值、NTK-by-parts、Dynamic NTK、YaRN等。上述方法均通过减小RoPE的旋转弧度来进行长度扩展,若读者对RoPE的基本原理尚未熟悉,建议先阅读文章:图解RoPE旋转位置编码及其特性。
02
RoPE知识回顾
磨刀不误砍柴工,我们先回顾RoPE的一些原理和特性,以便后续对各种长度扩展方法的理解。
RoPE的基本原理
在RoPE旋转位置编码中,存在位置编码函数 ,该函数表示对任意词向量 添加绝对位置信息 ,得到 ,其中 是一个矩阵,可以形象地把 理解为一个旋转矩阵。最终 如下公式所示:
我们可以以向量分组旋转的方式来理解上面的位置编码函数,它表示将向量 中的 个分量划分成 个分组,每组分量视为一个二维向量,分别旋转。当向量 位于位置 时,只需要将它的第 组分量旋转 ,就可以得到赋予了位置信息 的 ,其中 表示向量维度,在LLaMA中, 。
我们以向量 的第0组分量 为例,假设 ,此时 ,则 。当 位于位置0,1,2,3时,分别对应将 旋转0,1,2,3弧度。其它组分量的旋转弧度,可以依此类推。
周期性
下图展示了每组分量的旋转弧度和它所处位置的关系。对于每组分量,它的旋转弧度随着位置索引的增加而线性增加。每组分量的旋转都具有周期性,因为旋转一圈的弧度是 ,所以RoPE中的向量旋转就像时钟一样,具有周期性。并且我们发现越靠后的分组,它的旋转速度越慢。例如当向量位于位置500时,它的第0组分量已经旋转了500弧度,但第8组分量的旋转弧度仅为158左右。
下图展示了上述旋转弧度所对应的正弦函数。我们可以更直观地看到,越靠后的分组,它的旋转速度越慢,正弦函数的周期越大、频率越低。
远程衰减性
在此前的文章中,我们已经详细介绍了RoPE的远程衰减特性,具体表现为:对于两个词向量,若它们之间的距离越近,则它们的内积分数越高,反之则越低。随机初始化两个向量q和k,将q固定在位置0上,k的位置从0开始逐步变大,依次计算q和k之间的内积。随着q和k的相对距离的增加,它们之间的内积分数呈现出远程衰减的性质。
03
大模型长度扩展方法
基于RoPE的大模型进行长度扩展的方法,大致可以分为两大类:【局部注意力】与【调整旋转弧度】。本文主要讨论基于调整旋转弧度的长度扩展方法。
在此,请大家记住:任意向量 位于位置 时,它的第 组分量的旋转弧度为 ,其中 表示向量 的维度。我们后续讨论的所有长度扩展方法,本质上都是通过缩小旋转弧度 ,以达到长度扩展的目的。
注意:如未特殊说明,本文后续的所有方法讨论均建立在不进行微调的前提下。
Position Interpolation
当推理长度超出RoPE的训练长度 时,为什么模型的性能会下降?在RoPE中,每个位置 都对应一个旋转弧度 ,当模型的训练长度为 时,位置0到位置 对应的旋转弧度范围为 。
按照炼丹经验,我们可以合理地猜想:模型在训练时,只见过 范围内的旋转弧度,未见过大于 的旋转弧度,所以当推理长度大于 时,模型难以理解新的旋转弧度,无法正确注入位置信息,导致模型性能下降。
当然,真实原因比上述猜想更加复杂,此处我们只是希望以一种更加直观的猜想引出Position Interpolation,更具体的分析可以参考后续章节。
对于上述猜想,我们举个例子,LLaMA的训练长度为2048,如下图所示,对于第0组分量,训练时模型见过的旋转弧度范围为 ,当LLaMA在4096的长度上进行推理时,由于它在训练时未见过 的旋转弧度,所以难以理解,造成模型的性能下降。
基于上述猜想,我们可以认为模型已经能够非常好地理解旋转弧度范围 所表示的位置信息,那么是否存在某种方法,可以使用旋转弧度范围 来表示更长的长度范围 呢?
Position Interpolation的做法简单且直观:缩小每个位置的旋转弧度,让向量旋转得慢一些,每个位置的旋转弧度变为原来的 ,长度扩大几倍,则旋转弧度缩小几倍。最终,经过调整后,位置 的旋转弧度如下公式所示: 举个例子,我们设 ,也就是将模型的长度从2048扩展至4096,Position Interpolation将每个位置的旋转弧度均变为原来的一半。下图直观地展示了第0组分量的旋转弧度的变化情况,原来 的旋转弧度范围就可以用来表示4096的长度范围。这相当于在原来的弧度范围内,插入更多的位置,由于旋转弧度是线性变化的,所以也称为线性位置插值。
下图展示了第0组分量的旋转弧度所对应的正弦函数的变化情况。进行位置插值后,向量旋转速度变慢,周期变大,频率变慢。
NTK-Aware Interpolation
NTK-Aware Interpolation以NTK(神经正切核)作为理论支撑,或者说灵感来源。作者认为高频信息对于神经网络非常重要,而Position Interpolation对于向量的所有分组不加区分地缩小旋转弧度,降低旋转速度(进一步体现为对其正弦函数进行拉伸),会导致模型的高频信息缺失,从而影响模型的性能。
在前文中我们介绍过,位置越靠前的向量分组,旋转速度越快,频率越高,作者希望保留这些高频信息。在NTK-Aware插值中,经过调整后,位置 的旋转弧度如下公式所示,其中LLaMA中的 为10000, 表示 的缩放因子:
我们以Code LLaMA为例进行分析,Code LLaMA中 ,也就是将原始模型的 放大100倍。调整后的旋转弧度与原始旋转弧度的倍数关系如下: 如下图所示,越靠后的分组,旋转弧度缩小的倍数越大。其中第0分组的旋转弧度保持不变,最后一个分组的旋转弧度变为原来的1/100。可以将NTK-Aware Interpolation的思想总结为:保留高频信息;高频分量旋转速度降幅低,低频分量旋转速度降幅高;在高频部分进行外推,低频部分进行内插。
评测结果表明,在不进行finetune的时候,NTK-Aware插值的效果比线性插值更优。
为什么NTK-Aware Interpolation能够奏效?作者以NTK的理论进行解释。但我们认为从旋转周期的角度也许可以进行更加直观且合理的解释。前文中我们介绍过,位置越靠后的分组的旋转速度越慢,频率越低,周期越长。如下图所示,对于第0组分量,仅在位置7时,就已经旋转一周。但对于第64组分量,当位置为2047时,其旋转弧度约为0.2047,甚至仍未完成1/4周旋转。
我们可以将NTK-Aware Interpolation奏效的原因按照如下方式进行解释:
-
靠前的分组,在训练中见过非常多完整的旋转周期,位置信息得到了充分的训练,所以具有较强的外推能力。
-
靠后的分组,在训练中无法见到完整的旋转周期,或者见到的旋转周期非常少,训练不够充分,外推性能弱,需要进行位置插值。
NTK-by-parts Interpolation
NTK-by-parts Interpolation则是基于NTK-Aware Interpolation进行优化,其核心思想是:不改变高频部分,仅缩小低频部分的旋转弧度。也就是不改变靠前分组的旋转弧度,仅减小靠后分组的旋转弧度,这就是by-patrs的含义。
第 个分组的旋转周期如下: 第 个分组在训练长度内旋转的周期个数如下: 以每组分量在训练长度内旋转的周期个数 分类讨论插值方案。引入超参数 ,表示旋转周期个数的约束条件。
-
:旋转周期数量足够多,则认为该分组为高频部分,无需改变。
-
:旋转周期数量少,则为低频分组,进行Position Interpolation。
当然,在NTK-by-parts Interpolation的实现中,分类讨论比上述描述稍微复杂一点。上述方法进行了相应的简化,但思想是一致的。
Dynamic NTK Interpolation
当超出训练长度时,上述插值方法都比原模型直接外推的效果更好,但是它们都有一个共同的缺点,在训练长度内,推理表现都比原模型差。如下图,灰色表示LLaMA直接外推的表现,在2048长度内,原始模型的困惑度显著低于各种插值方法。
Dynamic NTK Interpolation是一种动态插值的方法,思路也很简单:推理长度小于等于训练长度时,不进行插值;推理长度大于训练长度时,每一步都通过NTK-Aware Interpolation动态放大base。
表示当前的序列长度, 表示模型训练长度,当 时,不改变模型原始的旋转弧度;当 时,使用NTK-Aware Interpolation调整旋转弧度为 , 。注意,每生成一个token后, 都会加1,当 时,每一次生成都会根据 重新调整旋转弧度,然后再进行下一次生成。
YaRN
前文中我们介绍过,无论是Position Interpolation还是NTK类方法,本质都是通过减小旋转弧度,降低旋转速度,来达到长度扩展的目的。这将导致位置之间的旋转弧度差距变小,词向量之间的距离变得比原来更近,词向量之间的点乘变大,破坏模型原始的注意力分布。所以经过插值之后,模型在原来的训练长度内的困惑度均有所提升,性能受损。
向量的内积公式如下。向量旋转不改变模长,当 和 的旋转弧度变小,导致它们之间的夹角 变小,所以两者的内积会变大,最终会改变模型的注意力分布。 我们以图像的方式进一步分析注意力分布变化的问题。初始化两个全一向量q和k,将q固定在位置0上,k的位置从0开始逐步变大,依次计算q和k之间的内积。对于不同的长度扩展策略,q和k的内积变化如下图。无论是NTK还是线性插值,相对距离固定时,q和k之间的内积分数都将变大,进而导致模型的注意力分布改变。并且可以发现,RoPE的注意力远程衰减的性质变弱,这也将导致整个序列的注意力分布变得更加平滑。
YaRN本质上是NTK-by-parts Interpolation与注意力分布修正策略的结合,仅缩小低频部分的旋转弧度,且通过温度系数修正注意力分布。只需将原来的注意力分数除以温度 即可。 ,我们以LLaMA为例,当长度从2048扩展至16384时,长度扩展为原来的8倍,代入公式,计算得到 。回顾温度系数对注意力分布的影响,当 变大,注意力分布更加平滑,方差更小;当 变小,注意力分布更加尖锐,区分度变大,方差变大。 意味着缓解注意力分布过于平滑的问题,让注意力分布方差更大些。
下图是未经过微调的动态插值方法的比较,修正了注意力分布的Dynamic-YaRN,显著优于未修正注意力分布的Dynamic-PI方法。
05
总结
本文介绍的大模型长度扩展方法,本质上都是通过缩小RoPE的旋转弧度,降低旋转速度,从而达到扩展长度的目的,并且通过不断优化缩小旋转弧度的方案,以提升模型的性能。
调整旋转弧度后,将对模型的注意力分布产生影响,如要达到更优的效果,一般还需要使用少量长文本进行微调,让模型适应调整后的位置信息。
一句话总结各种方法的特点:
-
Position Interpolation:目标长度是原来的n倍,则旋转弧度减小至原来的1/n。
-
NTK-Aware Interpolation:增大RoPE的base,保留高频信息;高频分量旋转速度降幅低,低频分量旋转速度降幅高;在高频部分进行外推,低频部分进行内插。
-
NTK-by-parts Interpolation:不改变高频部分,仅缩小低频部分的旋转弧度。
-
Dynamic NTK Interpolation:推理长度小于等于训练长度时,不进行插值;推理长度大于训练长度时,每一步都通过NTK-Aware插值动态放大base。
-
YaRN:NTK-by-parts Interpolation与注意力分布修正策略的结合,通过温度系数修正注意力分布。
进技术交流群请添加AINLP小助手微信(id: ainlp2)
请备注具体方向+所用到的相关技术点
![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSJADkmZ2IX6Z23znAibuEevotDMq9iaMxiapK7jfMibiauGFkycicAJEs6x5U9SGyDJZ0S1tRed9TPNUUDQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。
![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSKABHCqVVQkVYPrM4XY1vsd0iaeuXzyJnoFc8cibd5mYb4wdA3WMQtiaPVmr0XLZHMuVibqWncibpnTSnQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)
阅读至此了,分享、点赞、在看三选一吧🙏
更多AI工具,参考Github-AiBard123,国内AiBard123