赞
踩
下半年以来,我全力推动我司大模型项目团队的组建,我虽兼管整个项目团队,但为了并行多个项目,最终分成了三个项目组,每个项目都有一个项目负责人,分别为霍哥、阿荀、朝阳
YaRN本质上是一种新的RoPE扩展方法(至于RoPE详见此文),可以比较高效的扩展大模型的上下文窗口,本文的写就基于YaRN论文:YaRN: Efficient Context Window Extension of Large Language Models,且为方便大家更好的理解本文,特地提前列下本文重要的几个参考文献(当下文出现带中括号的[6]、[7]、[9]时,便特指的以下相关文献)
有何问题 欢迎随时留言评论,thanks
注,本部分内容援引自苏剑林博客中的部分内容,为更易懂,我在其基础上做了一定的修改、解读
假设我们有一个1000以内(不包含1000)的整数要作为条件输入到模型中,那么要以哪种方式比较好呢?
苏剑林说,假设我们还是用三维10进制表示训练了模型,模型效果还不错。然后突然来了个新需求,将n上限增加到2000以内,那么该如何处理呢?
如果还是用10进制表示的向量输入到模型,那么此时的输入就是一个四维向量了。然而,原本的模型是针对三维向量设计和训练的,所以新增一个维度后,模型就无法处理了。可能有读者想说,为什么不能提前预留好足够多的维度呢?
没错,是可以提前预留多几维,训练阶段设为0,推理阶段直接改为其他数字,这就是外推(Extrapolation)
然而,训练阶段预留的维度一直是0,如果推理阶段改为其他数字,效果不见得会好,因为模型对没被训练过的情况不一定具有适应能力。也就是说,由于某些维度的训练数据不充分,所以直接进行外推通常会导致模型的性能严重下降。
于是,有人想到了将外推改为内插(Interpolation),简单来说就是将2000以内压缩到1000以内
当然,有读者会说外推方案也可以微调。是的,但内插方案微调所需要的步数要少得多
有没有不用新增维度,又能保持相邻差距的方案呢?有,那就是进制转换
刚才说到,我们关心的场景主要利用序信息
另外,为了进一步缩窄外推范围,我们还可以换用更小的即13进制而不是16进制
基于transformer的大型语言模型已经成为许多NLP任务的首选模型,其远程能力(如上下文学习(ICL))至关重要。在执行NLP任务时,其上下文窗口的最大长度一直是预训练LLM的主要限制之一。故,是否能够通过少量的微调(或不进行微调)来动态扩展上下文窗口已经变得越来越受关注。为此,transformer的位置编码是经常讨论的核心焦点问题
此后,对“NTK感知”插值提出了两项改进
“NTK感知”插值和“Dynamic NTK”插值已经在开源模型中出现,如Code Llama[31](使用“NTK感知”插值)和Qwen 7B[2](使用“动态NTK”)
YaRN的基础是[RoFormer: Enhanced transformer with rotary position embedding]中介绍的旋转位置嵌入(RoPE)
RoPE是理解本文的重要基础,但考虑到本博客内已有另一篇文章详细阐述了位置编码与RoPE,所以如果你对本节有任何疑问,可进一步参考此文《一文通透位置编码:从标准位置编码、欧拉公式到旋转位置编码RoPE、ALiBi》
所以下面只参照YaRN论文做个最简单的回顾
首先,如苏剑林所说,位置的旋转位置编码(RoPE),本质上就是数字的进制编码
也就是先除以次方,然后求模(余数)
以上咋推导得来的呢?为方便大家一目了然,我再解释下
例如,让我们找到十进制数12345中从右边数的第三位的数字,相当于,(因为是十进制),(因为要找的是第三位)
- 按照公式,我们首先计算
- 然后,我们计算 除以 ,即
- 接下来,我们取这个结果的向下取整值,也就是去掉小数部分,得到
- 最后,我们对 取模,得到
所以,12345的从右边数的第三位数字是3
其次,苏剑林在其博客中再说道
其中,
可能有的读者还是有点问题,可能还是得再解释下
首先,我们通过上文已多次提到的此文《一文通透位置编码:从标准位置编码、欧拉公式到旋转位置编码RoPE、ALiBi》,来回顾下transformer原始论文中的Sinusoidal位置编码
如阿荀所说,可知
其中
- 的取值范围为,啥意思?意味着
所以,也就有了上面的公式2
pos
(0 2 4等偶数维用sin函数计算)公式2中的指数项 0 0 1 0 2 1 3 1 4 2 5 2 6 .... 510 511
现在,对比公式1、公式2,是不是也有一模一样的
至于模运算,它的最重要特性是周期性,而公式2的cos、sin是不是刚好也是周期函数?所以,除掉取整函数这个无关紧要的差异外,RoPE(或者说Sinusoidal位置编码)其实就是数字的进制编码
// 待更
此文《一文通透位置编码:从标准位置编码、欧拉公式到旋转位置编码RoPE、ALiBi》的第4部分已经详细介绍过了ALiBi
简言之,ALiBi是对Transformers进行长度外推,即在短上下文窗口上进行训练,并在较长的上下文窗口上进行推理
// 待更..
由于语言模型通常是用固定的上下文长度进行预训练的,自然会问如何通过在相对较少的数据量上进行微调来扩展上下文长度
对于使用RoPE作为位置嵌入的语言模型,Chen等人[9]和kaiokendev[21]同时提出了位置插值(position Interpolation, PI),将上下文长度扩展到预训练极限之外
对于后者,(Super-HOT kaiokendev(2023)),它在RoPE中插入了位置编码,将上下文窗口从2K扩展到8K
对于前者,按照该篇论文《Extending context window of large language models via positional interpolation》,可知
最终,通过位置插值方法,将预训练的7B、13B、33B和65B LLaMA模型(Touvron等人,2023)扩展到大小为32768的各种上下文窗口,除了重新缩放使用位置插值扩展的模型的位置索引外,没有以任何方式修改LLaMA模型架构
话说,位置插值法有什么问题呢?
- 我们先看下三角函数,它的周期是
对应到RoPE里的每个维度,其中 (其中, 是指位置, 是指维度)- 计算得到周期为:,其中,用 表示base,即10000
从周期计算的公式我们可以知道,针对不同的维度编码 ,每个维度对应的三角函数周期是越来越大的(即对应到低频、高频)
如果插值是针对绝对位置,那么对每个维度 都同等地生效;但是周期小(高频)维度,插值之后会变得很密集(本来一个周期包含10个值,但是内插之后能包含20个值),这样高频的维度就变的很拥挤
为了解决RoPE嵌入插值时丢失高频信息(losing high frequency information when interpolating the RoPE embeddings)的问题,Reddit一网友通过[NTK-Aware Scaled RoPE allows LLaMA models to have extended (8k+) context size without any fine-tuning and minimal perplexity degradation]开发了“NTK-aware”插值,核心思想是:高频外推,低频内插
啥意思呢,其实我们是要把2.1.2节中的公式2
该公式2中的最低频项,引入参数,从而变为,让它跟内插一致(内插就是将换成,其中是要扩大的倍数),即
从而解得
而公式2中的最高频是项,引入后变为,由于通常很大,很接近1,所以它还是接近于,即等价于外推
从而,NTK-aware便这样把外推和内插给结合起来了
YaRN论文中对“NTK-aware”的内插方案是如下表述的(虽和上面的表示一个本质,但符号和表述上有不同)
“NTK-aware”插值是对RoPE的修改,使用
和以下函数
且
其中相当于上面的,且 类似于上面的,相当于上面的
可能有同学有疑问了,咋和上面的表示不一致呢?
原因如阿荀所说
- 上面(进制角度)的和这里(YaRN论文)的才是一回事(容易把上面的和这里的混淆看做同一个)
- 且上面(进制角度)的计数范围是从0到d/2-1的,而这里(YaRN论文)的计数范围是从1到|D|/2的
与位置插值PI相比,该方法在扩展非微调模型的上下文大小方面表现得更好
我们注意到,在本文发布前不久,Code Llama[31]发布了,并通过手动将基数b扩展到1M来使用“NTK-aware”扩展
在本节伊始,得先介绍一个概念,即波长,所谓波长,其描述的在维上嵌入的RoPE,执行完整旋转(2π)所需的标记长度
一般而言,把定义为RoPE嵌入在第隐维处的波长:
有一些插值方法(例如位置插值PI)不关心波长的维数,我们将这些方法称为“盲”插值方法(blind interpolation),比如像PI和“NTK-aware”插值这样的blind interpolation方法中,我们面对所有RoPE隐藏维度的没有做任何针对性的处理(因为它们对网络有相同的影响),而其他方法(如YaRN),我们将其归类为“有针对性的”插值方法
进一步,关于RoPE嵌入的一个有趣的观察是
为了解决上述问题,选择不插值更高频率的维度,而总是插值更低频率的维度(we choose not to interpolate the higher frequency dimensions at all while always interpolating the lower frequency dimensions)。特别是
因此,在原始上下文大小和波长之间引入比率,且在第个隐状态下,比率以如下方式依赖于
为了确定上述不同插值策略的边界,引入两个额外参数和,且针对所有隐藏维度
接下来,定义斜坡函数为
从而借助该函数,“NTK-by-parts”方法可以定义如下
“NTK-by-parts”插值是对RoPE的一种修改,基于以下函数
和的值根据具体情况进行调整。当然,通过实验发现,对于Llama家族的模型而言,其中和的比较好的取值是和
// 待更
在很多用例中,以从1到最大上下文大小不等的序列长度进行多次前向传递。一个典型的例子是自回归生成,其中序列长度在每一步之后递增1
有两种方法可以应用使用比例因子的插值方法(包括PI、"NTK-aware" and "NTK-by-parts"):
上述方法中,方法1的问题在于模型在长度小于时可能出现性能折扣,当序列长度大于时可能出现突然退化
对此,故提出了方法2,我们称这种推理时间方法为动态缩放方法,当再与“NTK-aware”插值相结合时,我们称之为“动态NTK”插值
一个值得注意的事实是,“动态NTK”插值在上预训练的模型上工作得非常好,而不需要任何微调()
介绍完“NTK-aware”插值、“NTK-by-parts”插值、"Dynamic NTK"插值之后,接下来即将介绍YaRN(另一种RoPE扩展方法),这是一种改进的方法,可以有效地扩展使用旋转位置嵌入(RoPE)训练的模型的上下文窗口,包括LLaMA[38]、GPT-NeoX[5]和PaLM[10]家族的模型
除了前述的插值技术,我们还观察到,在对logits进行softmax操作之前引入温度t可以统一地影响困惑度,无论数据样本和扩展上下文窗口上的token位置如何,更准确地说,我们将注意力权重的计算修改为
通过将RoPE重新参数化为一组2D矩阵对,给实现注意力缩放带来了明显的好处(The reparametrization of RoPE as a set of 2D matrices has a clear benefit on the implementation of this attention scaling)
对于LLaMA和LLaMA 2模型,我们推荐以下值:
上式是在未进行微调的LLaMA 7b、13b、33b和65b模型上,使用“NTK-by-parts”方法对各种因素的尺度扩展进行最小困惑度拟合得到的(The equation above is found by fitting p 1/t at the lowest perplexity against the scale extension by various factors s using the "NTK-by-parts" method)
且相同的t值也适用于Llama 2模型(7b、13b和70b),这表明熵增加和温度常数t的性质可能具有一定的“普遍性”,并且可以推广到某些模型和训练数据中(It suggests that the property of increased entropy and the temperature constant t may have certain degree of "universality" and may be generalizable across some models and training data)
// 待更
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。