论文标题:YaRN: Efficient Context Window Extension of Large Language Models
论文地址:https://arxiv.org/abs/2309.00071
论文发布时间:2023-08-31
本篇论文所提出的算法 YaRN,被 Qwen2.5 在外推拓展方面使用。
Abstract
旋转位置嵌入(RoPE)无法在超出其训练的序列长度上进行泛化。
论文提出了 YaRN(Yet another RoPE extensioN method,另一种 RoPE 扩展方法),一种计算高效的方法来扩展此类模型的上下文窗口,所需的标记数量比以前的方法少 10 倍,训练步骤少 2.5 倍。
Introduction
目前 Decoder Only 结构的大模型,在扩展长上下文能力上的主要限制来自于位置编码。想办法通过少量微调 (或不进行微调) 动态扩展上下文窗口是目前研究的重点。
最初的 Transformer 使用绝对位置编码(正余弦),后来改进为可学习的绝对位置编码(Embedding)。目前通用的位置编码是相对位置编码,RoPE。后续很多的工作,如 NTK、Dynamic NTK,基本上都是基于 RoPE 的改进。
包括本篇文章提出的 YaRN。
YaRN 在对不到 0.1% 的原始预训练数据进行微调后,在上下文窗口扩展中达到了最先进的性能。同时,通过与称为 Dynamic Scaling 的推理时间技术相结合,Dynamic-YaRN 允许 2 倍以上的上下文窗口扩展,无需任何微调。
Background and Related Work
旋转位置编码
RoPE 是老生常谈了,就不介绍了。
在实际坐标中,可以使用以下函数表示 RoPE
f W ( x m , m , θ d ) = ( c o s m θ 1 − s i n m θ 1 0 0 ⋯ 0 0 s i n m θ 1 c o s m θ 1 0 0 ⋯ 0 0 0 0 c o s m θ 2 − s i n m θ 2 ⋯ 0 0 0 0 s i n m θ 2 c o s m θ 2 ⋯ 0 0 0 0 0 0 ⋯ c o s m θ l − s i n m θ l 0 0 0 0 ⋯ s i n m θ l c o s m θ l ) W x m f_{W}\left(x_{m}, m, \theta_{d}\right)=\left(\begin{array}{ccccccc} 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 \\ 0 & 0 & 0 & 0 & \cdots & cos m \theta_{l} & -sin m \theta_{l} \\ 0 & 0 & 0 & 0 & \cdots & sin m \theta_{l} & cos m \theta_{l} \end{array}\right) W x_{m} fW(xm,m,θd)= cosmθ1sinmθ10000−sinmθ1cosmθ1000000cosmθ2sinmθ20000−sinmθ2cosmθ200⋯⋯⋯⋯⋯⋯0000cosmθlsinmθl0000−sinmθlcosmθl Wxm
位置插值
给定一个是用 RoPE 做预训练的大语言模型,通过以下方式修改 RoPE:
f W ′ ( x m , m , θ d ) = f W ( x m , m L L ′ , θ d ) f_{W}'\left(x_{m}, m, \theta_{d}\right)=f_{W}\left(x_{m}, \frac{m L}{L'}, \theta_{d}\right) fW′(xm,m,θd)=fW(xm,L′mL,θd)
其中 L ′ > L L'>L L′>L 是超出预训练限制的新上下文窗口。利用原始的预训练模型和修改后的 RoPE 公式,可以在减少几个数量级的 token 上进一步微调语言,实现上下文窗口扩展。
原理就是“抽象的拉抻”,把原来训练好的 L 个窗口大小的输入长度,通过加因子变长。(比如原长度为 1000,除以 0.8,就变成 1250。)
为了方便介绍后续方法,重写并简化为以下一般形式:
f W ′ ( x m , m , θ d ) = f W ( x m , g ( m ) , h ( θ d ) ) f_{W}'\left(x_{m}, m, \theta_{d}\right)=f_{W}\left(x_{m}, g(m), h\left(\theta_{d}\right)\right) fW′(xm,m,θd)=fW(xm,g(m),h(θd))
因此对于 f W ′ f_{W}' fW′, g ( m ) = m / s g(m)=m / s g(m)=m/s, h ( θ d ) = θ d h(\theta_{d})=\theta_{d} h(θd)=θd
Methodology
高频信息丢失——“NTK 感知”插值
为了解决在插值 RoPE 嵌入时丢失高频信息的问题,提出了 “NTK-aware” 插值,NTK 感知插值不是将 RoPE 的每个维度均等地缩放一个因子 s ,而是通过减少高频和增加低频来将插值压力分散到多个维度。可以通过多种方式获得这样的变换,但最简单的是对 θ 的值进行更改:
g ( m ) = m g(m)=m \quad g(m)=m
h ( θ d ) = b ′ − 2 d / ∣ D ∣ , h\left(\theta_{d}\right)=b^{\prime-2 d /|D|}, \quad h(θd)=b′−2d/∣D∣,
b ′ = b ⋅ s ∣ D ∣ ∣ D ∣ − 2 b'=b \cdot s^{\frac{|D|}{|D|-2}} b′=b⋅s∣D∣−2∣D∣
b b b 是常数,通常会给个固定值,如 32k。
与 PI 相比,这种方法在扩展非微调模型的上下文大小方面表现得要好得多。这种方法的一个主要缺点是,鉴于它不仅仅是一个插值方案,某些维度会略微外推到“越界”值,因此使用 “NTK 感知” 插值进行微调会产生不如 PI 的结果。此外,由于“越界”值,理论比例因子 s 并不能准确描述真实的上下文扩展比例。在实践中, scale 值 s 必须设置为高于给定上下文长度扩展的预期 scale 。
没太理解为什么会越界,改造后的 b ′ b' b′ 不应该比原来的 b b b 小吗?
相对局部距离丢失 - “NTK-by-parts” 插值
因为 λ d = 2 π θ d = 2 π b 2 d ∣ D ∣ \lambda_{d}=\frac{2 \pi}{\theta_{d}}=2 \pi b^{\frac{2 d}{|D|}} λd=θd2π=2πb∣D∣2d,所以作者打算抛开辐角不谈,从波长的角度理解位置编码。作者提出两个观点:
- 给定上下文大小 L ,有一些维度 d 的波长长于预训练期间看到的最大上下文长度 ( λ > L ) (\lambda>L) (λ>L) ,这表明某些维度的嵌入在旋转域中分布不均匀。
- 当以更小的 b ′ b' b′ 拉伸所有 RoPE 维度时,辐角更小,波长更大,所有 token 都彼此更接近,两个向量旋转量较少的点积更大。这种缩放严重损害了 LLM 理解其内部嵌入之间的小关系和局部关系的能力。
所以作者提出如果波长 λ 远小于上下文大小 L ,则不进行插值;如果波长 λ 等于或大于上下文大小 L ,只想插值并避免任何外推;介于两者之间的维度可以同时具有两者,类似于 “NTK-aware” 插值。
因此,在原始上下文大小 L 和波长 λ 之间引入比率 r = L λ r=\frac{L}{\lambda} r=λL。
为了定义不同插值策略的边界,引入了两个额外的参数 α , β 。
函数 r 定义为
γ ( r ) = { 0 , i f r < α 1 , i f r > β r − α β − α , o t h e r w i s e . \gamma(r)= \begin{cases}0, & if r<\alpha \\ 1, & if r>\beta \\ \frac{r-\alpha}{\beta-\alpha}, & otherwise. \end{cases} γ(r)=⎩ ⎨ ⎧0,1,β−αr−α,ifr<αifr>βotherwise.
动态缩放 - “动态 NTK”插值
传统的比例因子:在整个推理周期中,嵌入层是固定的,比例因子 s = L ′ / L s=L' / L s=L′/L,其中 L ′ L' L′ 是扩展上下文大小的固定数量。
动态比例因子:在每次前向传递中,位置嵌入会更新比例因子 s = m a x ( 1 , l ′ / L ) s=max (1, l' / L) s=max(1,l′/L),其中 l ′ l' l′ 是当前序列的序列长度。
YaRN
最后,除了“NTK-by-parts” 插值技术,在注意力 softmax 之前的 logits 上引入温度 t,将注意力权重的计算修改为 s o f t m a x ( q m T k n t ∣ D ∣ ) softmax\left(\frac{q_{m}^{T} k_{n}}{t \sqrt{|D|}}\right) softmax(t∣D∣qmTkn)
对于 LLaMA 和 Llama 2 模型,推荐以下值: 1 t = 0.1 l n ( s ) + 1 \sqrt{\frac{1}{t}}=0.1 ln (s)+1 t1=0.1ln(s)+1
最终汇总得到 YaRN 方法。YaRN 方法在微调和非微调场景中都超越了所有以前的方法。由于其占用空间小,YaRN 允许与修改注意力机制的库直接兼容,比如 Flash Attention2。
Experiments
实验部分略。