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

FLOATER:更加灵活的Transformer位置编码!相关推荐

  1. 面经:什么是Transformer位置编码?

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:陈安东,中央民族大学,Datawhale成员 过去的几年里,Tra ...

  2. [深度学习] 自然语言处理---Transformer 位置编码介绍

    2017年来自谷歌的Vaswani等人提出了Transformer模型,一种新颖的纯粹采用注意力机制实现的Seq2Seq架构,它具备并行化训练的能力,拥有非凡的性能表现,这些特点使它深受NLP研究人员 ...

  3. 什么?是Transformer位置编码

    作者:陈安东,中央民族大学,Datawhale成员 过去的几年里,Transformer大放异彩,在各个领域疯狂上分.它究竟是做什么,面试常考的Transformer位置编码暗藏什么玄机?本文一次性讲 ...

  4. Transformer位置编码图解

    在语言中,单词的顺序及其在句子中的位置非常重要. 如果重新排列单词,整个句子的意思可能会发生变化. 在实施 NLP 解决方案时,循环神经网络具有处理序列顺序的内置机制. 然而,transformer ...

  5. ICML 2020 | 基于连续动态系统学习更加灵活的位置编码

    论文标题: Learning to Encode Position for Transformer with Continuous Dynamical Model 论文作者: Xuanqing Liu ...

  6. Transformer架构:位置编码

    2017年,Google的Vaswani 等人提出了一种新颖的纯注意力序列到序列架构,闻名学术界与工业界的 Transformer 架构横空出世.它的可并行化训练能力和优越的性能使其成为自然语言处理领 ...

  7. Transformer升级之路:博采众长的旋转式位置编码

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 上一篇文章中,我们对原始的 Sinusoidal 位置编码做了较为详细的推导和理解,总的感觉是 Sinus ...

  8. 基于Transformer的文本情感分析编程实践(Encoder编码器-Decoder解码器框架 + Attention注意力机制 + Positional Encoding位置编码)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) Encoder编码器-Decoder解码器框架 + Atten ...

  9. 相对位置编码与绝对位置编码

    1 绝对位置编码 在输入的第k个向量xk中加入位置向量pk变为xk+pk,其中pk只依赖于位置编号k. 训练式 将位置编码当作可训练参数,比如最大长度为512,编码维度为768,那么就初始化一个512 ...

最新文章

  1. 春节到,献诗一首,祝大家新春愉快
  2. 英特尔推出全新至强处理器E5 v4产品家族
  3. php左连接,如何在php中对左联接查询返回的数组数据进...
  4. JS 对象(Object)和字符串(String)互转
  5. c++ select函数_PySpark 操作函数一览
  6. [html] 列举下哪些块元素里面不能放哪些块元素呢?
  7. docker gitlab-ce
  8. CentOS6.X内核升级
  9. 普及下Oracle hints语法
  10. hdfs文件分块 java_Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
  11. 3D GAME PROGRAMMING WITH DIRECTX11(3)
  12. 花音机器人_【扑杀花音攻略组】超弩级暗机器人攻略 (复刻X2)
  13. 【朝花夕拾】Lint篇
  14. nova青春版支持鸿蒙吗,华为nova青春版评测:高颜值年轻人必备
  15. jsoup模拟登陆合肥工业大学信息门户
  16. 湖人VS爵士!!科比4月14日最后一战,本赛季最高得分!狂得60分!!完美大逆转!!!...
  17. 用c语言写个简单的电话薄
  18. 玩客云5.9千兆固件、docker、青龙面板
  19. 手把手带你使用EFR32 -- 土壤湿度传感器变身第二形态,以 ZigBee 形态出击
  20. 事务原子性、一致性、持久性的实现原理

热门文章

  1. 图文详解贷中监控报表与资产质量分析全过程
  2. vueRouter使用心得
  3. Java基础——Oracle(二)
  4. linux中的管道和重定向
  5. python列表分组的技巧
  6. Jquery常用方法合集,超实用
  7. 96. Unique Binary Search Trees(I 和 II)
  8. Jmeter安装设置
  9. LVS负载均衡DR模式部署
  10. COM编程之四 引用计数