由于Transformer 中的自注意模块具有置换不变性(不关心输入序列的顺序),因此需要使用位置编码来注入位置信息以建模序列,使模型能够区分不同位置的 token,并捕捉序列的顺序关系。
在介绍一些位置编码方法前,首先说明,一个好的位置编码方法需要具备怎样的特性:
-
唯一性: 每个位置应该有一个唯一的编码,以确保模型能够区分序列中的不同位置。如果两个位置共享相同的编码,模型将无法区分它们,从而导致混淆
-
连续性: 位置编码应该是连续的,相邻位置的编码应该相似,连续性有助于模型捕捉序列中元素之间的局部依赖关系。如果位置编码在相邻位置之间突变,模型可能难以学习到平滑的序列模式
-
可扩展性: 位置编码应该能够处理比训练时更长的序列(即具有外推性),例如,Transformer的正弦和余弦位置编码由于其周期性,能够为更长的序列生成合理的编码
-
捕获相对位置信息: 位置编码应该能够捕获序列中元素之间的相对位置关系(例如,位置5和位置6的编码应该比位置5和位置10的编码更接近)
-
远程衰减特性: 远程衰减特性是指随着序列中元素之间相对位置的增加,位置编码的内积逐渐减小。这种特性有助于模型区分远距离和近距离的位置关系。这种特性有助于模型专注于更相关的局部信息,同时减少对远距离噪声的敏感性
-
高效性: 位置编码的计算和存储应该是高效的,尤其是在处理长序列时。复杂的位置编码方法可能会增加计算开销,从而影响模型的训练和推理速度
接下来介绍一些位置编码方法,主要可以分为绝对位置编码和相对位置编码。
1.绝对位置编码
绝对位置编码是为每个序列中的位置分配唯一的编码,无论它与其他位置的相对关系如何。每个位置的编码是固定的,并与具体的输入数据无关。常见方法有正弦/余弦编码和可学习编码:
1)正弦/余弦编码(Sinusoidal Encoding):
首先补充背景知识:
- 正弦/余弦函数:
- 波长: 是指函数在一个完整周期内所覆盖的距离或时间间隔
- 频率: 是指函数在单位时间或单位距离内重复的次数
- 波长与频率:
使用正弦和余弦函数生成位置编码,公式如下:
i
的范围是0~d/2-1
这样编码位置的特点:
-
低维度(小
i
)时,波长小,频率大,位置编码随位置 pos 的变化较快,对位置变化非常敏感,适用于捕捉短距离信息,即局部依赖关系 -
高维度(大
i
):波长大,频率小,位置编码随位置 pos 的变化较慢(在高维度上,即使 pos 变化很大,因为波长大,即分母大,正弦和余弦的值仍然变化得很缓慢,也就是说两个位置很远(pos相差大)的 token,在高维度的编码仍然可能相似,这种特性使得模型能够利用高维度信息来识别长距离的相似性,并捕捉远距离 token 之间的联系,对于 NLP 任务中需要捕捉长距离依赖的情况(如长句子、长文档的建模)特别有帮助 -
不同维度(
i
)的编码具有不同的波长,使得 Transformer 既能关注短距离依赖,又能捕捉长距离信息,兼顾短期记忆和长期记忆 -
周期性与外推性: 外推性指的是模型能够处理比训练时更长的序列,正弦和余弦函数的周期性特性使得位置编码能够自然地扩展到训练时未见过的序列长度。具体来说,正弦和余弦函数的周期性意味着其值会随着输入位置的增加而重复出现,即使位置索引 pos 超过了训练时的最大值,位置编码仍然能够通过函数的周期性生成有意义的值,这种重复性使得模型能够通过已学习的模式来处理更长的序列,覆盖更长的序列范围
这个编码位置中的10000起什么作用?可以换成别的数字吗?
作用: 调节位置编码的频率范围
10000决定了位置编码的频率范围。较大的值(如10000)会使频率较低,编码变化更平缓,相邻位置的编码差异较小。较小的值(如1000)会使频率较高,编码变化更剧烈,相邻位置的编码差异较大。
10000这个值决定了位置编码函数的波长较大(周期大),频率较低,使得不同位置的编码在向量空间中具有足够的区分性(如果频率较大,位置编码经常出现重复值,则每个位置的编码区分度不够大),**10000这个数字的取值规律是:**小的值更适合短序列任务,但小的值在长序列任务中可能会导致位置信息的变化过于频繁和剧烈,大的值适合长序列任务。
2)可学习编码(Learned Positional Encoding)
将位置编码向量作为可学习的参数,允许模型根据任务需求自动调整位置表示。与如正弦-余弦编码相比(通过固定的数学公式得到),可学习的位置编码更加灵活,能够根据具体任务和数据集调整位置编码,但缺点是需要学习更多的参数,并且对于不同的任务,模型可能会过拟合于某些特定的位置信息。在训练过程中,模型通过反向传播优化这些位置编码向量,使其能够更好地捕捉任务所需的位置信息。
2.相对位置编码
相对位置编码不是编码绝对位置,而是编码两个位置之间的相对关系,这种方法不必完整建模每个输入的位置信息,而是在算 Attention 的时候考虑当前位置与被 Attention 的位置的相对距离,与绝对位置编码相比,相对位置编码可以推广到比训练序列更长的序列(外推性)
1) Rotary Position Embedding(RoPE):
RoPE以绝对位置编码形式实现的相对位置编码,它通过将一个向量旋转某个角度,为其赋予位置信息。具体操作是对attention中的q, k进行旋转变换,使其自带相对位置信息,然后用更新的q,k向量计算attention,得到的内积就会引入相对位置信息了
RoPE已成为主流选择,代表模型有: LLaMA、PaLM
首先我们说明了RoPE是通过旋转使得向量带有位置信息的,那么我们介绍以下数学上的旋转:
此图参考自:图解RoPE旋转位置编码及其特性
根据以上的介绍,我们知道通过旋转可使得向量带有位置信息,那么RoPE怎么将这个思想带入Transformer架构中的呢?对Attention中的q, k进行旋转变换,使其自带相对位置信息,然后用更新的q,k向量attention,得到的内积就会引入相对位置信息了
证明
R
m
T
R
n
=
R
m
−
n
{R_m}^TR_n=R_{m-n}
RmTRn=Rm−n:
你可能会疑问, R m − n R_{m-n} Rm−n展开之后应该是 θ m − n \theta_{m-n} θm−n,上面的式子是 θ m − θ n \theta_m-\theta_n θm−θn,这是一样的吗?有一个结论: R θ 1 R θ 2 = R θ 1 + θ 2 R_{\theta_1}R_{\theta_2}=R_{\theta_1+\theta_2} Rθ1Rθ2=Rθ1+θ2,下面证明:
好的,介绍到这里我们就知道了,RoPE向Q,K引入旋转矩阵
R
m
R_m
Rm和
R
n
R_n
Rn,使他们带有位置信息,而他们的内积可以用
R
m
−
n
R_{m-n}
Rm−n表示
R
m
R_m
Rm和
R
n
R_n
Rn的乘积,
R
m
−
n
R_{m-n}
Rm−n包含了Q,K的相对位置信息,使得模型能够更好地捕捉序列中元素之间的相对位置关系。现在总结一下:
这里的 θ \theta θ借鉴了transformer中正余弦位置编码的思想:
-
低维度(小
i
)时,波长小,频率大,适合捕捉短距离依赖 -
高维度(大
i
)时,波长大,频率小,适合捕捉长距离依赖
现在总结RoPE的优点:
-
显式建模相对位置信息:通过旋转矩阵显式地建模相对位置关系
-
外推性:能够处理比训练时更长的序列,具有良好的外推性
-
多尺度位置编码:通过不同维度的旋转角度捕捉不同距离的依赖关系( θ \theta θ)
-
计算高效:旋转矩阵的计算简单高效,不会引入额外的计算负担。
2) Attention with Linear Biases(ALiBi):
ALiBi提出用于提升Transformer的外推性,不向单词embedding中添加位置embedding,而是根据query、key之间的距离给 attention score 加上一个预设好的偏置矩阵(仅需要修改softmax之前的mask矩阵,将偏置矩阵加上去即可,几乎不增加额外开销)。代表模型:BLOOM。
总结:本文介绍了大模型中常见的绝对位置编码和相对位置编码方法,其中RoPE的代码待补充