位置编码
纯粹的Attention模块是无法捕捉输入顺序的,因此对于Transformer模型来说,加入位置编码是非常必要的,否则模型无法区分不同位置的token。为此,大体有两个选择:
- 绝对位置编码
将位置信息融入到输入中 - 相对位置编码
调整Attention结构,使其能够分辨不同位置的token
绝对位置编码
一般来说,绝对位置编码会加到输入中:在输入的第
训练式
最朴素的绝对位置编码就是直接将位置编码当作可训练参数,比如最大长度为512,编码维度为768,那么就初始化一个
对于这种训练式的绝对位置编码,一般认为它的缺点是没有外推性,即如果预训练最大长度为512的话,那么最多只能处理长度为512的句子,再长就处理不了了。当然,也可以将超过512的位置向量随机初始化,然后继续微调。
三角函数式
三角函数式位置编码也即Sinusoidal位置编码,也是Attention is All You Need中提出的显式解:
其中
三角函数式位置编码具有显式的生成规律,因此可以期望它具有一定的外推性。此外,由于
递归式
原则上说,RNN不需要位置编码,它在结构上自带了学习到位置信息的可能性。因此,如果在输入后面先接一层RNN,然后再接Transformer,那么理论上就不需要再加位置编码了。
我们可以用RNN模型来学习一种绝对位置编码,比如从一个向量
相对位置编码
相对位置并没有完整建模每个输入的位置信息,而是在计算Attention时考虑当前位置与被Attention位置的相对距离。由于自然语言一般更依赖于相对位置,所以相对位置编码通常有着优秀的表现。
经典式
Google在论文Self-Attention with Relative Position Representations中首次提出了相对位置编码。
计算
为了引入相对位置信息,Google把第一项位置去掉,第二项
此外,将
相对位置就是将原本依赖于二元坐标
这样只需要有限的位置编码,就可以表达出任意长度的相对位置。
T5式
如果分析每一项的含义,那么可以分别理解为“输入-输入”,“输入-位置”,“位置-输入”和“位置-位置”四项注意力的组合。如果认为输入信息和位置信息是解耦的,那么它们就不应该有过多的交互,所以“输入-位置”和“位置-输入”两项Attention可以删掉。而
其实它就是在Attention矩阵的基础上添加一个可训练的偏置项。
此外,XLNet和DeBERTa也对位置编码进行了改进,可参考苏剑林的博客。
融合式
苏剑林基于通过绝对位置编码的方式实现相对位置编码这个出发点提出了RoPE,即旋转位置编码,将绝对位置编码和相对位置编码融于一体。RoPE位置编码通过将一个向量旋转某个角度,为其赋予位置信息。
首先,对于两个复数
其中
假设
也就是说,内积只依赖于相对位置
根据欧拉公式
也就是说,通过
赋予
【参考文献】