NLP位置编码

  • Learned Positional Embedding
  • Sinusoidal Position Embedding
  • Relative Position Representations
  • 实验结果
  • Transfomer-XL中的相对位置编码
  • 实验结果
  • Complex Embeddings
  • 实验结果
  • 位置特征与内容特征间的关系
  • 去掉内容特征
  • 将embedding相加改为拼接
  • 拆分位置特征和内容特征
  • 在测试时分别disable位置特征和内容特征


以Transfomer和Bert为首的一系列深度模型不断验证着Attention模式在NLP领域的成功。Attention模式与传统的RNN模式相比,优点确实很多。比如不受长距离约束,可以并行化加快速度等等。

一般来说,一个自然语言的句子,它所携带的信息 = 组成句子的词的信息 + 语法(or 语序)信息。

RNN看似只处理了词语的信息,但其实它是通过顺序输入的方式得到了词语间的语序信息,这种方式是优点是自然,不需要其他人工干预;但缺点是无法掌控获得的语序信息,而且RNN受长距离约束和难以并行等问题也是由顺序输入带来的。

Attention则摒弃了原始句子的自然语序,不同词间的信息交互不受自然语序的影响。但直接抛弃语序信息在很多任务里是不可取的,例如翻译任务,情感分类任务等。因此大部分采用Attention思想的模型需要配一个“位置编码”来保留句子的语序信息,这篇文章我们就来介绍一些比较常用的位置编码方式。


Learned Positional Embedding

BERT中使用的位置编码,随机初始化position embedding,然后随着模型训练得到更新。

优点:简单方便,无需额外开销
缺点:1.这样得到的位置编码是独立训练得到的,不同位置的编码向量没有明显的约束关系,因此只能建模绝对位置信息,不能建模不同位置之间的相对关系。
2.句子长度不能超出位置编码的范围



Sinusoidal Position Embedding

这是Transformer模型里用到的位置编码模式,对每一个位置NLP微调代码 nlp编码_nlp,它的位置编码是:
NLP微调代码 nlp编码_建模_02

首先我们注意到由于它的定义方式,可得:
NLP微调代码 nlp编码_NLP微调代码_03
重新记 NLP微调代码 nlp编码_NLP微调代码_04,那么:
NLP微调代码 nlp编码_NLP微调代码_05

即给定相对位移k,PE(pos+k)可以用PE(pos)的线性表示。

此外,根据Attention的计算方式,NLP微调代码 nlp编码_词向量_06NLP微调代码 nlp编码_深度学习_07这两个位置的相关性由NLP微调代码 nlp编码_深度学习_08描述:
NLP微调代码 nlp编码_深度学习_09
下图是不同d(位置编码向量长度)下,NLP微调代码 nlp编码_深度学习_08 关于 NLP微调代码 nlp编码_深度学习_11的图像:


NLP微调代码 nlp编码_词向量_12

但这个的问题首先在于,NLP微调代码 nlp编码_词向量_13是一个偶函数,也就是说NLP微调代码 nlp编码_nlp_14等于NLP微调代码 nlp编码_建模_15NLP微调代码 nlp编码_NLP微调代码_16对位置相关性是没有影响的,但实际上,我们希望位置编码是可以区分前后的。

第二,在实际的Transfomer Attention计算中,input embedding首先需要经过一个线性映射:


NLP微调代码 nlp编码_nlp_17

因此真正使用的并不是NLP微调代码 nlp编码_词向量_18,而是NLP微调代码 nlp编码_深度学习_19。初始化时NLP微调代码 nlp编码_建模_20均是随机初始化的,所以NLP微调代码 nlp编码_深度学习_19大概是:


NLP微调代码 nlp编码_词向量_22

注: 观察到NLP微调代码 nlp编码_NLP微调代码_23NLP微调代码 nlp编码_NLP微调代码_24的每个值是在[-1,1]之间,因此把随机矩阵的值也取在[-1,1]

可以发现当线性变换矩阵是随机初始化时,NLP微调代码 nlp编码_深度学习_19就跟NLP微调代码 nlp编码_深度学习_11没有了清晰的相关性。

