目前大模型的外推的工作基本上都是基于RoPE旋转编码,主要在于修改RoPE的旋转频率(内插或者修改RoPE的alpha值)。
苏建林在位置编码上的看法:
在直觉上,相信很多读者觉得像Sinusoidal或RoPE之类的函数式位置编码,它们没有训练参数,长度外推性应该很好才对,但事实上并非如此,这类位置编码并没有在长度外推方面表现出什么优势。为什么会这样呢?其实是大家在假设函数式位置编码的外推性时,忘了它的基本前提——“光滑性”。
其实,外推性就是局部推断整体,对此我们应该并不陌生,泰勒级数近似就是经典的例子,它只需要知道函数某点处若干阶导数的值,就可以对一个邻域内的值做有效估计,它依赖的就是给定函数的高阶光滑性(高阶导数存在且有界)。但是Sinusoidal或RoPE是这种函数吗?并不是。它们是一系列正余弦函数的组合,其相位函数是k/100002i/d𝑘/100002𝑖/𝑑,当2i/d≈02𝑖/𝑑≈0时,函数近似就是sink,cosksin𝑘,cos𝑘,这算是关于位置编码k𝑘的高频振荡函数了,而不是直线或者渐近趋于直线之类的函数,所以基于它的模型往往外推行为难以预估。能否设计不振荡的位置编码?很难,位置编码函数如果不振荡,那么往往缺乏足够的容量去编码足够多的位置信息,也就是某种意义上来说,位置编码函数的复杂性本身也是编码位置的要求。
1 PI RoPE
内插法就是对每一个seq_len的token进行频率内插。
2 ABF – RoPE
ABF(Adjusted Base Frequency)直接修改RoPE的base,将其从10000修改为更大的数字,放慢其旋转角度。
3 RePoPE
4 YaRN
5 ALiBi
相比修改RoPE,ALiBi实现了一种新的相对位置,ALiBi直接将相对位置作为一种惩罚加到Attention中。