



位置编码用于描述输入文本中每个词元在文本中的位置,从而更好地对文本中词元的上下文关系进行建模。位置编码也属于网络架构的一部分。不过由于本身比较特殊,对支持更长上下文时注意力(attention)的计算效率影响比较大,就单独提前介绍。
主流位置编码有两种方法:RoPE [5] 和ALiBi [6] 。ALiBi是一种更新的位置编码方法,显示出更好的外推(extrapolation)性能。BLOOM采用ALiBi。不过目前主流的开源模型更多地使用RoPE。例如Llama、ChatGLM等。百川智能在7B使用RoPE,在13B使用ALiBi,便于做进一步的基于偏移和矩阵乘法(multiplication)的注意力方面的研究。
Google的Transformer使用了Sinusoidal的位置编码方案。具体计算方式如下:
embedding层的输出是一个词元embedding向量的序列。因此,pos是词元在序列中的位置,2 i /2 i +1是词元的embedding向量的偶数/奇数维; d 是embedding向量的维度。
Transformer的研究人员选择此函数是因为他们假设它将允许模型轻松地通过相对位置学习注意力,因为对于任何固定偏移 k ,PE pos+ k 可以表示为PE pos 的线性函数。这种编码方式虽然是单纯的位置内积,只与相对位置有关,不过在注意力计算中和query、key矩阵相乘后,内积结果并不能反映相对距离。
RoPE研究人员基于这样一个洞察:如果在注意力计算中query、key矩阵经过一种变换,两个位置上的内积可以表示为相应词元的编码和相对距离的函数,那么这种变换就可以成为能够反映相对距离的有效编码方案。考虑到Sinusoidal函数具有的特性,它们“凑出”如下变换:
f ( x p , p ) = ( Wx p )e i p θ
其中, p 为位置。
对于query、key矩阵 W q 、 W k ,变换分别为 f q 、 f k 。那么,对于位置为 m 、 n 的两个词元的query、key矩阵相应位置上的内积为
< f q , f k > = < f q ( x m , m ), f q ( x n , n )> = Re[( W q x m )( W k x n ) * e i( m-n ) θ ]
其中,Re[·]是复数的实部,( W k x n ) * 表示 W k x n 的共轭复数。
可以看出,在RoPE这种编码方式下,< f q , f k >反映出两个位置的相对距离 m - n 。
从图2 . 1可以看到,在RoPE编码方式下,随着相对距离变大,上述内积结果出现衰减趋势。
图2.1 RoPE的长程衰减( θ i =1000 -2 i / d )
ALiBi是Attention Linear Bias(线性偏差注意力)的缩写。它是一种新的位置编码方式,它被设计成无须使用更长的上下文进行训练就可以在推理时支持输入长度“外推”。它将位置编码为两个词元的位置偏差(position difference)的线性项,添加到注意力分数中,这就是这种编码方式的名字的由来。
如图2.2所示,在计算每个头(head)的注意力分数时,ALiBi会为每个注意力分数( q i · k j )添加一个恒定偏移。与未修改的注意力子层一样,softmax函数随后应用于这些分数,其余计算则不作修改。 m 是一个特定于头部的标量,在整个训练过程中是固定的而不是可学习的。设置 m 值的方法可以推广到多个文本域、模型和训练计算预算。使用ALiBi时,不会在网络底部添加位置编码。
图2.2 ALiBi位置编码
使用ALiBi可以在推理时将训练时使用的长下文长度“外推”10倍以上,而不会有性能损失。图2.3清楚地显示了在输入上下文长度增加到16倍的情况下,使用ALiBi位置编码的模型困惑度没有多少下降,而使用其他位置编码的模型在输入上下文长度增加到一定倍数后困惑度飙升。
图2.3 不同输入长度、编码方案下的外推表现