Bert不完全手册2. Bert不能做NLG?MASS/UNILM/BART
Bert通过双向LM处理语言理解问题,GPT则通过单向LM解决生成问题,那如果既想拥有BERT的双向理解能力,又想做生成嘞?成年人才不要做选择!这类需求,主要包括seq2seq中生成对输入有强依赖的场景,例如翻译,生成式问答,文本摘要等等
最初Transformer的Encoder+Deocder结构是在机器翻译领域,Encoder的部分通过双向LM来抽取输入的全部上下文信息,Decoder通过单向LM在Encoder抽取信息的基础上完成生成任务。但后续的预训练模型,Bert和GPT各自选取了Transformer的一部分来实现各自的目标。Bert只用了Encoder,核心是基于AutoEncoding reconstruction loss的双向LM,适用于NLU任务。GPT只用了Decoder,核心是基于AutoRegression perplexity loss的单向语言模型,适用于NLG任务。那想要兼顾双向理解和生成能力,就要探索如何能让AE和AR在训练过程进行梦幻联动,以下分别介绍3种不同的方案
UNILM 1.0
UNILM完美诠释了MASK在手,要啥都有的极简设计原理。通过三种不同的attention MASK,使用Multitask的训练方式在相同的Transformer backbone里面实现了三种任务的融合,分别是双向LM(BERT),单向LM(GPT),seq2seqLM(transformer)。管你是Encoder还是Decoder本质只是Attention计算中可见信息的差异,那调整MASK就完事了~
预训练任务
UNILM的预训练任务,都是基于AE的reconstruction任务,和Bert相同的是,都是随机MASK15%的token,其中80%会被MASK替换,10%保留原始token,10%随机token。不同的是UNILM在80%的情况下会MASK1个token,剩余情况下会随机遮盖bigran或者trigram。
那同样是AE,UNILM是如何做到学到AR相关的信息的呢?这和UNILM的训练方式有关,它采用了Multitask的训练方式,在一个batch的样本中,采用三种不同的attention mask,让相同的模型参数分别学习单向,双向,seq2seq的语言信息,包括
- \(\frac{1}{3}\)的时间训练双向LM: 和BERT相同使用self-attention MASK,并且在以上的MLM任务上,同时也加入了NSP任务
- \(\frac{1}{3}\)训练seq2seq LM:segment1使用self-attention MASK, segment2使用Future MASK,同样是对MASK进行还原
- \(\frac{1}{6}\)的时间训练从左->右单向LM,\(\frac{1}{6}\)的时间训练从右->左单向LM:只不过这里没有使用对整个sequence进行还原的perplexity loss,而同样是对MASK进行还原,只不过只使用单向信息
这里感觉虽然UNLIM实现了单向的信息传递,但和AR之间还是有本质差异的,因为并不是对连续token进行递归预测,而依旧条件独立的对MASK token进行还原,虽然引入了bigram和trigram的MASK,但是效果有限,感觉这里限制了生成的效果。所以有没有可能在共享参数的前提下,直接引入perplexity loss进行训练呢?️️️
针对以上三种任务的输入略有差异,其中单向LM只有1个segment ”[SOS] s1 [EOS]“,双向LM和seq2seq LM都是2个segment “[SOS] s1 [EOS] s2 [EOS]”
这里会发现以上EOS token,除了和BERT相同起到分割两个segment的作用,在单向LM任务中还会起到停止符的作用,所以其实在不同LM任务中EOS的作用不同,所以这里作者在不同的LM任务中采用了不同的segment Embedding。
预训练阶段,UNILM的参数使用了Bert Large进行初始化,在以上的三个任务重参数是共享的
下游任务Finetune
在下游fientune中,针对NLU任务,迁移方式和Bert相同,例如对分类任务,UNILM会输出[SOS]token对应的Embedding,后接softmax。针对NLG任务,会随机MASK第二个segment中的token进行还原。
整体效果GLUE Benchmark比Bert略好一丢丢,在生成式问答和摘要上提升更大。哈哈具体数值就不贴了,因为马上就要被下面会提到的BART超越,可以直接在下面BART的对比结果中看UNILM的效果了。。。
MASS
MASS则完美诠释了世界是个圈,Bert和GPT费劲吧啦把Encoder和Decoder拆开,MASS又给拼了回来。所以MASS的模型结构就是经典的Encoder+Decoder的Transformer。MASS通过改良MASK机制和训练目标增强了Encoder和Decoder在预训练阶段的交互
预训练任务
MASS创新了预训练目标,结合了生成和掩码。在Encoder侧随机选取连续K个token,这里k是MASS的超参数,Decoder侧采用互补MASK,遮盖所有在Encoder侧未遮盖的token,使用Auto Regression递归预测这k个token。这种互补掩码的方式,有效增强了Decoder对Encoder的信息依赖,避免Decoder直接依赖上文信息进行预测,进而也推动了Encoder部分去学习上下文双向信息。
都是对连续token进行MASK,和SpanBert不同的是MASS采用的是固定长度,作者测试了k的不同取值对模型效果的影响。整体上K的取值是总长度的50%左右的时候效果最好。哈哈其实感觉如果用一个均值=50%的分布来采样,可能也有效果提升???
有意思的点在于,这里k的取值其实反映了MASS对Bert和GPT的融合权重,当K=1的时候,MASS其实等同于每次只MASK1个token的BERT模型,这时Decoder全部被MASK没有任何信息,而Encoder包含除MASK的一个token之外其余上下文信息。当K=seq_len的时候,MASS其实等同于GPT,这时Encoder没有任何信息,而Decoder部分就是传统的AR。在开头看到MASS的掩码还觉得有些摸不着头脑,看到这里感觉如果从loss function融合的角度来看,MASS的预训练目标其实可以类比Loss融合,和Huber Loss融合RMSE和MAE,以及Generalized Cross Entropy融合Cross Entropy和MAE,有着同一个世界同一个味道~~~
预训练和迁移细节这里就不多说了,因为MASS本身是为NMT翻译任务设计的,所以不管是评估还是训练都是for翻译任务的,和其他两个模型无法直接比较。不过AR和AE的融合思路设计的很巧妙,而且也不局限于NMT任务
BART
BART的模型结构和MASS相同也是Encoder+Decoder的配置,但是和MASS探索的方向不同,BART主要针对reconstruction任务中对输入信息扰动方式的探索,BERT使用的MASK本身也是一种扰动方式。
预训练任务
BART的预训练目标是reconstruction loss,通过对输入进行扰动,Encoder的输入是corrupted Sentence,然后Decoder的部分负责还原真实文本,这里只对Decoder的预测计算reconstruction loss。于是当Encoder侧的扰动是删除全部token时,BART->GPT
BART训练策略的设计和MASS相比,对Encoder和Decoder的信息交互要求并不严格,如果Deocder依赖单向信息就能很好完成任务的话,感觉Encoder部分信息会不会变得不太重要???
扰动方式作者尝试了以下方案
- Token Masking: 和Bert一样对token进行随机Mask,模型需要判断根据上下文还原MASK部分的语义信息
- Token Deletion:随机删除部分token,和MASK的区别在于模型需要去判断哪些位置丢失了信息
- Token Infilling:随机采样0~n个token,用一个MASK进行替换,模型除了学习MASKing部分缺失的语义,还要学习缺失token的数量,其实一定程度上是MASKing和Deletion的组合
- Token Rotation:对句子顺序进行rotate
- Token Shuffling :对句子顺序进行随机shuffle
整体评估如下,rotation和shuffling的表现最差,这个也在预料之中如果对所有语料都完全改变顺序,模型其实就不知道正常文本顺序是什么样子的了。而Deletion比Masking在生成任务上的表现更好,一定程度上是Deletion推进模型更多focus在位置信息上,综合各个任务单一扰动机制,Infilling的效果最优。最终作者选择了Infilling+Shuffling相结合的扰动机制,Infilling会MASK30%的token,并同时对整个句子进行随机打乱。
作者还对比了不同的预训练目标的影响,注意这里和原始的模型存在出入,作者只是使用了训练目标的部分,得到以下几点结论
- 不同训练目标在不同任务下差异较大,多数任务上BART表现略好
- 在生成任务上,尤其是输入和输出关联性较低的ELI5,单向语言模型一骑绝尘
- 对阅读理解,推理任务,MASK策略对应的双向语言模型表现显著更好
训练细节参考了Roberta,更大的Batch Size训练更多steps,不过因为BART本身是Encoder+Decoder所以参数量级基本上翻了一倍
下游任务迁移
BART同样可以灵活迁移到下游包括分类,序列标注,文本生成等诸多任务,微调方式各有不同。
- 分类任务:Encoder输入,Decoder递归,用BART在Decoder的末尾加入了[END]token的Embedding作为文本表征
- 序列标注任务:Encoder输入,Decoder每个位置的输出作为序列标注任务的输入
- 生成任务:Encoder输入,直接使用Decoder部分进行递归生成
- 翻译任务:翻译任务略有差异,是把BART的Embedding输入替换成一个随机初始化的Encoder,这个Encoder使得翻译任务可以使用和原始BART模型Vocab不同的输入。当然random init的部分需要先进行独立训练,再和BART一同已经微调。不过感觉这部分的调整其实和BART没啥非常紧密的联系~
整体效果,在生成任务包括摘要生成和生成式问答上BART的效果都要显著超过之前的模型。
再来关注下阅读理解任务,整体上BART和Roberta效果不相上下,所以BART在生成能力上的提高并没有以牺牲双向理解能力为代价
效果上BART自然是力压群雄,但是Encoder+Decoder的设计不管是训练还是推理都比较沉重,相比之下UNILM共享参数的设计感觉更加巧妙,所以如果能进一步在UNILM上提升效果,感觉就完美了~~
Ref
- MASS: Masked Sequence to Sequence Pre-training for Language Generation, 2019
- UNLIM, Unified Language Model Pre-training for Natural Language Understanding and Generation, 2019
- BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension, 2019
- 苏剑林. (Sep. 18, 2019). 《从语言模型到Seq2Seq:Transformer如戏,全靠Mask 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/6933
- https://www.jiqizhixin.com/articles/2020-09-24
Bert不完全手册2. Bert不能做NLG?MASS/UNILM/BART的更多相关文章
- Bert不完全手册6. Bert在中文领域的尝试 Bert-WWM & MacBert & ChineseBert
一章我们来聊聊在中文领域都有哪些预训练模型的改良方案.Bert-WWM,MacBert,ChineseBert主要从3个方向在预训练中补充中文文本的信息:词粒度信息,中文笔画信息,拼音信息.与其说是推 ...
- Bert不完全手册3. Bert训练策略优化!RoBERTa & SpanBERT
之前看过一条评论说Bert提出了很好的双向语言模型的预训练以及下游迁移的框架,但是它提出的各种训练方式槽点较多,或多或少都有优化的空间.这一章就训练方案的改良,我们来聊聊RoBERTa和SpanBER ...
- 原来你是这样的BERT,i了i了! —— 超详细BERT介绍(一)BERT主模型的结构及其组件
原来你是这样的BERT,i了i了! -- 超详细BERT介绍(一)BERT主模型的结构及其组件 BERT(Bidirectional Encoder Representations from Tran ...
- Bert不完全手册1. 推理太慢?模型蒸馏
模型蒸馏的目标主要用于模型的线上部署,解决Bert太大,推理太慢的问题.因此用一个小模型去逼近大模型的效果,实现的方式一般是Teacher-Stuent框架,先用大模型(Teacher)去对样本进行拟 ...
- Bert不完全手册5. 推理提速?训练提速!内存压缩!Albert
Albert是A Lite Bert的缩写,确实Albert通过词向量矩阵分解,以及transformer block的参数共享,大大降低了Bert的参数量级.在我读Albert论文之前,因为Albe ...
- Bert不完全手册7. 为Bert注入知识的力量 Baidu-ERNIE & THU-ERNIE & KBert
借着ACL2022一篇知识增强Tutorial的东风,我们来聊聊如何在预训练模型中融入知识.Tutorial分别针对NLU和NLG方向对一些经典方案进行了分类汇总,感兴趣的可以去细看下.这一章我们只针 ...
- Bert不完全手册8. 预训练不要停!Continue Pretraining
paper: Don't stop Pretraining: Adapt Language Models to Domains and Tasks GitHub: https://github.com ...
- Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
这一章我们来唠唠如何优化BERT对文本长度的限制.BERT使用的Transformer结构核心在于注意力机制强大的交互和记忆能力.不过Attention本身O(n^2)的计算和内存复杂度,也限制了Tr ...
- bert系列二:《BERT》论文解读
论文<BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding> 以下陆续介绍ber ...
随机推荐
- Protocol基本概念
1.protocol 基本概念 Protocol翻译过来, 叫做"协议" 在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Int ...
- WebGPU 中的缓冲映射机制
1. 什么是缓冲映射 就不给定义了,直接简单的说,映射(Mapping)后的某块显存,就能被 CPU 访问. 三大图形 API(D3D12.Vulkan.Metal)的 Buffer(指显存)映射后, ...
- python篇第8天【运算符】
第7天休息 什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 4 +5 = 9 . 例子中,4 和 5 被称为操作数,"+" 称为运算符. Python语言支持以 ...
- 1day漏洞反推技巧实战(3)
代码审计必备技能,github代码对比,写一笔: 搜索某开源组建漏洞,搜索出来某个版本rce: 通过消息得出:存在漏洞版本:1.10.10 ,修复漏洞版本1.10.11 去github寻找apache ...
- SQLServer误删ReportServerTempDB导致打不开其他库——解决方案
无意间删除了ReportServerTempDB库和ReportServer 导致其他库连接不上 错误:报表服务器无法打开与报表服务器数据库的连接.所有请求和处理都要求与数据库建立连接. 解决方案: ...
- 基于单XCVU9P+双DSP C6678的双FMC接口 100G光纤传输加速计算卡
一.板卡概述 板卡包括一片Xilinx FPGA XCVU9P,两片 TI 多核DSP TMS320C6678及其控制管理芯片CFPGA.设计芯片满足工业级要求. FPGA VU9P 需要外接4路Q ...
- 使用PostMan Canary测试受Identity Server 4保护的Web Api
在<Asp.Net Core: Swagger 与 Identity Server 4>一文中介绍了如何生成受保护的Web Api的Swagger文档,本文介绍使用PostMan Cana ...
- FastDFS安装和简介详细总结
1.fastDFS简介 1 FastDFS是用c语言编写的一款开源的分布式文件系统. 2 FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标, 3 ...
- for循环-嵌套
代码 点击查看[ForNest.java]代码 //package com.d; /** * for循环-嵌套 * @date: 2022.2.24 * 正直角三角形.倒直角三角形.等腰三角形.九九乘 ...
- 企业BI应用解决方案主要包括哪些方面?
BI的地位 在实际的BI应用过程中,很多企业对数据分析的概念仅为雏形,且业务人员往往难以了解自身数据分析的需求.这就造成很多BI需求调研在和业务人员沟通的环节,业务人员难以明确需求,这使得BI沦为一个 ...