6

Transformer中Position Embedding的原理与思考

 2 years ago
source link: https://allenwind.github.io/blog/11574/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Transformer模型所依赖的Attention本身不具备像RNN一样的天生的对序列位置编码能力,需要借助所谓的Position Embedding来解决位置信息问题。本文总结常见的Position Embedding方案。

印象中,位置编码这个话题,影响中好像是在Google的论文以及Facebook的论文开始关注这个话题。下面我们先来回顾Google最先提出的Self Attention。

Attention的问题

Google 的这篇论文中看到一条挺“吓人”的公式,

Attention(Q,K,V)=softmax(QK⊤√dk)V

由于无法区分token的位置,在Embedding上叠加一个关于位置的Embedding。为什么要这样设计?从模型角度看,可以理解成是模型去偏置的设计方法(CNN对数据的局部性假设,RNN对数据的递归生成假设),即Attention不对文本位置等相关信息做任何假设,让模型的某个模块自己去学习。从这点出发,也可以理解,为什么Transformer的训练往往需要很大的数据集。

Attention层本身不具备区分位置的能力,解决方案:

  • 提供绝对位置编码,位置信息由给定位置i​决定并融入到tokeni向量中
  • 提供相对位置编码,位置信息由|i−j|决定,改变Attention结构使其分辨token间的相对位置

在此之前,我们首先聊聊什么是位置敏感模型?

对于模型f,如果更好序列的位置后,模型的输出和原来的不同,即

f(x1,…,xi,xj,…,xn)≠f(x1,…,xj,xi,…,xn)

那么可以称模型f是位置敏感的,像RNN、CNN都是位置敏感。而Attention不是,试设想有序列[x1,…,xn],无论其元素的顺序如何改变,输入Attention后并作GlobalMaxPooling所获得的词向量都是一样的。这意味着在分类模型下,shuffle一个句子中的元素,不改变模型的分类结果。这说明,在没有位置信息的情况下Attention、Transformer本质上是一个BOW模型。

CNN和RNN的位置信息

RNN本身是递归计算,

ht=f(xt,ht−1)

如果输入序列的原来的顺序,隐向量序列就改变了。因此递归计算本身就包括位置信息。

CNN做滑动窗口计算,卷积核为3的情况下

ht=f(xt−1,xt,xt+1)

我们都知道词向量本身不具备位置信息,序列自身的位置信息的运用需要特定的模型,如RNN。如果模型本身并不具备序列的位置信息处理能力,那么有什么解决办法?解决方案就是引入位置信息。位置信息又可以分为相对位置编码、绝对位置编码。后者是为输入添加位置信息,前者是在Attention基础上改进,使其具有分别不同token位置差别的能力。

可以理解,CNN、RNN都具有相对位置信息编码的能力,在NLU任务中,我个人的实验是在这些模型中添加绝对位置信息编码有少许提升。从另外一个角度来说,既然CNN、RNN具有学习位置信息的能力,那么在Attention模块下游接上CNN、RNN,模型则能获得学习位置信息的能力。不过如果选择RNN,Attention天生的并行性就因为递归计算而弱化,得不偿失。

我们先从绝对位置编码出发。

绝对位置编码

假设有词向量序列,其第i个为xi,绝对位置编码为一个依赖i的函数,其添加所对应位置的词向量上,即

˜xi=xi+pi

直观点看,

如果调换了token的位置,该位置的输出由于位置信息的存在就发生改变了,这样Attention就有了间接分辨不同token位置的能力。这样获得的词向量序列就具有位置信息。˜xi成了新的token序列,输入到Attention模块中,

f(x1,…,xi,xj,…,xn)≠f(˜x1,…,˜xj,˜xi,…,˜xn)

那么这个˜xi有哪些计算方法呢?

可训练的绝对位置编码

既然万物皆Embedding,那么位置也能Embedding,一种最直接的做法就是对位置编号i也使用Embedding,即

˜xi=xi+Embedding(i)

印象中最早是在Facebook的论文Convolutional Sequence to Sequence Learning中提出,这种位置编码只能支持有限长度的文本,因为训练Embedding是需要指定input_dim,那么可支持文本的最长长度就固定下来了。可训练的绝对位置编码对于不同的位置i​是随机初始化,如同token对应的Embedding一样,因此获得的位置编码本身没有显式的语义。

尽管在 Facebook 的 Convolutional Sequence to Sequence Learning 以 CNN 为主,Attention 为辅解决 seq2seq 问题,但Google 则是使用纯 Attention 解决 seq2seq 问题。两者均使用可训练的绝对位置编码得到很好的效果。这说明,位置Embedding在CNN、Attention中都有一定的作用。

sincos绝对位置编码

在论文Attention Is All You Need提到基于三角函数的绝对位置编码。

Attention 模型并不能捕捉序列的顺序信息,是对位置不敏感(position-insensitive)的模型,也就是说,如果我们把序列打乱,通过模型获得的结果还是一样的。

˜xi=xi+pi

其中pi为,

pk,2i=sin(k/100002i/d)pk,2i+1=cos(k/100002i/d)

因为三角函数间可以互相表示,因此可以统一表示为,

PEp,i=sin(p100002id+π4[1+(−1)i+1])

sincos绝对位置编码的优势是可以对任意位置p编码,没有长度约束。

Google的论文对这两种位置编码都试验,证明没有明显的差别。论文提到,通过参数学习的 position embedding 的效果和采用固定的 position embedding 相差无几,不过后者计算量更少。