Note:使用Sinusoidal Position Embedding和Learned Positional Embedding在实验表现上区别不大,因此后面的一些论文如BERT,处于简便性考虑,采用的是Learned Positional Embedding


  • 增加约束NLP微调代码 nlp编码_NLP微调代码_27,是否可以在解决上述问题时,不影响模型其他方面的效果?


Relative Position Representations

Paper: Self-Attention with Relative Position Representations (Shaw et al.2018)

Transformer中的Self-attention可以记作:
NLP微调代码 nlp编码_深度学习_28
由于上面提到的Sinusoidal Position Embedding会被后面隐藏层的线性变化扰乱其与相对位置的关系,因此一个自然的想法是在每个隐藏层都再加上相对位置编码的信息。因此Transfomer的研究人员又提出了Relative Position Representations(以下简称RPR),在其中设计了一个 Relative embedding table(假设句子长度为6):
NLP微调代码 nlp编码_nlp_29
将这个Relative embedding table记作NLP微调代码 nlp编码_nlp_30,其中每个NLP微调代码 nlp编码_建模_31都是d维向量,那么带RPR的Self-attention变为:
NLP微调代码 nlp编码_词向量_32
其中NLP微调代码 nlp编码_建模_33也是一个跟NLP微调代码 nlp编码_nlp_30形状一样的table。

结合公式不难发现,NLP微调代码 nlp编码_nlp_30NLP微调代码 nlp编码_建模_33的目的就是分别在计算NLP微调代码 nlp编码_nlp_37NLP微调代码 nlp编码_词向量_38的时候加上一个相对位置量,比如对于句子“我喜欢吃苹果”,那么“吃”对于“我”的相对位置量就是NLP微调代码 nlp编码_词向量_39,"喜"对于"欢"的相对位置量就是NLP微调代码 nlp编码_词向量_40。论文设计的这个Relative embedding table其实就是要保证相对距离相同的两个位置间的相对位置量是一样的,在这个基础上矩阵NLP微调代码 nlp编码_nlp_30NLP微调代码 nlp编码_建模_33都是可以跟随模型训练而更新的。

而且论文还作了一个假设(后由实验验证),设置一个超参k,当相对距离大于k之后,就认为相对位置量不再随着相对距离的增大而变化,而是统一设为NLP微调代码 nlp编码_nlp_43或者NLP微调代码 nlp编码_建模_44

最后不同的Head之间的Relative embedding table是共享的,因此每一层的位置编码参数只有NLP微调代码 nlp编码_NLP微调代码_45个。

##########################################################################################

与Sinusoidal Position Embedding比较

  1. 正余弦编码仅加在了embedding层,而如上面所论证的,初始的位置编码会在后面被线性变换所干扰。而RPR是在每一层计算attention时都加上了relative position embedding
  2. 其“缺点”是超出截断距离的相对位置量不再变化(受限于它的定义),而正余弦编码的好处正是不受限于相对位置的大小

##########################################################################################

实验结果

  1. 在 WMT14 英德数据集上 base model BLEU 提升了 0.3, big model 提升了 1.3
  2. Ablation 实验中,改变最大位置距离 k,显示 k 从 0-4 增大的过程 performance 有明显的提升,之后再增大 k 提升不明显
  3. Attention bias 中的相对项提高更多的 performance, 而 SoftMax 之后再 Value 上加的那个相对项提升的性能略少

NLP微调代码 nlp编码_深度学习_46


Transfomer-XL中的相对位置编码

Paper: Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context(2019)

由于RPR的实验表明Value上加的相对位置编码对实验结果影响不大。因此Transfomer_XL中就直接放弃了对Value项的修改,而是专注于Attention Bias项:
NLP微调代码 nlp编码_词向量_47
其中NLP微调代码 nlp编码_深度学习_48NLP微调代码 nlp编码_nlp_49分别是词向量和位置编码。

