这篇文章,我们还是从面试官的视角出发,一起来分析一下,如果你在面试现场被问到这个题目,应该如何回答?
1.面试官心理分析
首先还是分析一下面试官的心理,面试官问这个问题,主要是想考察三点:
- 第一,你知不知道长度外推这个概念?很多同学可能听都没听过这个概念,那这个问题当然也就无从答起了。
- 第二,deepseek 采用了哪种长度外推方案?面试官希望你能讲清楚这个外推算法的底层细节。
- 第三,这种方案相比之前的方法,它好在哪里?这就更进一层了,需要你通过自己的理解总结概括一下。
好,那接下来我们就沿着面试官的心理预期,来分析一下这道题目!
2.面试题解析
首先回答第一层,什么是长度外推?
顾名思义,长度外推,就是不需要用长序列数据进行额外的训练,只用短序列语料对模型进行训练,就可以得到一个能够处理和预测长序列的模型,也就是我们所说的“Train Short,Test Long”。
那么如何判断一个模型能否用于长序列呢?最基本的指标,就是模型的长序列 Loss 或者 PPL 不会爆炸。
更加符合实践的评测,则是输入足够长的 Context,让模型去预测答案,然后跟真实答案做对比,计算 BLEU、ROUGE,LongBench 这几个指标。
然后回答第二层,deepseek 采用了一种叫 YaRN 的长度外推算法。
具体来说,YaRN 是基于 NTK-aware 方法的进一步拓展,通过结合温度缩放和 NTK-by-parts 插值,来提升长文本外推能力。
即 YaRN = NTK-aware + NTK-by-parts + Dynamic NTK。
然后我们看一下,这个算法是怎么做的。我们首先回顾一下 ROPE 的公式:
图片
从公式中可以看到,m-n 是相对位置的距离,θi 是旋转的频率。
那怎么理解这个公式呢?
我们知道,对于三角函数,不同取值本质上就等于在一个单位圆上的点。
如果 m-n 逐渐变大,也就是相对距离越来越远,则相当于在圆上旋转,如果 θ 越大,则代表在圆上旋转越快。theta 对应频率,根据频率和周期的关系,频率越大,周期越小。
我们来看这张图,左右分别代表一个大的 θ 和一个小的 θ 的旋转情况。大 θ 旋转超过一周了,小 θ 才旋转一个半圆。
图片
然后我们来看一下 YaRN 的核心思想,假设训练的长度是 L,那 m-n 的取值范围是 [0,L-1]。
θ 越大,则转速越快,也就是 m-n 从 0 到 L-1 的期间,已经转了很多圈,也就是说圆上的每一个点几乎都被训练过,这类 theta 不存在长度外推的问题。也就是对于高频信息,不动。
对于小的那些 θ,也就是 m-n 从 0 到 L-1 的期间,可能转了还没有一圈,圆上还存在很多空白。
那这种情况,如果测试长度 M 大于 L,则很有可能就超出了训练过的那一段圆弧,从而造成长度外推失败。
YaRN 的做法也很直接,直接把此时的 θ 压回到训练过的那一段圆弧范围内,这样就减少了实际预测时跑到空白的地方。也就是 θ 会乘一个缩放因子 L/M。
我们可以设一个圈数的阈值 τ,如果圈数超过 τ 的,就认为已经充分训练了,可以不加改动;
圈数少于 1 的,θ 改为 θ*L/M,也就是要把超出弧范围的重新缩放到弧内,至于二者之间的部分,就在两者之间线性插值过渡。
也就是论文这个公式所表达的含义:
图片
YaRN 的第二个点是解决线性内插导致的 self-attention 点积的值增大的问题。
由于线性内插会改变旋转向量转动的幅度,也就是隔得更近了。原来距离较远的 q,k 点积由于旋转幅度变小,他们的点积结果会增大,进而导致 Softmax 操作过于“锐化”,使得注意力分布集中于少数位置,削弱了模型对全局上下文的关注能力。
Yarn 在 NTK-by-parts 基础上,引入了注意力温度因子,来调整注意力分布。
我们看公式:
图片
3.总结
最后总结一下,这个算法有哪些优势呢?
首先,YaRN 可以直接和修改注意力机制的库兼容,比如 Flash attention,因此不会有额外的实现成本和推理成本。Flash 在目前的主流底层框架实现基本是标配了,所以这一点很重要。
第二个是效果拔群,YaRN 这个算法目前在各种大模型和和不同架构上对比实验表明,是一个非常强的 SOTA。
所以目前主流的大模型,如 LLaMA 的改进系列,Qwen2.5 和 DeepSeek,都选择了用 YaRN 来做长度外推。