题目: YaRN: Efficient Context Window Extension of Large Language Models
论文地址: YaRN: Efficient Context Window Extension of Large Language Models
I. 前言
在之前的两篇文章中分别介绍了上下文长度扩展的两种方案:
其中PI线性缩放所有位置索引,并平等地对待每个维度;NTK-aware则实现了高频外推和低频内插,缓解了高频也就是低维的压力,使模型能够更好地区分不同位置间的精细区别。
为了引出上述两种方案存在的问题,这里先引入一个新的定义:给定RoPE中一个具体的维度
i
i
i,则这个维度的波长被定义为:
λ
i
=
2
π
θ
i
=
2
π
b
−
2
(
i
−
1
)
/
d
=
2
π
b
2
(
i
−
1
)
/
d
\lambda_i = \frac{2\pi}{\theta_i} = \frac{2 \pi}{b^{-2(i - 1) / d}} = 2\pi b^{2(i-1)/d}
λi=θi2π=b−2(i−1)/d2π=2πb2(i−1)/d基于波长公式,我们有如下结论:
- 波长描述了为了在维度 i i i处嵌入的旋转位置执行全旋转( 2 π 2\pi 2π)所需的token的长度。
- 维度越高波长越长。
从上图我们知道第
i
i
i个维度(两两一组)处二维复向量的旋转角度为
m
θ
i
m\theta_i
mθi,为了能够在该维度处执行全旋转,令
m
θ
i
=
2
π
m\theta_i = 2\pi
mθi=2π,则
λ
i
=
m
\lambda_i = m
λi=m,所以波长描述了为了在维度
i
i
i处执行全旋转(
2
π
2\pi
2π)所需的token的长度。
像PI这种类型的插值方案不关心波长的维数,我们将这些方法称为“盲”插值方法(blind interpolation),比如像PI和“NTK-aware”插值这样的blind interpolation方法中,我们面对所有RoPE隐藏维度没有做任何针对性的处理。而其他方法如这篇文章提出的YaRN,我们将其归类为“有针对性的”插值方法,即有对RoPE的不同维度做出不同处理。
II. NTK-by-parts
为了针对不同维度做出不同的处理,YaRN中首先定义了NTK-by-parts插值方法。具体来说,关于RoPE中不同维度的波长,有如下结论:
存在某些维度 i i i,其波长 λ i \lambda_i λi大于在预训练期间看到的最大上下文长度 L L L
从理论上来讲,RoPE是一种编码绝对位置的方法。然而,我们前面说过,波长描述了为了在维度 i i i处嵌入的旋转位置执行全旋转( 2 π 2\pi 2π)所需的token的长度,如果某些维度的波长大于上下文长度 L L L,这说明该维度无法执行全旋转。在这种情况下,由于维度在预训练期间至少不会完全旋转一次,如果我们选择第一个令牌作为基准,那么在预训练期间每隔一个令牌到它的距离是唯一的,神经网络可以用它来确定它的绝对位置信息。相反,如果某个维度波长小于 L L L,那该维度就执行了至少一次全旋转,我们就无法在这个维度描述绝对距离,只能描述相对位置信息。
考虑到上述观察,作者认为,不要对只编码相对位置信息的维度( λ i < L \lambda_i < L λi<L)进行内插破坏,因为它们对于模型区分附近令牌的相对顺序至关重要。同时,应该始终对仅编码绝对位置信息的维度( λ i > L \lambda_i > L λi>L)进行内插,因为较大的距离将超出之前模型能够编码的距离。因此,可以制定一种考虑以上所有因素的显式且有针对性的插补方法,即:
- 如果波长远小于 L L L,即编码相对位置的维度,不进行内插
- 如果波长等于或大于 L L L,即编码绝对位置的维度,应该进行内插以防止超出绝对位置的最大可编码范围
- 波长介于上述之间的维度,采用NTK-aware方法
为了定义上述不同内插策略的边界,首先基于前面的NTK-aware把波长定义为:
λ
i
=
2
π
θ
i
=
2
π
(
b
⋅
S
d
/
(
d
−
2
)
)
−
2
i
/
d
=
2
π
(
b
⋅
S
d
/
(
d
−
2
)
)
2
i
/
d
\lambda_i = \frac{2\pi}{\theta_i} = \frac{2 \pi}{(b \cdot S^{d/(d-2)})^{-2i / d}} = 2\pi (b \cdot S^{d/(d-2)})^{2i/d}
λi=θi2π=(b⋅Sd/(d−2))−2i/d2π=2π(b⋅Sd/(d−2))2i/d其中
i
i
i从0开始计数。接着将上下文长度
L
L
L和波长的比值定义为:
r
(
i
)
=
L
λ
i
r(i)=\frac{L}{\lambda_i}
r(i)=λiL然后,定义一个分段函数如下:
γ
(
r
)
=
{
0
if
r
<
α
,
1
if
r
>
β
,
r
−
α
β
−
α
otherwise
.
\gamma(r)= \begin{cases} 0 & \text{if } r < \alpha, \\ 1 & \text{if } r > \beta, \\ \frac{r-\alpha}{\beta-\alpha} & \text{otherwise}. \end{cases}
γ(r)=⎩
⎨
⎧01β−αr−αif r<α,if r>β,otherwise.基于上述分段函数,NTK-by-parts被定义为:
f
p
a
r
t
s
(
x
m
,
m
,
θ
)
=
f
(
x
m
,
g
(
m
)
,
h
(
θ
i
)
)
g
(
m
)
=
m
h
(
θ
i
)
=
(
1
−
γ
(
r
(
i
)
)
)
θ
i
S
+
γ
(
r
(
i
)
)
θ
i
\begin{aligned} f_{parts}(x_m, m, \theta) &= f(x_m, g(m), h(\theta_i))\\ g(m)&=m\\ h(\theta_i)=(1 - &\gamma( r(i) ) )\frac{\theta_i}{S} + \gamma( r(i) )\theta_i \end{aligned}
fparts(xm,m,θ)g(m)h(θi)=(1−=f(xm,g(m),h(θi))=mγ(r(i)))Sθi+γ(r(i))θi在原文中,作者针对LLaMA系列模型给出的建议参数值为
α
=
1
\alpha=1
α=1和
β
=
32
\beta=32
β=32。简单来说,如果当前维度的波长远小于上下文长度
L
L
L(即远小于L/32)时不内插,即
h
(
θ
i
)
=
θ
i
h(\theta_i)=\theta_i
h(θi)=θi;当波长大于等于上下文长度L(即大于
α
L
\alpha L
αL)时执行内插,此时有
h
(
θ
i
)
=
θ
i
S
h(\theta_i)=\frac{\theta_i}{S}
h(θi)=Sθi。
笔者曾在Qwen2系列模型上尝试多个组合值,发现效果始终不如 α = 1 \alpha=1 α=1和 β = 32 \beta=32 β=32,这说明两个参数具有较好的代表性。
III. YaRN
YaRN的作者注意到,无论数据样本或者扩展上下文窗口上的令牌位置怎么样,在计算自注意力公式中引入温度系数
t
t
t对困惑度ppl有着一致的影响。为此,将该公式改为:
softmax
(
q
m
⊤
k
n
t
d
)
\text{softmax}(\frac{q_m^{\top}k_n}{t\sqrt{d}})
softmax(tdqm⊤kn)为了实现上述公式,只需要将两个位置的旋转位置嵌入各自缩放为原来的
1
/
t
1/\sqrt{t}
1/t即可,而无需做其他任何操作。
最后,将NTK-by-parts技术和上面自注意力计算公式结合,便得到了YaRN。
作者在原文中基于实验给出了
1
/
t
1/\sqrt{t}
1/t的表达式:
1
t
=
0.1
ln
S
+
1
\sqrt{\frac{1}{t}}=0.1 \ln S + 1
t1=0.1lnS+1笔者曾根据作者的方法对Qwen2系列模型的温度系数参数进行了拟合,发现效果远差于上式。因此建议使用YaRN扩展除LLaMA以外的模型时,也可以直接采用上式。
IV. Dynamic NTK
在真正使用模型时,我们无法保证每次输入的长度都是固定的。在这种情况下,有以下两种方法得到扩展因子 S S S:
- 在整个推理周期中, S = L ′ L S=\frac{L^{'}}{L} S=LL′是固定的,保证模型输入的最大长度不超过扩展后的长度 L ′ L^{'} L′即可
- 根据每次输入的长度来动态调整 S S S,进而动态内插。扩展比被定义为 S = max ( 1 , l ′ / L ) S=\max(1, l^{'} / L) S=max(1,l′/L),其中 l ′ l^{'} l′为当前输入的长度。
第一种方式的问题是,当序列长度小于L时,模型的性能可能会出现一些折扣,而当序列长度大于L时,模型的性能会退化。但通过像方式2那样进行动态缩放,它允许模型在达到训练的上下文限制时较为缓慢地退化性能,而不是骤降。
将上述动态缩放和NTK-aware插值相结合时,我们称之为动态NTK插值。