Transfomer-XL中对上式做了以下修改:

  1. 将绝对位置编码NLP微调代码 nlp编码_NLP微调代码_50改为相对位置编码NLP微调代码 nlp编码_词向量_51,其中NLP微调代码 nlp编码_词向量_51是固定的不可训练量,其定义同正余弦编码
  2. 由于已经将绝对位置编码NLP微调代码 nlp编码_NLP微调代码_50改成了相对位置量NLP微调代码 nlp编码_词向量_51,因此绝对位置量NLP微调代码 nlp编码_NLP微调代码_55需要保证对所有其他位置来说是不变的,因此将第三项里面的NLP微调代码 nlp编码_深度学习_56整体替换成一个可训练量NLP微调代码 nlp编码_词向量_57(因为NLP微调代码 nlp编码_深度学习_58是可训练的)。同理将第四项里的NLP微调代码 nlp编码_深度学习_56也替换成一个可训练量NLP微调代码 nlp编码_深度学习_60
  3. 将key的embedding和positional encoding 分别采用了不同的线性变换。其中NLP微调代码 nlp编码_nlp_61对应于key的embedding的线性映射矩阵,NLP微调代码 nlp编码_NLP微调代码_62对应与key的positional encoding的线性映射矩阵。

这样的得到的Attention Bias项具有了很好的解释性:

  1. 第一项 NLP微调代码 nlp编码_词向量_63,表示内容偏差
  2. 第二项 NLP微调代码 nlp编码_建模_64,表示基于内容的位置偏差
  3. 第三项 NLP微调代码 nlp编码_建模_65,表示基于位置的内容偏差
  4. 第四项NLP微调代码 nlp编码_深度学习_66, 表示位置偏差

与RPR的比较

将RPR的公式展开
NLP微调代码 nlp编码_建模_67
只对应了Transfomer-XL中的第一项和第二项,所以Transfomer-XL中的位置编码可以说是RPR的拓展。而且Transfomer-XL使用了正余弦编码来表示相对位置量,因此它是不受限于数据长短的,而RPR中长度超过一定位置就只能截断。

##########################################################################################

实验结果

比较了原版Transformer和Transformer-XL,采用不同position encoding方式。

NLP微调代码 nlp编码_NLP微调代码_68


保证模型大小一致的前提下,Transformer-XL在采用自己的位置编码时,比采用RPR的位置编码,PPL减小了1.2


Complex Embeddings

Paper: Encoding word order in complex embeddings (2020)

前面几种位置编码方式依然是在“词向量+位置向量”的范畴里面探索位置向量可能的形式,而这篇论文直接跳出了这个框架,提出了一个全新的假设:

记一个单词在词表里的索引为NLP微调代码 nlp编码_建模_69,它在文章里的位置是NLP微调代码 nlp编码_nlp。那么上面的对词向量和位置向量的表达方式可以记作:
NLP微调代码 nlp编码_深度学习_71
其中NLP微调代码 nlp编码_词向量_72

而Complex Embeddings里把NLP微调代码 nlp编码_nlp_73拓展为一个光滑的二元函数:NLP微调代码 nlp编码_词向量_74,展开变成:
NLP微调代码 nlp编码_NLP微调代码_75
下面将NLP微调代码 nlp编码_NLP微调代码_76简记为g,因此NLP微调代码 nlp编码_建模_77是关于位置NLP微调代码 nlp编码_nlp的函数。

为了使得NLP微调代码 nlp编码_建模_79能够体现位置间的相对关系,对任意NLP微调代码 nlp编码_建模_80我们希望存在一个函数NLP微调代码 nlp编码_nlp_81 满足
NLP微调代码 nlp编码_深度学习_82
也就是说NLP微调代码 nlp编码_深度学习_83可用NLP微调代码 nlp编码_建模_84NLP微调代码 nlp编码_深度学习_85来表示。论文中为了简化问题,将NLP微调代码 nlp编码_深度学习_86限定为线性变换,i.e. 存在一个函数NLP微调代码 nlp编码_nlp_87,满足NLP微调代码 nlp编码_词向量_88。以上性质被称为Position-free offset transformation

第二个性质比较trivial,要求NLP微调代码 nlp编码_建模_79是有界的,i.e. NLP微调代码 nlp编码_建模_90

