Appearance
Yet another RoPE extensioN——通过调整 RoPE 的频率缩放,让训练时短上下文的模型能够外推到更长的上下文。
为什么需要 YaRN
RoPE 位置编码在训练时有固定的上下文长度(如 128K)。推理时如果输入超过训练长度,模型对超出部分的位置编码没有见过,性能骤降。
YaRN 不需要重新训练,通过数学技巧调整 RoPE 的频率,让模型"认为"远处的 token 仍在熟悉的位置范围内。
核心原理
标准 RoPE: θ_i = 1 / (10000^(2i/d))
YaRN 缩放: θ_i = 1 / (10000^(2i/d)) × scale_factor
scale_factor = 目标长度 / 原始长度
例如: 训练 128K → 推理 1M,scale_factor = 1M/128K = 8
低频分量(i 大): 直接缩放频率
高频分量(i 小): 保持原始频率(高频信息更重要)
中频分量: 线性插值三段式策略:低频缩放、中频插值、高频保持,在长度外推和信息保留之间取得平衡。
在 ds4.c 中的实现
rope_tail_ext_inplace()(ds4.c 约 4694 行)接受 rope_freq_base 和 rope_ext_factor 参数,YaRN 通过调整这两个参数实现上下文扩展。