大模型专题:长上下文系列(一)
YaRN: Efficient Context Window Extension of Large
Language Models [ICLR’25] [PDF]
整体概述
YaRN是Yet another RoPE extensioN method的缩写,是对旋转位置编码(RoPE)的一种改进,目的是让LLM在推理阶段可以处理比训练阶段更长的文本。
问题背景
考虑到训练资源,LLM往往在较短的context窗口下进行预训练,然而,现在的很多下游任务往往需要更长的context窗口,比如把一篇PDF甚至一本书塞进LLM,让它利用ICL能力回答问题。因此如何通过少量微调(或不进行微调)动态扩展上下文窗口成为一个重要的研究课题。
不能扩展的重要原因出在位置编码上,以目前广泛使用的旋转位置编码RoPE举例,如果训练时context窗口为4096,那RoPE只能编码0~4095的相对位置信息,此时把推理时的context窗口扩展为8192,那4096~8191的相对位置信息是LLM从未见过的,因此会出现高PPL。
最开始的解决思路是Position Interpolation(PI),有两篇同期工作:[1]
[2]。思路比较简单,单纯改索引,公式如下,比如推理时是8192,那么新的位置索引
i
′
=
i
×
4096
8192
i'=\frac{i\times4096}{8192}
i′=8192i×4096,2变成了1,但同时1也变成了0.5,这个也是LLM没见过的,但通过微调LLM可以较好地泛化过去,工作 [1] 用几十亿的数据微调后取得了较好效果。
PI这种插值方式太简单粗暴了,对于嵌入的所有维度而言都一样,没有考虑它们在周期上的差异:
文中称PI为"blind" interpolation method,而YaRN为"targeted" interpolation method,那么是如何targeted的呢,让我们继续看下去~
具体方法
YaRN在正式介绍自己方法之前,回顾了先前的一些方法,包括"NTK-aware"、“NTK-by-parts"和"Dynamic NTK”。
NTK-aware
在RoPE中,维度索引
i
i
i越大,
θ
i
\theta_i
θi越小,则周期越大,频率越小。对于周期小的维度,直接内插会使相邻位置的区分度变小。NTK-aware改变这一问题的思路是高频外推、低频内插。为什么高频做外推?举个例子,1200在周期小的维度里可能和1000值相同,但周期大的维度(大于1200)里就没有和它相同值的position,此时应该做内插,而低频做内插也基本不破坏区分度。NTK-aware用如下公式实现高频外推、低频内插:
m
(
β
λ
)
2
i
d
\frac{m}{(\beta\lambda)^{\frac{2i}{d}}}
(βλ)d2im
其中
λ
2
i
d
\lambda^{\frac{2i}{d}}
λd2i在
i
i
i很小时趋近于1,等价于
m
β
2
i
d
\frac{m}{\beta^{\frac{2i}{d}}}
βd2im,即高频外推。在最低频,即
i
=
d
−
2
2
i=\frac{d-2}{2}
i=2d−2时,有
m
(
β
λ
)
2
i
d
=
m
β
2
i
d
s
,
s
=
L
′
L
\frac{m}{(\beta\lambda)^{\frac{2i}{d}}}=\frac{m}{\beta^{\frac{2i}{d}}s}, s=\frac{L'}{L}
(βλ)d2im=βd2ism,s=LL′
可以求得
λ
=
s
d
d
−
2
\lambda=s^{\frac{d}{d-2}}
λ=sd−2d。
对于最高频,单纯外推;对于最低频,单纯内插;中间频率是外推和内插的结合。
NTK-by-parts
PI和NTK-aware都是"blind"内插法,因为所有维度被等价处理。NTK-by-parts是把维度按照波长区分开来:
- 如果波长比上下文长度小得多,此时单纯外推
- 如果波长等于或大于上下文长度,此时只做插值,不做任何外推(不像以前的“NTK-aware”方法会在中间频率既内插又外推)
- 两者之间的维度可以兼而有之,类似于“NTK-aware”插值
以下公式中
d
d
d代表索引
i
i
i,
∣
D
∣
|D|
∣D∣代表维度数
d
d
d。
新的
θ
d
′
\theta_d'
θd′为
可以认为,NTK-by-parts是NTK-aware的加强版,用波长和上下文长度的关系设立了两道分割线,NTK-aware也是两道分割线,但一个在最左,一个在最右,不如NTK-by-parts的针对性强。实验表明,NTK-by-parts无需微调,效果优于NTK-aware。
Dynamic NTK
思想很简单,就是在生成本来就在原窗口内的文本时(
<
L
<L
<L),不需要NTK,此时把
s
s
s设为1即可。
YaRN
终于到YaRN了~
YaRN发现,除了用插值这些方法,在softmax操作里引入一个温度系数也可以降低扩展上下文时的困惑度,而且这个温度系数不受数据样本、token位置的影响。
这个公式不是推出来的,是根据PPL(w/ NTK-aware)和温度系数的曲线拟合出来的。
实验结果
待更…