自然语言生成工具箱 - BART
文章名称
【Arxiv-2019】【Facebook AI】BART: Denoising Sequence-to-Sequence Pre-training for Natural
Language Generation, Translation, and Comprehension
核心要点
文章旨在利用denoising autoencoder预训练语言模型,提升包括文本生成等NLP任务的性能。作者采用类似传统NMT的transformer-based seq2seq架构,其采用对原始文本加入人为噪声,并学习重建原始文本的任务来学习autoencoder。作者尝试了多种噪声构造方法,并发现利用随机调换原始句子顺序和原创的填充方法能够最大限度的提升模型性能。
方法细节
问题引入
原有自监督预训练的语言模型,极大地提升了下游任务的性能。然而,许多预训练模型是针对特定任务的,不能很好的迁移到其他任务。例如,传统的基于MLM的BERT,encoder和decoder都基于MLM,所以适合需要总和双向信息的生成式任务。但是,GPT类的auto-regressively decoder产出的结果能够更连贯。作者提出了一种denoising autoencoder的方法,其整体框架如下图所示,结合Bidirectional Encoder和Autoregressive Decoder,期望提升预训练模型的泛化能力。
BART framework具体做法
如上所述,BART的模型架构是seq2seq,结合Bidirectional Encoder和Autoregressive Decoder。此外,与BERT不同,
- 在decoder层,加入了类似NMT的交叉注意力,来分配注意力权重到encoder的最后一层隐层上。
- 去掉了最后预测结果词的FFN
BART利用认为加入noise的文档进行训练方法,优化重构损失,即decoder的输出和原始文档之间的交叉熵。知道注意的是,BART的训练可以采用任何noise类型来破坏原始文档(比如随机删除等),而不是只能使用符合下游任务的特定噪声方法。在极端情况下,输入全部是空,那么BART就是一个语言模型。具体的noise方案可以分为两大类,词层面和句层面,包括(任务示例如下图所示),
pre-train tasks
- 词层面
- 类似BERT,随机把某一个词替换成Mask(MLM)
- 随机删除某一个词,期望模型能够发现并判断某个地方少了某一个词
- 类似SpanBERT,选取原文档中的一个span进行替换。不同的是,BART采用泊松分布(SpanBERT是clamped geometric分布),并且把整个span替换为一个单独的[Mask],而不是每个词替换为一个[Mask]。这样做的目的是为了让模型学会判别丢失的span里应该有多少个词(有点类似完形填空,一条横线,你随便填T.T)。
- 句层面
- 随机调整文档中句子的顺序,期望模型能有句子的感知能力。
- 文本旋转,随机选择一个词,以这个词为开头,循环旋转文档(刷过算法题的同学,想起了二分的一套题目没有..)
预训练完成后,可以利用如下任务(实际任务)Fine-tuning BART(具体示例如下图所示),
fine-tuning task
- 序列分类任务,注意,encoder和decoder输入了相同的句子(同个句子重复2遍)如图3a所示,与BERT差别在不是从[CLS]提取向量,而是从decoder的最后一个(毕竟decoder是Autoregressive Decoder。
- 序列标注任务,没啥好说的,就是从decoder上给每一个词分类。
- 序列生成任务,Autoregressive Decoder天然适合序列生成,并且连贯性较好,仍然是利用MLE训练。
- 翻译任务,[1]表示预训练语言模型的encoder可以提升翻译任务的性能,但是decoder一般不能(如果我没理解错,主要是词表不统一的问题,不是针对翻译进行预训练的语言模型,encoder和decoder的词表是对称的,而翻译模型不是)。作者表示,如果给BART的encoder加一个额外的encoder,从bitext中学习embedding就可以利用BART的整个结构提升翻译性能。具体的,作者用一个新的随机初始化的encoder替换了BART中encoder的embedding层。然后端到端训练的模型,新加入的编码器可以将外来词映射到BART的词表空间中,也就是说新编码器充当了不同词汇表的转换器(具体操作参见图3b)。值得注意的是,训练是两阶段的,第一阶段固定BART,只训练新加入的encoder,第二阶段,fine-tuning所有参数。
心得体会
UNiLM
个人感觉,BART和UniLM在很多角度是类似的,两者处于同一时期,都尝试了对BERT,GPT的改造,打破固有模式,玩转双向和单项Encoder。
训练任务
个人感觉,现在的预训练语言模型中常用的任务,越来越像我学习语言学时候用的卷子了...各种填空排序,其实这是必然的,本来都是语言学,模型若是人,也要走一遭。人脑即模型,都是这么学。
所以,如果我们在之前学习语言的时候有好的训练自己的方法,没准也可以用来训练模型...只要和下游任务能搭配上,或者可以泛化。
文章引用
[1] Sergey Edunov, Alexei Baevski, and Michael Auli. Pre-trained language model representations for lan- guage generation. In Proceedings of the 2019 Con- ference of the North American Chapter of the Asso- ciation for Computational Linguistics: Human Lan- guage Technologies, Volume 1 (Long and Short Pa- pers), 2019.