NTK-Aware Scaled RoPE
- 正弦编码(Sinusoidal)
- 旋转位置编码RoPE
- 编码步骤:
- 旋转位置编码的优势
- NTK-Aware Scaled RoPE
- 直接外推
- 线性内插
- 进制转换
- 高频外推、低频内插的理解
- 位置编码
- 总结
- 参考:
长度外推技术是自然语言处理(NLP)领域中,特别是在处理长文本数据时,一个重要的研究方向。这项技术旨在使模型能够在较短的上下文窗口上进行训练,并在较长的上下文窗口上进行推理,即处理超出其训练时所见文本长度的序列。
正弦编码(Sinusoidal)
详细介绍:正弦编码(Sinusoidal)
我们知道正弦编码有以下特点:
- 具有相对位置表达能力:Sinusoidal可以学习到相对位置,对于固定位置距离的k,PE(i+k)可以表示成PE(i)的线性函数。
- 两个位置向量的内积只和相对位置 k 有关。
- Sinusoidal编码具有对称性。
- 随着k的增加,内积的结果会直接减少,即会存在远程衰减。
- 正弦编码不具备外推性。
虽然Sinusoidal只和相对位置有关。但是实际的Attention计算中还需要与attention的权重 W W W相乘,即 P E t T W q T W k P E t + k PE^T_tW^T_qW_kPE_{t+k} PEtTWqTWkPEt+k,这时候内积的结果就不能反映相对位置。
假设位置 m m m的位置编码为 p m p_m pm,位置n的位置编码为 p n p_n pn,如果使用正弦编码,那两个位置之间的 a t t e n t i o n attention attention可以表达为:
< f q ( x m , m ) , f k ( x n , n ) > = q m k m T = ( x m + p m ) W q W k T ( x n + p n ) T = x m W q W k T x n T + x m W q W k T p n T + p m W q W k T x n T + p m W q W k T p n T (1) <f_q(x_m,m), f_k(x_n, n)> = q_mk^T_m=(x_m+p_m)W_qW^T_k(x_n+p_n)^T=\\x_mW_qW^T_kx^T_n+x_mW_qW^T_kp^T_n+p_mW_qW^T_kx^T_n+p_mW_qW^T_kp^T_n \tag{1} <fq(xm,m),fk(xn,n)>=qmkmT=(xm+pm)WqWkT(xn+pn)T=xmWqWkTxnT+xmWqWkTpnT+pmWqWkTxnT+pmWqWkTpnT(1)
后面三项都是和绝对位置 m , n m,n m,n有关,无法表达成 m − n m-n m−n的形式,因此需要找到一种位置编码,使得下式成立:
< f q ( x m , m ) , f k ( x n , n ) > = g ( x m , x n , m − n ) (2) <f_q(x_m,m), f_k(x_n, n)> = g(x_m, x_n, m-n) \tag{2} <fq(xm,m),fk(xn,n)>=g(xm,xn,m−n)(2)
即接下来要介绍的旋转位置编码。
旋转位置编码RoPE
(详细证明:参考此文),即证明上式(2),以下是二维情况下的一个例子:
编码步骤:
- 对于 token 序列中的每个词嵌入向量,首先计算其对应的 query 和 key 向量
- 然后对每个 token 位置都计算对应的旋转位置编码,旋转参考
- 接着对每个 token 位置的 query 和 key 向量的元素按照 两两一组 应用旋转变换
- 最后再计算 query 和 key 之间的内积得到 self-attention 的计算结果
旋转位置编码的优势
- 除了具备标准位置编码的优点外,还具备一定的长度外推能力。
但是实验发现RoPE仍然存在外推问题,即测试长度超过训练长度之后,模型的效果会有显著的崩坏,具体表现为困惑度(Perplexity,PPL)等指标显著上升。
NTK-Aware Scaled RoPE
详细参考:Transformer升级之路:10、RoPE是一种β进制编码
直接外推
直接外推就是在高位扩展,然后通过微调,使模型适应新的位置编码。比如训练长度只有0-999,则需要三维向量(十进制),推理时最大输入长度为0-1999,那就需要在高位增加一维,由于训练时模型没有见过第四维的编码,因此需要经过微调。
线性内插
线性内插是指维数不变,将2000压缩到1000以内,比如通过除以二1601就会变成800.5,个位变成了0.5,就可以用三维表示。原本相邻数字的差距为1,现在是0.5,最后一个维度更加“拥挤”。所以,做了内插修改后,通常都需要微调训练,以便模型重新适应拥挤的映射关系。
进制转换
有没有不用新增维度,又能保持相邻差距的方案呢?有,我们也许很熟悉,那就是进制转换!三个数字的10进制编码可以表示0~999,如果是16进制呢?它最大可以表示 1 6 3 − 1 = 4095 > 1999 16^3-1=4095>1999 163−1=4095>1999所以,只需要转到16进制,如1749变为 [ 6 , 13 , 5 ] [6,13,5] [6,13,5],那么三维向量就可以覆盖目标范围,代价是每个维度的数字从0~9变为0~15。
我们关心的场景主要利用序信息,原来训练好的模型已经学会了 875 > 874 875>874 875>874,而在16进制下同样有 875 > 874 875>874 875>874,比较规则是一模一样的(模型根本不知道你输入的是多少进制)。唯一担心的是每个维度超过9之后(10~15)模型还能不能正常比较,但事实上一般模型也有一定的泛化能力,所以每个维度稍微往外推一些是没问题的。所以,这个转换进制的思路,甚至可能不微调原来模型也有效!另外,为了进一步缩窄外推范围,我们还可以换用更小的 ⌈ x 2000 ⌉ \lceil \sqrt[2000]{x} \rceil ⌈2000x⌉=13进制而不是16进制。
高频外推、低频内插的理解
外推:在数学和统计学中,外推(Extrapolation)指的是利用已有的数据或模型来预测超出已知数据范围的值。在机器学习模型中,外推通常指的是模型在处理其训练时未见过的输入时的能力。
高频外推:高频外推指的是在模型处理新的、更长的上下文时,对于捕捉快速变化的位置(低位)信息的高频分量,我们希望它们能够继续以原有的变化速率(即频率不变)向外扩展,以保持对短距离依赖关系的捕捉能力。这种外推是必要的,因为在长文本中,短距离的依赖关系仍然需要被准确捕捉,而高频分量正是负责这一任务的。
内插:在数学和统计学中,内插(Interpolation)指的是利用已知数据点之间的值来估计未知数据点的值。在机器学习模型中,内插通常指的是模型在其训练数据范围内处理输入时的能力。
低频内插:指的是在模型处理训练数据范围内的位置时,对于捕捉缓慢变化的位置信息的低频分量(高位),通过调整其频率或缩放(频率变小),使其能够平滑过渡并适应不同的位置。这种内插是必要的,因为在长文本中,长距离的依赖关系可能不像短距离那样频繁或显著,但仍需要被模型所理解和捕捉。
位置编码
截图来自:Transformer升级之路:10、RoPE是一种β进制编码
上图(2)式的最低频是 n β d / 2 − 1 \frac{n}{\beta^{d/2-1}} βd/2−1n,引入参数 λ \lambda λ,变为 n ( β λ ) d / 2 − 1 \frac{n}{(\beta\lambda)^{d/2-1}} (βλ)d/2−1n,让它跟内插一样,则:
n ( β λ ) d 2 − 1 = n / k β d 2 − 1 \frac{n}{(\beta\lambda)^{\frac{d}{2-1}}}=\frac{n/k}{\beta^{\frac{d}{2-1}}} (βλ)2−1dn=β2−1dn/k
解得 λ = k 2 / ( d − 2 ) \lambda=k^{2/(d-2)} λ=k2/(d−2)。最高频是 n β \frac{n}{\beta} βn,引入\lambda后变为 n β λ \frac{n}{\beta\lambda} βλn,由于 d d d通常很大, λ \lambda λ很接近1,所以它还是接近 n β \frac{n}{\beta} βn,即等价于外推。
总结
直接外推会将外推压力集中在“高位(m较大)”上,而位置内插则会将“低位(m较小)”的表示变得更加稠密,不利于区分相对距离。而NTK-aware Scaled RoPE其实就是进制转换,它将外推压力平摊到每一位上,并且保持相邻间隔不变,这些特性对明显更倾向于依赖相对位置的LLM来说是非常友好和关键的,所以它可以不微调也能实现一定的效果。简单点就是通过进制转换的思想,实现高频外推,低频内插。
(声明:文章主要目的是记录学习,内容大多为各路大神的总结)
参考:
- Transformer升级之路:10、RoPE是一种β进制编码
- 再论大模型位置编码及其外推性(万字长文)
- 一文通透位置编码:从标准位置编码、旋转位置编码RoPE到ALiBi、LLaMA 2 Long(含NTK-aware简介)
- 【笔记】复数基础&&复数相乘的物理意义:旋转+缩放
- 【笔记】LLM位置编码之标准位置编码