在我看来,这是放弃 RNN 进行序列编码必然遇到的问题。我们可以可视化位置编码来直观感受,绘图可视化,

换个风格再次感受一下,

Google 提出的 Position Embedding 有一个有趣的性质,位置 p+k 可以由位置 p 线性表示。这里用到高中的三角函数公式,可参考这里)。

正弦余弦公式,

sin(α+β)=sinα⋅cosβ+cosα⋅sinβcos(α+β)=cosα⋅cosβ−sinα⋅sinβ

也就是说位置α+β的向量可以表示成位置α和位置β​的向量组合,这体现出位置的相对性。

代入到 Position Embedding 中,为化简表达,另 ωi=110002i/dpos,

PE2i(p+k)=sin(ωi(p+k))=sin(ωip)cos(ωik)+cos(ωip)sin(ωik)PE2i+1(p+k)=cos(ωi(p+k))=cos(ωip)cos(ωik)−sin(ωip)sin(ωik)

于是可以整理成矩阵形式,

[PE2i(p+k)PE2i+1(p+k)]=[cos(ωik)sin(ωik)−sin(ωik)cos(ωik)]×[PE2i(p)PE2i+1(p)]

因此位置PE(p+k)是可以被PE(p)​线性表示,以便模型更好地学习位置关系。

根据三角关系,也容易证明,

PE(p+k)PE(p)=PE(p−k)PE(p)

这就是说明sincos绝对位置编码无法区分前后关系,而文本的方向性在很多任务中都很重要,因此也能理解为什么BERT等Transformer模型不使用该位置编码。

疑问和思考

相加可以理解成普通的数值平均,

˜xi=xi+pi2

去掉分母也可以,下游网络会把这个scale学习回来,例如直接添加LayerNormalization模块。类别思考,相加也可以,向量拼接也可以吧?是的,这也是一种扩展思路。

既然数值平均可以,那么几何平均如何。几何平均的计算如下,

(n∏i=1xi)1n=n√x1x2⋯xn ˜xi=√xi⊗pi

甚至我们可以连开方都可以去掉,这样也可以避免xi⊗pi有负元素的情况,

˜xi=xi⊗pi

也就是说相乘,逐位置相乘。当然,这里是我自己推想的,并没有做实验验证。对于下游网络来说,本质就是拟合上游数据,既然逐位置求和可行,那么逐位置相乘也是很自然的类比。

不管可训练的绝对位置编码,或者是sincos绝对位置编码,还是逐位置相乘绝对位置编码,都是直接叠加到token对应的向量上,这类位置编码的好处是“即插即用”,不会对原来Attention模块进行干预。

相对位置编码

相对位置编码则不像绝对位置编码一样直观,需要把Attention模块纳入考虑。所谓的相对位置就是对于两个tokeni,tokenj,其位置关系需要二元(i,j)来决定转变为由|i−j|来决定。而二元关系体现在Attention模块内部,因此现展开Attention模块内部计算来看,尝试能否找到把二元关系(i,j)转变为由|i−j|。

Google最初的Attention模块中,对于位置i​,Attention模型的输出为,

eij=(xiWQ)(xjWK)T√dzαij=softmax(eij)zi=n∑j=1αij(xjWV)

这里softmax是对j​​​维度进行归一化。其位置信息叠加到xi​​向量内,因此

eij=[(xi+pi)WQ][(xj+pj)WK]T√dz

于是eij的位置信息有二元结构(i,j)决定,如何改为由|i−j|决定呢?可以看到二元结构(i,j)就体现在xi,pj上。

为引入相对位置,即把二元关系(i,j)转变为由|i−j|,在论文Self-Attention with Relative Position Representations对Attention模型做修改,称为Relation-aware Self-Attention,它做如下修改,

eij=xiWQ(xjWK+aKij)T√dzαij=softmax(eij)zi=n∑j=1αij(xjWV+aVij)

引入这两个向量aKij和aVij(红色数学符号)是为了让Attention模型获得相对位置感知。此时还没有体会到位置的相对性,关键就是解决aKij​和aVij​的取值问题,论文的做法是提供PV,PK​两个矩阵,用于位置的取值检索,有

aKij=PK[r],r=clip(i−j,pmin,pmax)aVij=PV[r],r=clip(i−j,pmin,pmax)

这里PK[r]​​指矩阵PK​​的第r​​行,由于r=clip(i−j,pmin,pmax)​​​,因此只要PK​​​矩阵的大小有限即可表达任意长度|i−j|​​的相对位置。同理,对于矩阵PV。

此外还有比较知名的相对位置编码:

  • Transformer-XL的位置编码
  • T5位置编码

以上我们总结了常见的位置编码方法,总结如下表

位置编码 内容 优点 缺点

绝对位置编码

相对位置编码

处理任意长度文本; 对Attention模型往往是入侵式;

CNN & RNN

RNN天然具有处理位置关系的能力;CNN的局部性能够处理局部位置关系。

实践中发现CNN模型中加入Position Embedding能够加强模型的位置感,有一定的提升。Position Embedding对文本分类有用吗?

除了以上位置编码外,学术界的研究还有很多,如Complex 位置编码,引入复数,不过没有深入研究过。

[1] Self-Attention with Relative Position Representations

[2] Convolutional Sequence to Sequence Learning

[3] Attention Is All You Need

转载请包括本文地址:https://allenwind.github.io/blog/11574/
更多文章请参考:https://allenwind.github.io/blog/archives/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK