nlp-位置编码解析

看到这里,是否记得前面提及Vaswani推出的Transformer结构,那么如果不使用RNN结构,是怎样表示位置信息的呢?在提信息位置技术前,先简介以下RNN和CNN。RNN的序列结构不适合大规模并行训练。因为大家都知道,RNN对于序列问题有天然优势,然而这种优势却注定RNN的每一时刻的状态输入都需要等待上一个时刻状态输出完成。而对于CNN,这里是指经典版CNN的问题。卷积层实则上就是一个特征提取层,而单层的卷积层却对远距离的特征很是吃力。所以目前有好多改进的在NLP主流的CNN都是层次比较深的。因为经过多层的特征抽取后,每一层的输出都可以输入长度要短。

由于注意力机制是不会保留序列位置信息的,因此需要该结构去用其他方法吸收位置信息。目前有三种主流的技术可以解决:

  1. 用正弦位置编码(Sinusoidal Position Encoding)
  2. 学习位置向量(类似词向量)
  3. 相对位置表达(Relative Position Representations)

3种位置编码都可以用下面解析:这里展示用加法组合

3.1 正弦位置编码

这种方法是Vaswani提出并用在了Transformer模型上。以下位置编码(positional encoding)简称PE。这里的位置编码通过使用不同频率的正弦、余弦函数生成,然后和对应的位置的词向量相加,个人认为这种方法是一种新颖的特征组合,名字叫正余弦位置编码应该更适合。注意的是,这里的PE向量维度必须和词向量的维度一致。表达式如下:


解析:pos对应输入的位置,i这里在翻译上是维度。我在很多讨论该论文的帖子上看到,i有很多人有疑问,到底是指什么维度。在Vaswani的Attention is what you need论文中,是用上面的公式。举个例子,如pos=3,d(model)=128,那么3对应的位置向量如下:


Vaswani使用位置向量与输入词向量进行相加这样的特征组合方式,因此位置向量的长度必须为d(model)。不过在验证上面正弦位置向量的时候,我查看了Vaswani的项目代码,与这里的表达式有所不同,项目代码里面,位置向量的前半段所有元素都用sin来计算而后半段采用cos,但是不管何种组合方式,我们可以看文章的实验结果再来思考。

3.2 学习位置编码

学习位置编码跟生成词向量的方法相似,对应每一个位置学得一个独立的向量。但是学习位置向量也有两个缺点:

  1. 句子长度不能超出位置编码的范围,也就是并不是任何位置都会有对应的学习位置编码向量。
  2. 如果训练集里面短句子训练数据比较多的话,则对长句子不友好。 Vaswani也在文中提及最后使用正弦位置编码是因为第二个原因。

3.3 相对位置表达

相对位置表达Relative Position Representations (RPR)是Shaw et al., 2018在为Transfomer考虑位置编码的时候提出,其效果比当时的NMT还要好。文中作者认为该方法是三种里面最好,因此以下的实验都使用该方法。SAN论文并没有详细介绍相对位置表达,引用来自Shaw的Self-Attention with Relative Position Representations。先用一图来引入相对位置:


看上面的图,大家很容易了解。相对位置由向量e(ij)表达,ij是指j相对于i的位置,当j与k的绝对值差大于k的时候,都用k代替(这样做的目的是保证效率,作者后来也发现k>2之后并没有明显的收益)。类似自注意力,相对位置向量e(ij)亦由ak(ij)和av(ij)两个向量经过对齐模型计算出。在我看来,Shaw设计两个K/V相对位置向量的动机是想在使用多头注意力时,带上相对位置信息。不过作者后来通过实验发现,这种信息在机器翻译上并没有什么必要。同时,如图一的公式2,也做了修改如下:


e(ij)的表达式如下:

3.4 对数位置表达

类似于相对位置表达,对数位置表达是我在为公司调试模型的时候想出来。构想出对数位置表达,我是发现相对位置表达这种方式比较硬,只要距离超过k,就统一都用k代替,于是我设想能否渐进的方式“模糊”远距离的位置,以不至于“一刀切”这么绝对。通过求以k为底距离的代数,当距离为负数(表示反方向)的时候,则取绝对值再外面加负符。例如a(1,1)=W1,a(1,2)=W2,a(1,3)=W2,a(1,4)=W3等。实验发现,在跟相对位置表达比较的时候,在小规模的数据集上,成绩基本一致。但是用在短句子较多的数据集,相对位置表达略微优胜,而长句子则对数位置表达较好,两种方法在k>2之后都并没有明显的收益。我的解析是对于长句子,对数位置表达并没有完全忽视太长的距离,只是更加“模糊”,但是对于短句子,精度不及相对位置表达,因此产生上面的比较结果。

转载自:https://zhuanlan.zhihu.com/p/57732839

猜你喜欢

转载自blog.csdn.net/tiankong_/article/details/88369349