位置编码
在输入的第k个向量xk中加入位置向量pk变为xk+pk,其中pk只依赖于位置编号k.位置向量和词向量相加而不是拼接。不选择拼接,
(1)拼接会导致参数数量的增加,其学习难度进一步上升
(2)另一个解释的原因是选择拼接后的效果有时积极有时消极
绝对位置编码
BERT使用的是训练出来的绝对位置编码,这种编码方式简单直接,效果也不错,且位置嵌入只与词的位置i有关,绝对方法将输入tokens的绝对位置从1编码到最大序列长度。也就是说,每个位置都有单独的编码向量。然后将编码向量与输入Tokens组合,以将位置信息输入给模型。但是该方法不能表达1与2之间的距离相比2与5的距离更小。因此引入了相对的位置编码
绝对位置编码的生成和生成词向量的方法相似,先初始化位置编码,再放到预训练过程中,训练出每个位置的位置向量。缺点是没有外推性,如果预训练的最大长度为512的话,那么只能处理长度为512的句子,最近研究表明可以通过层次分解的方式,可以使得绝对位置编码能外推的足够长的范围n^2
链接: 《层次分解位置编码,让BERT可以处理超长文本》
链接: ICCV2021 | Vision Transformer中相对位置编码的反思与改进
正弦位置编码
Position Encodeing 公式如下
pos即position,意为token在句中的位置,句子长度L,pos=0,1…L-1,i为向量的某一维度
i=0,1…255.
根据数学公式
可以将公式拆分开为
可以看出,对于pos+k位置的位置向量某一维2i或2i+而言可以表示为pos位置与k位置的位置向量的2i与2i+1维的线性组合,这样的线性组合意味着位置中蕴含了相对的位置信息
参考链接: 如何理解Transformer论文中的positional encoding,和三角函数有什么关系?
相对位置编码
图片举例
图片中为了得到两个 i 的表示向量,如果不加入位置编码是会把两个i看作一样的,但是从语义语法的角度这是不合理,为了解决该问题就引入
相对位置变量:一个位置相对另一个位置的采用一组可训练的embedding向量来表示输入的句子中每个单词的位置编码。可以表示出单词之间的相互距离,该距离为一个设定值2k+1,左边K个右边k个,当前一个。超过范围就认为影响较小没必要精确计算两者之间的距离。具体计算请参考链接
中文版
链接: relative position representation
英文原版
强烈推荐 How Self-Attention with Relative Position Representations works