作者:高开远
学校:上海交通大学
研究方向:自然语言处理
在前一篇 站在BERT肩膀上的NLP新秀们(PART I)介绍了两个都叫ERNIE的模型,非常有趣思路也挺相似的,都是给bert模型增加外部知识信息,使其能更好地“感知“真实世界。再补一个THU的ERNIE报告PPT:ERNIE from THU (https://pan.baidu.com/s/1TjGOB2myXT-bln3OpFcbgA 提取码:35fv)
今天我们来看看另外几个有意思的BERT新秀:
XLMs from Facebook
LASER from Facebook
MASS from Microsoft
UNILM from Microsoft
对于BERT的改进可以大体分为两个方向:第一个是纵向,即去研究bert模型结构或者算法优化等方面的问题,致力于提出一种比bert效果更好更轻量级的模型;第二个方向是横向,即在bert的基础上稍作修改去探索那些vanilla bert还没有触及的领域。直观上来看第二个方向明显会比第一个方向简单,关键是出效果更快。本文就属于第二类。
突然想起来有一次面试,面试官问完bert的原理之后又接着问了bert的缺点在哪,当时也没有看到这些改进bert的论文,傻乎乎地不知道回答什么,大概这就是井底之蛙吧哈哈。
我们知道,bert预训练的语料全是单语言的,所以可想而知最终的模型所适用的范围基本也是属于单语范围的NLP任务,涉及到跨语言的任务可能表现就不那么好。基于此,作者们提出了一种有效的跨语言预训练模型,Cross-lingual Language Model Pretraining(XLMs)。 XLMs可以认为是跨语言版的BERT,使用了两种预训练方式
基于单语种语料的无监督学习
基于跨语言的平行语料的有监督学习
其在几个多语任务上比如XNLI和机器翻译都拉高了SOTA。那么我们就来看看具体的模型,整体框架和BERT是非常类似,修改了几个预训练目标。
目前的词向量基本都是在单语言语料集中训练得到的,所以其embedding不能涵盖跨语言的语义信息。为了更好地将多语言的信息融合在一个共享的词表中,作者在文本预处理上使用了字节对编码算法(Byte Pair Encoding (BPE)),大致思想就是利用单个未使用的符号迭代地替换给定数据集中最频繁的符号对(原始字节)。这样处理后的词表就对语言的种类不敏感了,更多关注的是语言的组织结构。
关于BEP的具体栗子可以参考:Byte Pair Encoding example
这里的CLM就是一个传统的语言模型训练过程,使用的是目前效果最好的Transformer模型。对于使用LSTM 的语言模型,通过向 LSTM 提供上一个迭代的最后隐状态来执行时间反向传播 (backpropagation through time, BPTT)。而对于 Transformer,可以将之前的隐状态传递给当前的 batch,为 batch 中的第一个单词提供上下文。但是,这种技术不能扩展到跨语言设置,因此在这里作者们进行了简化,只保留每个 batch 中的第一个单词,而不考虑上下文。
这一个预训练目标同BERT的MLM思想相同,唯一不同的就是在于模型输入。BERT的输入是句子对,而XLM使用的是随机句子组成的连续文本流。此外,为了避免采样不均,对相对频繁的输出采用与频率倒数的平方根成正比的权重从多项式分布中进行子采样。
这一部分应该是对跨语言任务取得提升的最大原因。不同于以上两个预训练模型(单语言语料训练 + 无监督训练),翻译语言模型使用的是有监督的跨语言并行数据。如下图所示输入为两种并行语言的拼接,同时还将BERT的原始embedding种类改进为代表语言ID的Laguage embedding和使用绝对位置的Position embedding。这些新的元数据能够帮助模型更好地学习不同语言相关联Token之间的关系信息。
TLM训练时将随机掩盖源语言和目标语言的token,除了可以使用一种语言的上下文来预测该Token之外(同BERT),XLM还可以使用另一种语言的上下文以及Token对应的翻译来预测。这样不仅可以提升语言模型的效果还可以学习到source和target的对齐表示。
XLM – Enhancing BERT for Cross-lingual Language Model
跨语言模型预训练,三大任务刷新最高性能 | Facebook
机器之心解读
官方源码
XLM的主要思想还是来自于这片文章,借用了BERT的框架最后成了XLM。在本文中,作者们认为大多是涉及多语言的NLP研究都关注于高资源语种,比如英文、汉语等,因此训练出来的模型对low-resource语种适用性较差。另外,对于不同语言需要训练不同的模型实在是不够智能。基于此,本文提出了一种可以用单个模型解决多种语言的工具: LASER(Language-Agnostic SEntence Representations)
如上图所示,LASER的 主要思想是将所有语种的训练语料通过一个encoder(包含多个Bi-LSTM + max-pooling)来得到句子表示,然后用这个上下文表示去decode。
注意,为了更好地使得模型对语种不敏感且尽可能多的利用不同语种之间的关系信息,文中采用了BPE算法训练所有语种训练集拼接的语料,得到Encoder的输入 BPE embedding。Decoder的输入由三部分组成:【encoder的输出,预测出的前一个token的BPE, 语种ID】。另外encoder和decoder没有其他链接,因为作者希望通过句子嵌入捕获输入序列的所有相关信息。
在训练方式上采用的是翻译的形式,将输入分词后翻译成2中语言(文中选择的是英文和西班牙语),试验发现翻译成一个语种的效果不好,需要翻译成2个目标语种,也不一定所有的都需要翻译成2个,大部分翻译就行。模型训练完成之后,decoder就没啥作用了,在下游任务中将encoder拿来使用。
文章的想法是挺赞的,但是在实现的时候有些不足之处。比如需要分词,使用的是双向LSTM而不是效果更好的Transformer。
Zero-shot transfer across 93 languages: Open-sourcing enhanced LASER library
官方开源库
我们知道,bert只使用了Transformer的encoder部分,其下游任务也主要是适用于自然语言理解(NLU),对于类似文本摘要、机器翻译、对话应答生成等自然语言生成(NLG)任务显然是不太合适的。
BERT的大火,也带动了NLP届的pre-training大火,受到bert的启发,作者们提出联合训练encoder和decoder的模型:Masked Sequence to Sequence Pre-training for Language Generation(MASS),框架如下:
训练步骤主要分为两步:
Encoder: 输入为被随机mask掉连续部分token的句子,使用Transformer对其进行编码;这样处理的目的是可以使得encoder可以更好地捕获没有被mask掉词语信息用于后续decoder的预测;
Decoder: 输入为与encoder同样的句子,但是mask掉的正好和encoder相反,和翻译一样,使用attention机制去训练,但只预测encoder端被mask掉的词。该操作可以迫使decoder预测的时候更依赖于source端的输入而不是前面预测出的token,防止误差传递。
MASS 预训练输入为 m 个 token 的句子,将位置 u 到 v 之间的 mask 掉之后的输入为,其中表示被 mask 掉的片段。MASS 预训练目的预测输入中被 mask 掉的。
此外,作者们还提出了一个对于mask长度的超参数k,并指出当k=1时,即encoder屏蔽一个token,decoder没有输入,该形式与BERT的MLM训练模型一致。(但是BERT不是随机离散mask的嘛,好像还不太一样)
当k=m时,即encoder完全mask掉,decoder输入为完整句子,该形式与OPENAI的GPT模型一致
由于K值为超参数,属于人为设定,作者们又在文章末尾对其进行了分析,通过多个试验表明,当k为句子长度的50%~70%时模型效果最好。
ICML 2019|序列到序列自然语言生成任务超越BERT、GPT!微软提出通用预训练模型MASS
如何看待 MSRA 在 ICML'19 上的工作 MASS?
这个就更炸了,也是微软的最近才放出的工作,直接预训练了一个微调后可以同时用于自然语言理解和自然语言生成下游任务的模型:UNIfied pre-trained Language Model (UNILM)。
看完论文之后会发现非常自然,使用的核心框架还是Transformer,不同的是预训练的目标函数结合了以下三个:
单向语言模型(同ELMO/GPT)
双向语言模型(同BERT)
seq2seq语言模型(同上一篇)
注意哦,这里的Transformer是同一个,即三个LM目标参数共享,有点multi-task learning的感觉,可以学习到更general的文本表示。
okay,来看模型
模型的输入是一个序列,对于单向LM是一个文本片段,对于双向LM和seq2seq LM是两段文本。embedding模式使用的是跟BERT一样的三类:
token embedding:使用subword unit
position embedding:使用绝对位置
segment embedding:区分第一段和第二段
另外,[SOS]为输入序列起始标志;[EOS]为在NLU任务中为两个segment的分界标志,在NLG任务中为解码结束标志。
文中使用的是多层堆叠的 Transformer(24 层,与相同),输入表示为,第 K 层的输出可以表示为:
其中,表示输入在经过 K 层 transformer 之后的上下文表示。
重点来了。上面说将三个语言模型统一到了一起,那么是如何实现的呢?作者们这里使用的是 Self-attention Masks,即对不同的语言模型,设置不同的 mask 策略进行学习。
下面具体介绍各个模型的 Mask 策略。
对于单向LM(left-to-right or right-to-left),我们在做attention的时候对每一个词只能attend其一个方向的上下文。如对left-to-right LM, 我们就只能attend该词左边的信息,需要将右侧的词给mask掉;对于right-to-left LM也是同理。这样我们得到的Mask矩阵就是一个上三角或者下三角。
和BERT一样,双向LM在训练时可以看到左边和右边的信息,所以这里的Mask矩阵全是0,表示全局信息可以attend到该token上
对于seq2seq LM,情况稍微复杂一点点,有点像上述两个Mask矩阵的结合版本。该模型输入为两个segment S1和S2,表示为“[SOS] t1 t2 [EOS] t3 t4 t5 [EOS]”
,encoder是双向的即有四个token可以attend到t1
和t2
上;decoder是单向的,仅仅能attend到一个方向的token以及encoder的token,以t4
为例,它只能有6个token可以attend。
在训练时会随机mask掉两个segment中的token,然后让模型去预测被mask掉的词。
对于双向LM,作者也设置了NSP预训练任务,除了特殊TOKEN不一样,其他跟bert是一样的。
试验部分我也不多做分析了哈~
对于以上四篇论文做个小的个人评价:
大而美。模型和数据都很大,但是最终出来的效果是美的,争取往小而美的方向发展;
相比于BERT仅仅关注在encoder上,LASER的工作则是考虑了encoder-decoder的联合训练。从LASER模型框架上也可以看出其无法提取word级别的特征,擅长于跨语言任务;
对于XLM和MASS都是涉及跨语言模型,补充了BERT在NLG任务上的不足。模型层面而言XLM没有使用传统的encoder-decoder框架,属于比较讨巧的方式;
UNILM可以同时处理NLU和NLG任务,在GLUE上首次不加外部数据打赢了BERT。后续的改进可以考虑加入跨语言任务的预训练,比如XLM和MASS做的工作。
最后,如若文章理解或措辞有误,还请大家务必海涵指正!
点击'阅读原文'直达原文链接,欢迎投稿,AI、NLP均可。