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旋转位置编码中,存在位置编码函数
我们可以以向量分组旋转的方式来理解上面的位置编码函数,它表示将向量
我们以向量
周期性
下图展示了每组分量的旋转弧度和它所处位置的关系。对于每组分量,它的旋转弧度随着位置索引的增加而线性增加。每组分量的旋转都具有周期性,因为旋转一圈的弧度是
下图展示了上述旋转弧度所对应的正弦函数。我们可以更直观地看到,越靠后的分组,它的旋转速度越慢,正弦函数的周期越大、频率越低。
远程衰减性
在此前的文章中,我们已经详细介绍了RoPE的远程衰减特性,具体表现为:对于两个词向量,若它们之间的距离越近,则它们的内积分数越高,反之则越低。随机初始化两个向量q和k,将q固定在位置0上,k的位置从0开始逐步变大,依次计算q和k之间的内积。随着q和k的相对距离的增加,它们之间的内积分数呈现出远程衰减的性质。
03
大模型长度扩展方法
基于RoPE的大模型进行长度扩展的方法,大致可以分为两大类:【局部注意力】与【调整旋转弧度】。本文主要讨论基于调整旋转弧度的长度扩展方法。
在此,请大家记住:任意向量
注意:如未特殊说明,本文后续的所有方法讨论均建立在不进行微调的前提下。
Position Interpolation
当推理长度超出RoPE的训练长度
按照炼丹经验,我们可以合理地猜想:模型在训练时,只见过
当然,真实原因比上述猜想更加复杂,此处我们只是希望以一种更加直观的猜想引出Position Interpolation,更具体的分析可以参考后续章节。
对于上述猜想,我们举个例子,LLaMA的训练长度为2048,如下图所示,对于第0组分量,训练时模型见过的旋转弧度范围为
基于上述猜想,我们可以认为模型已经能够非常好地理解旋转弧度范围
Position Interpolation的做法简单且直观:缩小每个位置的旋转弧度,让向量旋转得慢一些,每个位置的旋转弧度变为原来的
下图展示了第0组分量的旋转弧度所对应的正弦函数的变化情况。进行位置插值后,向量旋转速度变慢,周期变大,频率变慢。
NTK-Aware Interpolation
NTK-Aware Interpolation以NTK(神经正切核)作为理论支撑,或者说灵感来源。作者认为高频信息对于神经网络非常重要,而Position Interpolation对于向量的所有分组不加区分地缩小旋转弧度,降低旋转速度(进一步体现为对其正弦函数进行拉伸),会导致模型的高频信息缺失,从而影响模型的性能。
在前文中我们介绍过,位置越靠前的向量分组,旋转速度越快,频率越高,作者希望保留这些高频信息。在NTK-Aware插值中,经过调整后,位置
我们以Code LLaMA为例进行分析,Code LLaMA中
评测结果表明,在不进行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的含义。
第
当然,在NTK-by-parts Interpolation的实现中,分类讨论比上述描述稍微复杂一点。上述方法进行了相应的简化,但思想是一致的。
Dynamic NTK Interpolation
当超出训练长度时,上述插值方法都比原模型直接外推的效果更好,但是它们都有一个共同的缺点,在训练长度内,推理表现都比原模型差。如下图,灰色表示LLaMA直接外推的表现,在2048长度内,原始模型的困惑度显著低于各种插值方法。
Dynamic NTK Interpolation是一种动态插值的方法,思路也很简单:推理长度小于等于训练长度时,不进行插值;推理长度大于训练长度时,每一步都通过NTK-Aware Interpolation动态放大base。
YaRN
前文中我们介绍过,无论是Position Interpolation还是NTK类方法,本质都是通过减小旋转弧度,降低旋转速度,来达到长度扩展的目的。这将导致位置之间的旋转弧度差距变小,词向量之间的距离变得比原来更近,词向量之间的点乘变大,破坏模型原始的注意力分布。所以经过插值之后,模型在原来的训练长度内的困惑度均有所提升,性能受损。
向量的内积公式如下。向量旋转不改变模长,当
YaRN本质上是NTK-by-parts Interpolation与注意力分布修正策略的结合,仅缩小低频部分的旋转弧度,且通过温度系数修正注意力分布。只需将原来的注意力分数除以温度
下图是未经过微调的动态插值方法的比较,修正了注意力分布的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与注意力分布修正策略的结合,通过温度系数修正注意力分布。
在「知乎」也能找到我们了,搜索「红雨瓢泼」即可。
给公众号添加【星标⭐️】不迷路