精华内容
下载资源
问答
  • NewBeeNLP公众号原创出品公众号专栏作者@Maple小七北京邮电大学·模式识别与智能系统来自 ICML2020 对Transformer位置编码的探索...

    NewBeeNLP公众号原创出品        

    公众号专栏作者 @Maple小七      

    北京邮电大学·模式识别与智能系统

    来自 ICML2020 对Transformer位置编码的探索 

    • 论文:Learning to Encode Position for Transformer with Continuous Dynamical Model[1]

    • 源码:https://github.com/xuanqing94/FLOATER

    • Arxiv访问不方便的同学可以后台回复『0044』便捷获取论文喔

    「Key insight」: 针对Transformer的位置编码模块,作者提出了一种基于连续动力系统(Continuous Dynamical System)的位置编码方法:FLOATER,该方法具有如下的特点:
    1. 显式引入了顺序性的归纳偏差,能够泛化至任意长度的文本

    2. 是一种数据驱动的编码方式,并且额外增加的参数量与文本长度无关

    3. sinusoidal encoding可以看作是FLOATER的一个特例,因此使用预训练Transformer初始化FLOATER

    4. 可以在不增大参数量的前提下将位置信息直接注入到每一层中

    前情提要

    RNN和LSTM通过按顺序读取输入序列的方式来包含顺序性归纳偏差,而非自回归的Transformer由于其置换等价的特性 而对位置不够敏感,对于一些对位置信息要求较高的任务来说(NER),如何有效地对Transformer编码位置信息是很关键的问题。当前流行的位置编码包括如下三种解决方案:

    1. 三角函数编码

    「优势:」

    1. Smooth: 三角函数是光滑的:

    1. Inductive: 显式刻画了位置的顺序信息,可直接外推到长句子上。

    「不足:」

    1. Parameter-free: 是预定义的函数,不包含可学习的参数,不够灵活。但对于NMT这类对位置信息要求不高的任务是够用的。另外,Universal Transformer和ALBERT发现将位置编码注入每一层会有进一步的性能提升:

    2. 绝对位置编码

    「优势:」

    1. Data-driven: 与词向量的学习类似,通过对各个位置构建一个 的映射得到位置嵌入矩阵 ,通过可学习的参数让模型从数据中自动学习位置信息。比起sinusoidal encoding,position embedding更适合词汇级任务(BERT、RoBERTa)。由于额外参数量较大,还没有人尝试将position embedding应用到每一层上去。

    「不足:」

    1. Bounded: 需要额外增加 的参数量,需要预先指定输入文本的最大长度(如BERT、RoBERTa设定的 ),因此无法给出

    2. Non-smooth: 和词一样,不同位置的编码是独立训练得到的,然而位置和词并不完全对等,因为词汇的索引是根据词典的编排顺序来的,每个词是独立的,而位置索引天生就有顺序性。因此这样的方式不能充分建模位置的顺序关系,模型只能分辨出两个位置的不同,而不知道它们的相对关系是什么。

    3. 相对位置编码

    「优势:」

    1. Data-driven: 是可学习的

    2. Unbounded: 更直接地建模了词与词之间的相对位置关系,适用于长句子的位置编码(Transformer-XL)

    「不足:」

    1. Less flexible: 需要额外增加 的参数量,因此需要预先指定最大相对距离 防止参数量过大,这导致了距离大于 的token之间位置依赖关系的丢失。

    2. Non-smooth: 学习到的位置编码不光滑,但实际上位置编码的不光滑并不代表效果就不好。

    4. 复值函数编码

    在本文发表的同一时期,ICLR 2020: Encoding word order in complex embeddings[2]提出了一种以单词 和该单词所在位置 为自变量的连续复值函数来联合编码词汇和位置信息:

    其中振幅 ,波长 ,相位 均为需要学习的参数。这篇文章想解决的问题和本文是相似的,只是采用了完全不同的方法,不同的方法各有优缺点。

    「优势:」 该位置编码函数能够使得同一个单词在相邻的位置有相似的向量表示,能够满足位置的一些基本性质,另外,通过训练 ,模型还拥有动态调节单词 对位置的敏感程度的能力。

    「不足:」 该方法将嵌入矩阵的规模增大了三倍,显著增加了参数量。

    FLOw-bAsed TransformER (FLOATER)

    综上,本文作者认为一个好的位置编码应满足如下的三个条件:

    • 「Inductive:」 能够处理比训练过程中看到的任何序列都长的序列

    • 「Data-Driven:」 位置编码应该从数据中学习(learnable)

    • 「Parameter Efficient:」 位置编码引入的额外参数量应该不受文本长度的影响,模型尺寸的过度增加会影响泛化能力

    本文提出了一种将位置编码建模为一个连续动力系统的方法,该方法几乎克服了上述编码方式的所有缺点,「一方面显式引入了顺序性的归纳偏差,另一方面位置编码是通过训练得到的,且每个位置的编码不是独立学习的,另外额外增加的参数量不会随着序列的长度而变化,且能够自然外推到长句子上。」

    Position Encoding with Dynamical Systems

    Transformer中的位置编码可以看作是一个离散序列 ,我们可以将该序列连续化为 ,为了建立序列的自相关性,我们使用常微分方程(Neural ODE)构建一个连续动力系统:

    它的积分形式更好理解:

    方程初始条件为 是一个由 定义的神经网络,其输入为 。离散的位置编码 可以通过取 上的值得到,可以简单地将 设为 ,其中 是一个超参数。这样,我们就可以根据 解出

    在训练时采用Adjoint Method[3]计算 的梯度:

    被称为adjoint state,可以通过求解adjoint equation得到:

    作者在NMT任务上使用步长为 的Runge-Kutta法,在GLUE和RACE上使用中点法来求解上述方程。

    Parameter Sharing among Blocks

    之前提到可以在Transformer的每一层都注入位置信息,不过该方法只适用于sinusoidal embedding,因为每增加一层的位置信息,用于位置编码的参数量就会翻倍,虽然可以让每一层共享参数,但这样做的话每一层的位置编码都会是一样的,不会带来什么额外信息。

    但作者提出的连续动力系统能够在共享参数的同时,使得每一层的位置编码是不一样的,这是因为虽然每一层的 是一样的,但是初始状态 ,所以求解得到每一层的位置编码是不一样的:

    其中每一层的Neural ODE共享参数:

    Compatibility and Warm-start Training

    作者发现sinusoidal encoding实际上是FLOATER的一个特例:

    因此可以考虑将其用于模型训练的参数初始化。Transformer每一层的查询矩阵 可以表示为

    其中 为sinusoidal encoding,我们可以以同样的方式表示FLOATER,并将其分解为sinusoidal encoding和偏置项之和:

    因此FLOATER等价于在原始Transformer的基础上增加了偏置项 ,所以可以考虑直接对偏置项建模:

    然后设定 ,可以发现,当 时,,此时FLOATER退化为sinusoidal encoding。

    这样,FLOATER就和原始Transformer是兼容的,我们知道原始Transformer没有自回归结构,因此训练是非常快的,而加入了Neural ODE后的FLOATER训练速度会显著下降,所以我们可以用预训练好的模型来初始化FLOATER,然后直接在下游任务上微调模型,而不用从头训练FLOATER,这样也可以直接对比作者提出的方法是否能够带来改进。

    实验

    作者将RoBERTa作为基础模型,并设置完全相同的超参数和checkpoint,FLOATER与RoBERTa唯一的不同就是在fine-tune阶段,FLOATER需要优化位置编码中的Neural ODE。

    机器翻译

    可以注意到对每一层都注入位置信息会带来性能提升,然而Fixed-length Position Embedding是例外,这是由于引入的额外参数过多会导致模型过拟合。

    语言理解和问答

    讨论与分析

    泛化能力

    为了研究FLOATER的泛化能力有多好,作者从WMT14 En-De数据集中取出短句(,占数据集的98.6%)训练模型,并在长句上测试模型,测试结果表明FLOATER在长句翻译的表现上显著优于其他位置编码方式。

    Is RNN a good alternative to model the dynamics?

    RNN和Continuous Dynamical Model有很多相似之处,它们都有递归的特性和外推的能力,因此作者也尝试了用RNN来做位置编码:

    其中 分别代表第 个位置的位置编码和输入, 可以是scalar,也可以是vector,作者认为将其表示为sinusoidal vetor更好。实验结果显示FLOATER具有优势。作者提到将vector作为输入更好,却没有在相同参数量下与FLOATER作对比。

    What does each position encoding look like?

    下图展示了不同位置编码方式得到的编码矩阵,可以注意到position encoding底部几乎是常数,这是由于训练集中长文本太少,位置编码得不到充分的训练。而FLOATER的编码看起来更光滑。RNN存在梯度消失问题,因此低维度的位置特征没有得到充分学习。

    Remarks on Training and Testing Efficiency

    Neural ODE带来的额外时间开销是不容忽视的,即使选择简单的 (两个全连接层+一个非线性变换层)也会大大增加时间开销。因为Neural ODE需要调用微分方程求解器求解,无法利用GPU并行计算能力。

    作者尝试对偏置建模,使用原始Transformer来初始化FLOATER也是为了避免从头训练模型,另外作者还通过用小权重初始化 ,以及单独训练位置编码层,增大位置编码层的学习率,测试时使用预先计算的位置编码等手段来减小时间开销。最终,与Transformer相比,FLOATER只增加了20%-30%的训练时间。

    尾巴

    • 本文应该是少数几篇将Neural ODE用于NLP的文章,一方面是由于自然语言高度离散化的特点使得连续性假设可能并不实用,另一方面,Neural ODE目前尚处于理论发展阶段,还没有得到广泛的应用,Understanding and Improving Transformer From a Multi-Particle Dynamic System Point of View[4]曾利用动力系统来解释并优化Transformer,取得了不错的结果。

    • 就位置编码的后续处理方式来说,本文依旧选择将位置编码向量和词向量相加,但TENER[5]指出这种方式常会导致位置编码信息在后续变换中丢失。

    • 由于Transformer的模型容量是很大的,很大程度上还处于欠拟合的状态,只要提供更多的数据,训练更长的时间,模型就能得到进一步的性能提升。可以猜测,当模型的体量越来越大,数据中已经隐含着丰富的位置信息时,更先进的位置编码方式所带来的改进可能就会越来越小。

    一起交流

    想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),关注公众号回复『入群』加入吧!

    本文参考资料

    [1]

    Learning to Encode Position for Transformer with Continuous Dynamical Model: https://icml.cc/virtual/2020/poster/5906

    [2]

    ICLR 2020: Encoding word order in complex embeddings: https://iclr.cc/virtual_2020/poster_Hke-WTVtwr.html

    [3]

    Adjoint Method: http://papers.nips.cc/paper/7892-neural-ordinary-differential-equations

    [4]

    Understanding and Improving Transformer From a Multi-Particle Dynamic System Point of View: https://arxiv.org/abs/1906.02762

    [5]

    TENER: https://arxiv.org/abs/1911.04474

    [6]

    香侬读 | 基于连续动态系统学习更加灵活的位置编码: https://zhuanlan.zhihu.com/p/120349792

    [7]

    一起读论文 | Complex-order: 一种新的位置编码方式: https://zhuanlan.zhihu.com/p/110662282

    [8]

    Encoding Word Order in Complex Embeddings: https://zhuanlan.zhihu.com/p/98736506

    [9]

    Transformer的物理解释: https://zhuanlan.zhihu.com/p/71747175

    - END -



    微软ALUM:当语言模型遇到对抗训练

    2020-10-26

    重磅整理!推荐系统之深度召回模型综述(PART I)

    2020-10-29

    曲线救国 | 双非"渣硕"的秋招路

    2020-10-27

    超强整理,科班算法岗的秋招之路

    2020-10-12

    展开全文
  • ©PaperWeekly 原创 ·作者|苏剑林单位|追一科技研究方向|NLP、神经网络不同于 RNN、CNN 等模型,对于 Transformer 模型来说,位置编码的加入是必不可少的,...

    ©PaperWeekly 原创 · 作者|苏剑林

    单位|追一科技

    研究方向|NLP、神经网络

    不同于 RNN、CNN 等模型,对于 Transformer 模型来说,位置编码的加入是必不可少的,因为纯粹的 Attention 模块是无法捕捉输入顺序的,即无法区分不同位置的 Token。

    为此我们大体有两个选择:1、想办法将位置信息融入到输入中,这构成了绝对位置编码的一般做法;2、想办法微调一下 Attention 结构,使得它有能力分辨不同位置的 Token,这构成了相对位置编码的一般做法。

    虽然说起来主要就是绝对位置编码和相对位置编码两大类,但每一类其实又能衍生出各种各样的变种,为此研究人员可算是煞费苦心、绞尽脑汁了,此外还有一些不按套路出牌的位置编码。本文就让我们来欣赏一下研究人员为了更好地表达位置信息所构建出来的“八仙过海,各显神通”般的编码方案。

    绝对位置编码

    形式上来看,绝对位置编码是相对简单的一种方案,但即便如此,也不妨碍各路研究人员的奇思妙想,也有不少的变种。一般来说,绝对位置编码会加到输入中:在输入的第 k 个向量 中加入位置向量 变为 ,其中 只依赖于位置编号 k。

    1.1 训练式

    很显然,绝对位置编码的一个最朴素方案是不特意去设计什么,而是直接将位置编码当作可训练参数,比如最大长度为 512,编码维度为 768,那么就初始化一个 的矩阵作为位置向量,让它随着训练过程更新。

    现在的 BERT、GPT 等模型所用的就是这种位置编码,事实上它还可以追溯得更早,比如 2017 年 Facebook 的《Convolutional Sequence to Sequence Learning》[1] 就已经用到了它。

    对于这种训练式的绝对位置编码,一般的认为它的缺点是没有外推性,即如果预训练最大长度为 512 的话,那么最多就只能处理长度为 512 的句子,再长就处理不了了。当然,也可以将超过 512 的位置向量随机初始化,然后继续微调。

    但笔者最近的研究表明,通过层次分解的方式,可以使得位置编码能外推到足够长的范围,同时保持还不错的效果,细节请参考笔者之前的文章层次分解位置编码,让 BERT 可以处理超长文本。

    1.2 三角式

    三角函数式位置编码,一般也称为 Sinusoidal 位置编码,是 Google 的论文《Attention is All You Need》[2] 所提出来的一个显式解:

    其中 分别是位置 k 的编码向量的第 个分量。

    很明显,三角函数式位置编码的特点是有显式的生成规律,因此可以期望于它有一定的外推性。

    另外一个使用它的理由是:由于 以及 ,这表明位置 的向量可以表示成位置 位置 的向量组合,这提供了表达相对位置信息的可能性。但很奇怪的是,现在我们很少能看到直接使用这种形式的绝对位置编码的工作,原因不详。

    1.3 递归式

    原则上来说,RNN 模型不需要位置编码,它在结构上就自带了学习到位置信息的可能性(因为递归就意味着我们可以训练一个“数数”模型),因此,如果在输入后面先接一层 RNN,然后再接 Transformer,那么理论上就不需要加位置编码了。

    同理,我们也可以用 RNN 模型来学习一种绝对位置编码,比如从一个向量 出发,通过递归格式 来得到各个位置的编码向量。

    ICML 2020 的论文《Learning to Encode Position for Transformer with Continuous Dynamical Model》[3] 把这个思想推到了极致,它提出了用微分方程(ODE) 的方式来建模位置编码,该方案称之为 FLOATER。显然,FLOATER 也属于递归模型,函数 可以通过神经网络来建模,因此这种微分方程也称为神经微分方程,关于它的工作最近也逐渐多了起来。

    理论上来说,基于递归模型的位置编码也具有比较好的外推性,同时它也比三角函数式的位置编码有更好的灵活性(比如容易证明三角函数式的位置编码就是 FLOATER 的某个特解)。但是很明显,递归形式的位置编码牺牲了一定的并行性,可能会带速度瓶颈。

    1.4 相乘式

    刚才我们说到,输入 与绝对位置编码 的组合方式一般是 ,那有没有“不一般”的组合方式呢?比如 (逐位相乘)?我们平时在搭建模型的时候,对于融合两个向量有多种方式,相加、相乘甚至拼接都是可以考虑的,怎么大家在做绝对位置编码的时候,都默认只考虑相加了?

    很抱歉,笔者也不知道答案。可能大家默认选择相加是因为向量的相加具有比较鲜明的几何意义,但是对于深度学习模型来说,这种几何意义其实没有什么实际的价值。

    最近笔者看到的一个实验显示,似乎将“加”换成“乘”,也就是 的方式,似乎比 能取得更好的结果。具体效果笔者也没有完整对比过,只是提供这么一种可能性。关于实验来源,可以参考《中文语言模型研究:(1) 乘性位置编码》[4]

    相对位置编码

    相对位置并没有完整建模每个输入的位置信息,而是在算 Attention 的时候考虑当前位置与被 Attention 的位置的相对距离,由于自然语言一般更依赖于相对位置,所以相对位置编码通常也有着优秀的表现。对于相对位置编码来说,它的灵活性更大,更加体现出了研究人员的“天马行空”。

    2.1 经典式

    相对位置编码起源于 Google 的论文《Self-Attention with Relative Position Representations》[5],华为开源的 NEZHA 模型也用到了这种位置编码,后面各种相对位置编码变体基本也是依葫芦画瓢的简单修改。

    一般认为,相对位置编码是由绝对位置编码启发而来,考虑一般的带绝对位置编码的 Attention:

    其中 softmax 对 j 那一维归一化,这里的向量都是指行向量。我们初步展开

    为了引入相对位置信息,Google 把第一项位置去掉,第二项 改为二元位置向量 ,变成:

    以及 中的 换成

    所谓相对位置,是将本来依赖于二元坐标 (i,j) 的向量 ,改为只依赖于相对距离 i-j,并且通常来说会进行截断,以适应不同任意的距离:

    这样一来,只需要有限个位置编码,就可以表达出任意长度的相对位置(因为进行了截断),不管 是选择可训练式的还是三角函数式的,都可以达到处理任意长度文本的需求。

    2.2 XLNET式

    XLNET 式位置编码其实源自 Transformer-XL 的论文《Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context》[6],只不过因为使用了 Transformer-XL 架构的 XLNET [7] 模型并在一定程度上超过了 BERT 后,Transformer-XL 才算广为人知,因此这种位置编码通常也被冠以 XLNET 之名。

    XLNET 式位置编码源于对上述 的完全展开:

    Transformer-XL 的做法很简单,直接将 替换为相对位置向量 ,至于两个 ,则干脆替换为两个可训练的向量

    此外, 上的位置偏置就直接去掉了,即直接令 似乎从这个工作开始,后面的相对位置编码都只加到 Attention 矩阵上去,而不加到 上去了。

    2.3 T5式

    T5 模型出自文章《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》[8],里边用到了一种更简单的相对位置编码。思路依然源自展开式(7),如果非要分析每一项的含义,那么可以分别理解为“输入-输入”、“输入-位置”、“位置-输入”、“位置-位置”四项注意力的组合。

    如果我们认为输入信息与位置信息应该是独立(解耦)的,那么它们就不应该有过多的交互,所以“输入-位置”、“位置-输入”两项 Attention 可以删掉,而 实际上只是一个只依赖于 (i,j) 的标量,我们可以直接将它作为参数训练出来,即简化为:

    说白了,它仅仅是在 Attention 矩阵的基础上加一个可训练的偏置项而已,而跟 XLNET 式一样,在 上的位置偏置则直接被去掉了。包含同样的思想的还有微软在 ICLR 2021 的论文《Rethinking Positional Encoding in Language Pre-training》[9] 中提出的 TUPE 位置编码。

    比较“别致”的是,不同于常规位置编码对将 视为 i-j 的函数并进行截断的做法,T5 对相对位置进行了一个“分桶”处理,即相对位置是 i-j 的位置实际上对应的是 f(i-j) 位置,映射关系如下:

    具体的映射代码,读者自行看源码就好。这个设计的思路其实也很直观,就是比较邻近的位置(0~7),我们需要比较得精细一些,所以给它们都分配一个独立的位置编码,至于稍远的位置(比如8~11),我们不用区分得太清楚,所以它们可以共用一个位置编码,距离越远,共用的范围就可以越大,直到达到指定范围再 clip。

    2.4 DeBERTa式

    DeBERTa 也是微软搞的,去年 6 月就发出来了,论文为《DeBERTa: Decoding-enhanced BERT with Disentangled Attention》[10],最近又小小地火了一把,一是因为它正式中了 ICLR 2021,二则是它登上 SuperGLUE [11] 的榜首,成绩稍微超过了 T5。

    其实 DeBERTa 的主要改进也是在位置编码上,同样还是从展开式(7)出发,T5 是干脆去掉了第 2、3 项,只保留第 4 项并替换为相对位置编码,而 DeBERTa 则刚刚相反,它扔掉了第 4 项,保留第 2、3 项并且替换为相对位置编码(果然,科研就是枚举所有的排列组合看哪个最优):

    至于 的设计也是像式(6)那样进行截断的,没有特别的地方。

    不过,DeBERTa 比较有意思的地方,是提供了使用相对位置和绝对位置编码的一个新视角,它指出 NLP 的大多数任务可能都只需要相对位置信息,但确实有些场景下绝对位置信息更有帮助,于是它将整个模型分为两部分来理解。

    以 Base 版的 MLM 预训练模型为例,它一共有 13 层,前 11 层只是用相对位置编码,这部分称为 Encoder,后面 2 层加入绝对位置信息,这部分它称之为 Decoder,还弄了个简称 EMD(Enhanced Mask Decoder);至于下游任务的微调截断,则是使用前 11 层的 Encoder 加上 1 层的 Decoder 来进行。

    SuperGLUE 上的成绩肯定了 DeBERTa 的价值,但是它论文的各种命名真的是让人觉得极度不适,比如它自称的 “Encoder”、“Decoder” 就很容易让人误解这是一个 Seq2Seq 模型,比如 EMD 这个简称也跟 Earth Mover's Distance 重名。虽然有时候重名是不可避免的,但它重的名都是 ML 界大家都比较熟悉的对象,相当容易引起误解,真不知道作者是怎么想的...

    其他位置编码

    绝对位置编码和相对位置编码虽然花样百出,但仍然算是经典范围内,从上述介绍中我们依然可以体会到满满的套路感。除此之外,还有一些并不按照常规套路出牌,它们同样也表达了位置编码。

    3.1 CNN式

    尽管经典的将 CNN 用于 NLP 的工作《Convolutional Sequence to Sequence Learning》[12] 往里边加入了位置编码,但我们知道一般的 CNN 模型尤其是图像中的 CNN 模型,都是没有另外加位置编码的,那 CNN 模型究竟是怎么捕捉位置信息的呢?

    如果让笔者来回答,那么答案可能是卷积核的各项异性导致了它能分辨出不同方向的相对位置。不过 ICLR 2020 的论文《How Much Position Information Do Convolutional Neural Networks Encode?》[13] 给出了一个可能让人比较意外的答案:CNN模型的位置信息,是Zero Padding泄漏的!

    我们知道,为了使得卷积编码过程中的 feature 保持一定的大小,我们通常会对输入 padding 一定的 0,而这篇论文显示该操作导致模型有能力识别位置信息。也就是说,卷积核的各向异性固然重要,但是最根本的是 zero padding 的存在,那么可以想象,实际上提取的是当前位置与 padding 的边界的相对距离。

    不过,这个能力依赖于 CNN 的局部性,像 Attention 这种全局的无先验结构并不适用,如果只关心 Transformer 位置编码方案的读者,这就权当是扩展一下视野吧。

    3.2 复数式

    复数式位置编码可谓是最特立独行的一种位置编码方案了,它来自 ICLR 2020 的论文《Encoding word order in complex embeddings》[14]。论文的主要思想是结合复数的性质以及一些基本原理,推导出了它的位置编码形式(Complex Order)为:

    这里的 是虚数单位,j 代表某个词,k 代表该词所在的位置,而:

    代表词j的三组词向量。你没看错,它确实假设每个词有三组跟位置无关的词向量了(当然可以按照某种形式进行参数共享,使得它退化为两组甚至一组),然后跟位置k相关的词向量就按照上述公式运算。

    你以为引入多组词向量就是它最特立独行的地方了?并不是!我们看到式(11)还是复数形式,你猜它接下来怎么着?将它实数化?非也,它是将它直接用于复数模型

    也就是说,它走的是一条复数模型路线,不仅仅输入的 Embedding 层是复数的,里边的每一层 Transformer 都是复数的,它还实现和对比了复数版的 Fasttext、LSTM、CNN 等模型!这篇文章的一作是 Benyou Wang,可以搜到他的相关工作基本上都是围绕着复数模型展开的,可谓复数模型的铁杆粉了。

    3.3 融合式

    无偶独有,利用复数的形式,笔者其实也构思了一种比较巧的位置编码,它可以将绝对位置编码与相对位置编码融于一体,分享在此,有兴趣的读者欢迎一起交流研究。

    简单起见,我们先假设 是位置分别是 m,n 的二维的行向量,既然是二维,那么我们可以将它当作复数来运算。我们知道,Attention 关键之处在于向量的内积,用复数表示为:

    其中 是共轭复数,右端的乘法是普通的复数乘法, 表示取结果的实部。换句话说:

    两个二维向量的内积,相当于把它们当复数看时,一个复数与另一个复数的共轭的乘积实部。如果我们将 分别乘以 变成 ,那么就相当于给它们配上了绝对位置编码了(因为显式地依赖绝对位置 m,n),然后放到内积里边,我们有:

    相当有意思的是,内积只依赖于相对位置 m-n!这就巧妙地将绝对位置与相对位置融合在一起了。

    注意,我们没有像 Complex Order 那么“疯狂”,上述运算本质上还是在实数范畴内的,只不过我们是借助复数来完成了某些推导而已。由上述结果可知,对于位置为n的二维实数向量 [x,y],我们当它复数来运算,乘以 ,得到:

    即通过:

    来赋予它绝对位置信息,那么它在 Attention 运算的时候同时也等价于相对位置编码。如果是多于二维的向量,可以考虑每两维为一组进行同样的运算,每一组的 可以不一样。

    这样一来,我们得到了一种融绝对位置与相对位置于一体的位置编码方案,从形式上看它有点像乘性的绝对位置编码。初步实验显示它是可以 work 的,但还没有充分验证,欢迎大家尝试交流。

    文章内容小结

    本文汇总了一些位置编码的工作,大体分为绝对式、相对式、非套路式三种,从中我们可以看到各色神奇的操作。最后,笔者分享了自己构思的一种融合绝对位置与相对位置的编码方案,供有兴趣的读者参考。

    参考文献

    [1] https://arxiv.org/abs/1705.03122

    [2] https://arxiv.org/abs/1706.03762

    [3] https://arxiv.org/abs/2003.09229

    [4] https://zhuanlan.zhihu.com/p/183234823

    [5] https://arxiv.org/abs/1803.02155

    [6] https://arxiv.org/abs/1901.02860

    [7] https://arxiv.org/abs/1906.08237

    [8] https://arxiv.org/abs/1910.10683

    [9] https://arxiv.org/abs/2006.15595

    [10] https://arxiv.org/abs/2006.03654

    [11] https://super.gluebenchmark.com/

    [12] https://arxiv.org/abs/1705.03122

    [13] https://arxiv.org/abs/2001.08248

    [14] https://arxiv.org/abs/1912.12333

    更多阅读

    #投 稿 通 道#

     让你的论文被更多人看到 

    如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

    总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

    PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

    ???? 来稿标准:

    • 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向) 

    • 如果文章并非首发,请在投稿时提醒并附上所有已发布链接 

    • PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

    ???? 投稿邮箱:

    • 投稿邮箱:hr@paperweekly.site 

    • 所有文章配图,请单独在附件中发送 

    • 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

    ????

    现在,在「知乎」也能找到我们了

    进入知乎首页搜索「PaperWeekly」

    点击「关注」订阅我们的专栏吧

    关于PaperWeekly

    PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

    展开全文
  • 公众号关注“Python遇见机器学习”设为“星标”,第一时间知晓最新干货~转自https://blog.csdn.net/smilesooo/article/details/106224377位置编码1位置编码1. 引入文本序列是一种时序型数据,单词之间地顺序关系往往...

    9cdc7e1fcda27ae4cbeefd516969e51e.png公众号关注 “Python遇见机器学习”

    设为“星标”,第一时间知晓最新干货~

    转自https://blog.csdn.net/smilesooo/article/details/106224377

    位置编码

    1

    位置编码

    1. 引入

    文本序列是一种时序型数据,单词之间地顺序关系往往会影响整个句子的含义。RNN网络在做文本生成时,顺序考虑每个时间步的文本信息,文本的输出会根据单词的输入顺序改变而改变,换句话说RNN模型考虑到了单词的顺序关系,因此不需要考虑单词的位置编码信息。卷积神经网络对局部词序敏感,可较好地建模N-Gram信息,这部分信息对于文本分类任务已经能取得较好地效果。但Transformer模型在处理句子时,将所有单词并行处理,由于每个单词都能考虑到整个句子所有单词的信息,因此若不考虑单词的位置编码,打乱单词顺序时,整个句子的输出应该是一样的,即Transformer模型是一种对单词位置不敏感的模型。

    位置编码的方式主要有两种,一种是定义nn.Embedding子层,让整个网络学习到序列的位置编码信息,另一种是对每一个位置的单词,通过固定的函数得到单词的位置编码信息。

    2. 位置编码初始模型

    尽管卷积神经网络可利用序列地局部顺序信息,但没法获得相隔较远的两个单词之间的信息。《Convolutional Sequence to Sequence Learning》最初提出Position Embedding,编码层考虑将Word Embedding 和 Position Embedding 相加。这一点与Bert中的实现类似,Word Embedding 和 Position Embedding 都需要通过训练学习得到,实现伪代码如下def __init__():    self.tok_embedding = nn.Embedding(input_dim, emb_dim)    self.pos_embedding = nn.Embedding(max_length, emb_dim) def forward(word_ids, position_ids):    word_embedding = self.tok_embedding(word_ids)    position_embedding = self.pos_embedding(position_ids)    input_embedding = word_embedding + position_embedding

    二. Transformer模型中的位置编码

    1. Embedding层的相对位置编码(Absolute Position Embedding)

    相对位置编码可表示两个单词 i 和 j 之间的距离。        Transformer模型中的Self-Attention不清楚单词之间的位置信息,无法学习到序列中单词的顺序信息,因此在Embedding层加入Position Embedding子层。为了计算方便,Transformer模型中采用绝对位置编码,即对每一个单词的每一个维度,都给定绝对的数值,模型不需要学习就可得到编码信息。

    b8bcf6b7e978eb3b5926f343e7bea7e3.png        pos表示某个词在句子序列中的实际位置,i 表示词向量的第 i 个维度。在Transformer模型中取值为512。对于某个位置pos处的词向量,向量的偶数维采用正弦公式,向量的奇数维采用余弦公式。这种编码方式既能表示相对位置,又能够表示绝对位置。 为什么三角函数能够捕获两个单词之间的相对位置信息?

    a32eb12523cb0feee82b0260e254d6d1.png 对于pos位置处的单词的词向量表示为PE(pos),偏移 k 个位置后的向量表示为线性组合。

    13e1d0b0d14d2a95cb321d8cc11c135e.png因此Transformer模型可捕捉到两个单词之间的距离。

    2. 考虑Self-Attention的位置编码(Position Embedding) 根据位置编码计算公式,第 t 个单词的位置编码为

    b31636dc479880f7f7651834b1ba47e3.png

    其中,d是位置编码的向量维度,c 是一个由 i 决定的常数,计算公式为:

    361b05a52b1423d328a2013d985846d9.png因此定义两个单词的距离为两个单词的位置编码之间的乘积,因此可得到以下计算公式:

    8fb27b7c866a6c98762dcde8ea9870bb.png

    80a5394e61cd8f20beda548a21131422.png

    对于在单词 t 的前 k 个位置和后 k 个位置的单词,存在关系:

    af94b38a8435acb503d64845cc6b8502.png

    由此可看出sinusoidal position embedding并不能反应单词的方向,即左边还是右边的单词。假设j = i - k , 则存在以下关系:

    b8a882a310dd24e5027a5b2b1ff5640f.png由此可得出sinusoidal position embedding可判断两个单词之间的距离,但没法判断单词之间的方向。

    c0d46b38a768011cb2705f570f1ae1d2.png 对于上述位置编码,如果考虑两个单词之间的 attention 信息,则上述位置编码会失去原有的距离属性。考虑attention后,

    10e4b178009165aa13b426d7b10271f4.png

    则变为

    947f022dc1f65b4fec642444affc0d25.png

    Wk,Wq是Transformer中的Attention层需要学习的参数。进一步,我们将中间的线性变换矩阵抽象为W,那么如下图,从图中可以看出,如果中间的参数矩阵需要学习,则会打破位置编码的距离功能。

    1c1ff31952288f57273a62a6f62a8940.png

    在上图中,k表示两个单词之间的位置距离,蓝线可表示为Ui*Uj,下面两条曲线可分别标识为 Ui*W1*Uj 和 Ui*W2*Uj ,其中W1, W2为两个随机的参数矩阵。但在Transformer的实现过程中,W1, W2为两个可学习的参数矩阵,具体的过程可以通过bert中的参数来观察是否能学习到参数矩阵 Wq*Wk 使得 Ui*Wq*Wk*Uj能够表示相对位置信息。

    如果想要改进位置编码的话,不妨去看一下Relation-Aware Self-Attention, Transformer-XL中的Relative Position, 还有基于树结构和复数域的词向量编码。

    推荐阅读

    •  Attention系列-1 注意力机制从何来,是何物

    •  Attention系列-2 self-attention机制

    •  改改Python代码,运行速度还能提升6万倍,Science:先别想摩尔定律了

    •  ICCV2019BestPaper : 仅用一张训练图像来进行图像生成

    6980117a97258dbaa4bcb5a67844b2ac.png

    展开全文
  • 5分钟理解transformer模型位置编码

    千次阅读 2020-08-07 16:43:25
    Bert模型是自然语言处理方面程碑式的进步,核心是transformer层, 而transformer是自注意力编码器,循环网络天生的文字顺序信息在自...所以transformer的作者设计了一个位置编码方式,为每个不同位置的token ...

    Bert模型是自然语言处理方面里程碑式的进步,其核心是transformer层, 而transformer采用自注意力编码器摒弃了循环网络,循环网络天生的顺序信息在自注意力编码器中没有了,而语言往往是顺序不同意思相差很大。所以transformer的作者设计了一种三角函数位置编码方式,为每个不同位置的token单独生成一个位置向量(或者位置嵌入,即position embedding,缩写为PE)。下面的公式是位置编码的公式,但是论文及网上其他文章对公式解释不是很清楚,所以我在此采用例子来帮助初学者理解。

    式中pos为token在序列中的位置号码,它的取值是0到序列最大长度max_que_length-1之间的整数。比如“[cls] 我 爱 中 华 [sep]”是6个token组成的序列,[cls]的pos值为0,“我”的pos值为1,“爱”的pos为2,“中”为3,“华”为4,'[sep]'为5 。bert base最大长度max_que_length是512,pos取值还能一直到511。当然如果序列真实长度小于最大长度时,后面的位置号没有意义,最终会被mask掉。

    dmodel是位置向量的维度,与整个模型的隐藏状态维度值相同,这解释了为什么起dmodel这个名字,这个维度在bert base模型里设置为768。

    i 是从0到dmodel/2-1之间的整数值,即0,1,2,...383。

    2i  是指向量维度中偶数维,即第0维,第2维,第4维,直到第766维。

    2i+1 是维度中奇数维,即第1维,第3维,第5维,直到第767维。

    PE是一个矩阵,行数是最大的序列长度max_que_length,列数是dmodel,即它的形状为[max_que_length,dmodel]

    PE(pos,2i)是PE矩阵中第pos行,第2i列的数值,是个标量。这里是在第偶数列上的值,偶数列用正玄函数计算。

    PE(pos,2i+1) 是PE矩阵中第pos行,第2i+1列的数值,是个标量。这里是在第奇数列上的值,奇数列用余玄函数计算。

    仍然以序列“[cls] 我 爱 中 华 [sep]”为例,现在计算序列中"我"的位置向量,这个向量有768维,我考虑前面4维的值和最后2维做为例子,其他维度则省略:

    "我"在序列中位置pos的值是1,当i=0时,2i表示第0维,2i+1表示第1维,dmodel=768,为简洁,此处小数点后只取2位

    PE(1,0)= sin(1/(10000)^(0/768)) = sin(1/1) = sin(1) = 0.84

    PE(1,1) = cos(1/(10000)^(0/768)) = cos(1/1)=cos(1) = 0.54

    再看当i=1时的第2维和第3维

    PE(1,2) = sin(1/(10000^(2/768))) = sin(1/(10000^(1/384)))=sin(1/1.02)=0.83

    PE(1,3) = cos(1/(10000^(2/768))) = cos(1/1.02) = 0.56

    再看最后两维的情况,这时i=383:

    PE(1,766) = sin(1/(10000^(766/768))) = sin(1/9763.00) = 0.00

    PE(1,767) = cos(1/(10000^(766/768))) = cos(1/9763.00) = 1.00

    那token"我"的位置向量大概样子是

    [0.84,0.54,。。。,0.00,1.00]

    再看看当位置号pos不断增大时,某一维比如第0维的值是怎么变化的。因为三角函数是关于2倍圆周率Pi的周期函数,所以把数值转为Pi的倍数

    P(1,0)=sin(1)=sin(0.31Pi)

    P(2,0)=sin(2)=sin(0.64Pi)

    P(3,0)=sin(3)=sin(0.96Pi)

    P(6,0)=sin(6)=sin(1.91Pi)

    P(7,0)=sin(7)=sin(2.23Pi)=sin(0.23Pi)

    P(8,0)=sin(8)=sin(2.54Pi)=sin(0.54Pi)

    由此可看出,由于三角函数是周期函数,随着位置号的增加,相同维度的值有周期性变化的特点。

     

    transformer为什么设计这样的编码方式来生成位置向量呢? 因为三角函数有个性质

                       sin(a+b) = sin(a) * cos(b) + cos(a) * sin(b)

                      cos(a+b) = cos(a) * cos(b) - sin(a) * sin(b)

     因此可以推导出,两个位置向量的点积是一个与他们两个位置差值(即相对位置)有关,而与绝对位置无关。这个性质使得在计算注意力权重的时候(两个向量做点积),使得相对位置对注意力发生影响,而绝对位置变化不会对注意力有任何影响,这更符合常理。

    比如”我爱中华“这句话,”华“与”中“相对位置为1,华与中的相关性程度取决于相对位置值1。而如果这句话前面还有其他字符,那华和中两个字的绝对位置会变化,这个变化不会影响到中华这两个字的相关程度。

    但是这里似乎有个缺陷,就是这个相对位置没有正负之分,比如"华"在"中"的后面,对于"中"字,"华"相对位置值应该是1,而"爱"在"中"的前面,相对位置仍然是1,这就没法区分到底是前面的还是后面的。

     

    transformer的位置向量还有一种生成方式是可训练位置向量。即随机初始化一个向量,然后由模型自动训练出最可能的向量。transformer的作者指出这种可训练向量方式的效果与正玄余玄编码方式的效果差不多。在bert的代码中采用的是可训练向量方式。

     

    展开全文
  • 理解Transformer中的位置编码

    千次阅读 2020-03-02 21:41:44
    理解Transformer中的位置编码为什么要位置编码 为什么要位置编码 【文本分类】 I like this movie because it doesn’t have an overhead history. Positive I don’tlike this movie because it has an overhead ...
  • Transformer模型中的位置编码 pos表示某个词在句子序列中的实际位置,i 表示词向量的第 i 个维度。在Transformer模型中取值为512。对于某个位置pos处的词向量,向量的偶数维采用正弦公式,向量的奇数维采用余弦...
  • transformer模型是当前大红大热的语言模型,今天要讲解的是transformer中的positional encoding(位置编码). 我们知道,transformer模型的attention机制并没有包含位置信息,即一句话中词语在不同的位置时在...
  • transformer引入位置信息--Sinusoidal位置编码为什么transformer需要位置编码Sinusoidal位置编码 首先,所有技术都是个人理解,并感谢技术各位分享,由此根据理解自己做个小结,希望可以帮助到需要的朋友,所有博文...
  • 2017年来自谷歌的Vaswani等人提出了Transformer模型[1],一种新颖的纯粹采用注意力机制实现的Seq2Seq架构,它具备并行化训练的能力,拥有非凡的性能表现,这些特点使它深受NLP研究人员们的喜欢,成为NLP领域的标志性...
  • 引言Transformer是近年来非常流行的处理序列到序列问题的架构,其self-attention机制允许了长距离的词直接联系,可以使模型更容易学习序列的长距离依赖。由于其优良的可并行性...
  • transformer模型是当前大红大热的语言模型,今天要讲解的是transformer中的positional encoding(位置编码)。 我们知道,transformer模型的attention机制并没有包含位置信息,即一句话中词语在不同的位置时在.
  • https://github.com/guotong1988/transformer_relative_position_embedding
  • Transformer中的位置编码(PE,position encoding) 参考链接 https://blog.csdn.net/Flying_sfeng/article/details/100996524 https://blog.csdn.net/u012526436/article/details/86295971 transformer模型是当前...
  • Transformer-based模型中的位置信息编码

    千次阅读 2020-02-02 17:24:32
    于是本文对于Transformer相关的模型中对于字词的位置编码方式进行简单的总结。本文参考了https://zhuanlan.zhihu.com/p/92017824。 1.原生的transformer中使用的是绝对位置的函数式位置编码,使用的是正余弦函数。...
  • ©PaperWeekly 原创 ·作者|苏剑林单位|追一科技研究方向|NLP、神经网络最近笔者做了一些理解和改进Transformer的尝试,得到了一些似乎还有价值的经验和结论,遂开一个...
  • ©PaperWeekly 原创 ·作者|苏剑林单位|追一科技研究方向|NLP、神经网络上一篇文章中,我们对原始的 Sinusoidal 位置编码做了较为详细的推导和理解,总的感觉是 Si...
  • Transformer-XL中,由于设计了segments,如果仍采用transformer模型中的绝对位置编码的话,将不能区分处不同segments内同样相对位置的词的先后顺序。 比如对于$segment_i$的第k个token,和$segment_j$的第k个...
  • transformer--编码部分

    2021-04-19 14:11:07
    transformer编码部分 Positional Encoding 位置嵌入:就是在输入中加入包含句子中特定位置信息的维向量 位置嵌入的维度与输入时间序列的维度相同,为 [序列长度, 所处位置]。 一般输入的为多时次的时间序列,...
  • 对此,美团提出了一种新型隐式条件位置编码方法,基于该方法的 CPVT 模型性能优于 ViT 和 DeiT。 **机器之心发布,**机器之心编辑部。 随着 Facebook 的 DETR (ECCV 2020)[2] 和谷歌的 ViT (ICLR 2021)[3] 的...
  • [NLP] 相对位置编码(一) Relative Position Representatitons (RPR) - Transformer
  • 本文转载自机器之心。Transformer 跨界计算机视觉的热潮之下,有一个问题需要解决:如何像 CNN 一样直接处理不同尺寸的输入?对此,美团提出了一种新型隐式条件位置编码方法,基于该方...
  • d_model, 2) * -(math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) pe #sin编码 pe = np.zeros((3, 4)) i = 0 pos = 1 dmodel = 4 temp...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 180
精华内容 72
关键字:

transformer位置编码