接下来论文给出了一个满足以上两个性质的NLP微调代码 nlp编码_深度学习_91的等价形式:
NLP微调代码 nlp编码_建模_92

##########################################################################################

proof: 充分性,由于NLP微调代码 nlp编码_建模_93满足Position-free offset transformation性质,NLP微调代码 nlp编码_词向量_94
NLP微调代码 nlp编码_NLP微调代码_95
NLP微调代码 nlp编码_nlp_96,不妨记NLP微调代码 nlp编码_建模_97
NLP微调代码 nlp编码_nlp_98
又因为NLP微调代码 nlp编码_建模_93有界,因此NLP微调代码 nlp编码_深度学习_100。得证。

必要性, 已知NLP微调代码 nlp编码_NLP微调代码_101,那么不妨取NLP微调代码 nlp编码_建模_102,则有
NLP微调代码 nlp编码_词向量_103
因此Position-free offset transformation性得证。

再有,NLP微调代码 nlp编码_nlp_104,因此有界性也得证。必要性证毕。

##########################################################################################

NLP微调代码 nlp编码_深度学习_105写成极坐标形式 NLP微调代码 nlp编码_NLP微调代码_106
NLP微调代码 nlp编码_建模_107
但当NLP微调代码 nlp编码_建模_108时,当 NLP微调代码 nlp编码_词向量_109很大时,词向量将收敛到零向量,即无法对任意位置都计算出合理的词向量为了避免这种情况,论文中把NLP微调代码 nlp编码_NLP微调代码_110取为1

所以
NLP微调代码 nlp编码_建模_111
重新记为
NLP微调代码 nlp编码_nlp_112
其中NLP微调代码 nlp编码_深度学习_113都是可训练参数,论文通过实验发现直接将NLP微调代码 nlp编码_深度学习_114置零的效果比将其加入训练要好一点,因此我们只需要看
NLP微调代码 nlp编码_深度学习_115

可解释性

  1. NLP微调代码 nlp编码_建模_116只和词在词表中的索引有关,表示词的含义,和普通的词向量对应。
  2. NLP微调代码 nlp编码_词向量_117表示词对位置的敏感程度。当NLP微调代码 nlp编码_词向量_117很小时,同一个词在不同位置的词向量几乎是常量。这时的复值词向量对位置不敏感,和普通的不考虑位置信息的词向量相似。当NLP微调代码 nlp编码_词向量_117很大时,复值词向量对位置非常敏感,会随位置变化而剧烈变化。因此NLP微调代码 nlp编码_深度学习_120可以看作是调节词向量与位置向量比重的自适应参数

NLP微调代码 nlp编码_nlp_121

图中的p=NLP微调代码 nlp编码_深度学习_122,波浪线与虚线的交点即不同pos的取值,可以看出周期p与向量对位置的敏感度相关

与Sinusoidal Position Embedding的关系
Sinusoidal Position Embedding的定义为
NLP微调代码 nlp编码_建模_123

NLP微调代码 nlp编码_建模_124中的NLP微调代码 nlp编码_nlp_125取为NLP微调代码 nlp编码_nlp_126,那么

NLP微调代码 nlp编码_建模_127
所以一定程度上Sinusoidal Position Embedding等级于是Complex Embeddings的一种特殊情况。


实验结果

##########################################################################################

实验1:文本分类,对比了不使用位置编码,使用可学习的位置编码(PE),使用三角函数计算得到的位置编码(TPE),不使用位置编码的复值词向量(Complex-vanilla)和本文提出的复值词向量(Complex-order)五种设置下FastText,LSTM,CNN和Transformer

NLP微调代码 nlp编码_深度学习_128


结论:三角 PE 与 Train PE 几乎没什么区别。 Complex order 对模型有一定提升,但不是特别多

##########################################################################################

实验2:在WMT-16 EN-DE数据集上进行了机器翻译任务的实验

NLP微调代码 nlp编码_NLP微调代码_129


结论:使用复值词向量的Transformer相比一般的Transformer有1.3个BLEU的提升

##########################################################################################

实验3:在text8数据集上进行了语言模型实验

NLP微调代码 nlp编码_深度学习_130


结论:使用复值词向量的Transformer-XL相较使用词向量加位置编码的Transformer-XL有明显提升


位置特征与内容特征间的关系

Paper: Constituency Parsing with a Self-Attentive Encoder

尽管这篇文章主要是提出了一种新型的句法分析模型。但其中关于位置编码的实验比较有趣,这里也记录一下。

我们都知道Transformer模型里的self-attentive结构如下:

NLP微调代码 nlp编码_nlp_131

其中NLP微调代码 nlp编码_深度学习_132NLP微调代码 nlp编码_NLP微调代码_133是内容特征,NLP微调代码 nlp编码_词向量_134是位置特征。然后利用NLP微调代码 nlp编码_NLP微调代码_135分别计算NLP微调代码 nlp编码_深度学习_136
NLP微调代码 nlp编码_NLP微调代码_137
最后根据attention公式:
NLP微调代码 nlp编码_建模_138
来获取带自注意力的特征。

去掉内容特征

为了了解位置特征和内容特征的relative importance,文章做了一个实验,在计算NLP微调代码 nlp编码_NLP微调代码_139NLP微调代码 nlp编码_深度学习_140的时候,只保留了位置特征,而去掉了内容特征,而计算NLP微调代码 nlp编码_NLP微调代码_141仍保留了内容特征,即:
NLP微调代码 nlp编码_词向量_142
解释:相当于在计算每个词的attentive weight时,只考虑位置信息,而不考虑词语本身的信息。由于本文的任务是做句法分析,因此是在测试只考虑位置信息的attentive weight会对结果有多大的影响。

结果:F1 score只降了0.27

结论:由于多头结构的存在,即使attentive weight只考虑了位置信息,这个结构也相当于一个多层的cnn,而且value矩阵NLP微调代码 nlp编码_nlp_143仍保留了内容特征,因此结果应该依然不错。但是只有这么小的drop依然出乎作者意料之外。

##########################################################################################

将embedding相加改为拼接

接下来,作者猜想直接将两种特征相加,可能会让其中一种信息占主导作用,模型不能很好的找到两种特征重要性的平衡。

事实上,观察注意力权重 NLP微调代码 nlp编码_词向量_144,不难发现:

NLP微调代码 nlp编码_建模_145

其中的交叉项 NLP微调代码 nlp编码_建模_146

因此这个实验里,作者尝试将两种特征由相加改成拼接的方式:NLP微调代码 nlp编码_深度学习_147,其他不变。

结果:比相加的方式还降了0.07个F1 score

结论:事实上,adding 和 concatenation 在高维度上的表现是差不多的,尤其是当结果会立马乘上一个矩阵之后,因为这样会混合里面的信息。

##########################################################################################

拆分位置特征和内容特征

拼接方法效果不行,文章中又尝试了一种新的分解方式,对于NLP微调代码 nlp编码_深度学习_147,将参数矩阵NLP微调代码 nlp编码_NLP微调代码_149也进行拆分:
NLP微调代码 nlp编码_深度学习_150

包括后面的NLP微调代码 nlp编码_深度学习_151也变成:
NLP微调代码 nlp编码_nlp_152

对于一个 attention head 来说,拆分后的情况如图所示,可以看成分别对 NLP微调代码 nlp编码_NLP微调代码_133NLP微调代码 nlp编码_词向量_134


NLP微调代码 nlp编码_深度学习_155

结果:F1 score提升了约0.5

结论:表明拆分不同类型的特征确实能得到一个不错的结果。

##########################################################################################

在测试时分别disable位置特征和内容特征

为了分析模型对内容和位置注意力的利用情况,作者又做了个实验,模型训练保持不变,但是在测试阶段,把内容注意力或位置注意力人为置零,即禁用。


NLP微调代码 nlp编码_建模_156

结论:位置注意力相当重要,但是内容注意力也有一定帮助,尤其是在最后几层


Reference:

  1. 【工大SCIR笔记】浅谈Transformer模型中的位置表示
  2. Encoding word order in complex embeddings (2020)
  3. Constituency Parsing with a Self-Attensive Encoder