本文讨论一下Transformer中相对位置编码(Relative Position Embedding,RPE)的问题,首先聊聊Vanilla Transformer的编码方式为什么不包含相对位置信息,然后主要围绕三篇论文介绍在Transformer中加入RPE的方法。
Vanilla Transformer位置编码方式有什么问题
我们知道在原理上Transformer是无法隐式学到序列的位置信息的,为了可以处理序列问题,Transformer提出者的解决方案是使用位置编码(Position Encode/Embedding,PE),并且为了计算方便使用绝对位置编码,即序列中每个位置都有一个固定的位置向量,计算如下:
然后会将词向量和位置向量相加得到每个词最终的输入,然后进行一系列复杂的操作,我们只需要看self attention的运算就可以了,其他的运算和位置编码没关系。attention中也只需要看attention score的计算即可。
所以看一个序列中,第i个单词和第j个单词的attention score的计算:
其中Wq,Wk分别是multi-head attention给每个head加的query和key参数,Exi和Exj是xi和xj的词嵌入,Ui和Uj是第i个位置和第j个位置的位置向量。因式分解得到下式
其中(a)和位置向量和位置编码没关系,(b)和(c)都只有一个位置的向量,所以也不包含相对位置信息,(d)同时包含Ui和Uj,是最有可能包含相对位置信息的。
实际上,按照Vanilla Transformer的位置编码方法,如果没有Wq和Wk那么它是包含相对位置信息的,证明如下:
可以看到最后的结果只和两个位置的相对位置有关系,也就是包含相对位置信息。
但是中间加入一个“不可知”的线性变换以后,就没有相对位置信息了,这个可以使用实验证明,具体如下图
图中,k表示两个位置的距离,上面蓝色的曲线表示
这里细心的人一定会提出疑问,上面说的W1和W2都是随机的,但是在Transformer中Wq和Wk都是trianable的,也许最终学到的
Transformer中加入相对位置信息
第一篇paper: Self-Attention with Relative Position Representations
既然相对位置信息是在self-attention计算时候丢失的,那么最直接的想法就是在计算self-attention的时候再加回来。该工作出自Transformer的原班人马,看来Transformer提出时他们就已经发现这个问题了。
具体做法是在计算attention score和weighted value时各加入一个可训练的表示相对位置的参数,并且multi head之间可以共享。具体的:
论文中这个图就比较形象了
作者表示,k>4以后效果就没有提升了,说明通常情况下,临域为4的窗口内(4 gram),attention对相对位置比较敏感,窗口以外,相对位置可以不做区分。
第二篇paper: Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
回顾上文说的self-attention的计算公式
transformer-xl中将其改写为如下
改写的逻辑如下:
- 首先将所有的Uj改为
,表示对key来说将绝对位置转换为相对query(xi)的位置。也是基于正弦波的,可以理解为
- (c)和(d)中
表示query相关的绝对位置向量,改为相对位置以后,query应该和自己的位置没关系,所以将每个head对应的使用一个和位置i无关的向量u表示。v也是同理。由于Wq是一个trainable的参数,所以u和v也是trainable
第三篇paper: Encoding word order in complex embeddings(openreview)
这篇paper比较有意思,这篇文章让我想起来了GraphWave...
前面两个方法都是基于"词向量+位置向量"的模式,说白了是在“亡羊补牢”,而没有一开始就修建一个牢固的羊圈。而这篇论文从两个基本的假设,推导出一个复数域的词向量方法,理论十分优美。
首先用一个复数域函数表示词表中索引为j,在一段文本中位置为pos的单词的向量表示,D是词向量维度
两个基本假设为:
- 已知一个词在某个位置的词向量表示,可以计算出它在任何位置的词向量表示。数学语言就是:存在一个函数Transform,对于任意pos和n >= 1,都有
- 有界性,即词向量函数的范数是有界的。数学语言就是:存在一个正数
,对任意位置pos,都有
在Transform为线性函数的假设下,那么函数g只有一个解:
到这里就知道为什么g要选择复数域了,如果是g是实数域函数
- 若
,同一个词在不同位置的词向量是一样的,无法达到建模位置信息的目的。
- 若
,当pos很大时,词向量将收敛到零向量,即无法对任意位置都计算出合理的词向量。
而当 g是复数域时,可以避免以上两个问题。
最终
其中rj表示振幅,wj是角频率,
需要注意的是,以上是向量形式的函数,如果表示成非向量形式,即对词向量中的每一维度拆开,如下:
每一维度还是一个复数咋整?把实部和虚部分别写成一个向量,再concat起来变成2D维向量即可,GraphWave也是这么做的。下面这个图很形象
这种复数词向量还有很不错的可解释性。
- 振幅rj只和词相关,对应于词向量
- 角频率wj表示词对位置的敏感程度,当角频率越小对位置越不敏感
另外原始的绝对位置向量也是该复数域词向量的一种特殊形式,一边有sin, cos,一边有e^i,再结合欧拉公式,推导一下即可。
缺点在于,参数是原来的三倍,所以作者提出一些降低参数的技巧,不再赘述。
总结
本文讨论一下Transformer中相对位置编码(Relative Position Embedding,RPE)的问题,首先聊聊Vanilla Transformer的编码方式为什么不包含相对位置信息,然后主要围绕三篇论文介绍在Transformer中加入RPE的方法。