当前位置:   article > 正文

NLP预训练家族 | Text-To-Text范式统一NLP任务

text to text

作者 | 周俊贤  

整理 | NewBeeNLP

前情提要:

T5这篇论文很久之前就看过的,但一直没写,原因是民间没有公开一些可用的中文T5模型,不知道效果如何。不过总的来说,T5论文的这篇脉络还是值得好好梳理一下的,这篇论文就带大家理一理T5。

小公司或个人想复现T5基本没可能(实验需求的资源太庞大),但论文里做的实验(炼丹的方向)也可以给咱们算法工程师提供一些ideas,类似于"我们谷歌已经在这方面做过实验了,你们取最好的策略或者沿着我们建议的方向研究就好"。

  • 论文全称:《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer[1]

  • 项目链接:https://github.com/google-research/text-to-text-transfer-transformer

T5是什么?

T5全称是「Text-to-Text Transfer Transformer」,是一种模型架构或者说是一种解决NLP任务的一种范式。

如下图,就是把所有任务,如分类、相似度计算、文本生成都用一个Text-to-text(文本到文本)的框架里进行解决。

举个例子,现在要做一个英文转德文的机器翻译任务,输入"translate English to German: That is good.",目标输出是"Das ist gut.",再举个例子,现在做一个文本三分类任务,label为【entailment、contradiction、neutral】,输入""mnli premise: I hate pigeons. hypothesis: My feelings towards pigeons are filled with animosity.",目标输出是"entailment",注意哦,「都是用"生成"的方式得到输出类(可以理解成sequence to sequence)」

这样的好处是可以把所有的问题都套进去一个统一的范式,从而可以采用同样的模型架构、同样的训练策略、同样的损失函数、同样的解码手段。

C4是什么?

C4全称Colossal Clean Crawled Corpus,跟GPT2、GPT3的训练数据来源一样,是从网上爬的文本数据,由于是爬的数据,所以数据量足够大,而且类型丰富,缺点是数据质量差,需要过滤,过滤手段包括

  • 保留以终点符号(如句话、感叹号、问号等)结尾的行;

  • 过滤掉内容过少的网页和字数太少的行;

  • 过滤掉出现"脏字"的网站;

  • 过滤掉带Javascript的行;

  • 任何包含"lorem ipsum(用于排版测试)"的页面;

  • 包含编程语言中常用大括号的页面;

  • 删除一些重复出现的数据。

此外,过滤非英文的网页,做法是用langdetect这个工具判断这个网页究竟是否是英文网页。

最后,一番操作后得到一个750G的数据集。

对比Baseline

实验篇章一开始提出baseline,可能有些读者会蒙蔽,其实baseline里的相关策略是基于后面所作的实验,综合取最好的方案就形成baseline,所以搞不懂baseline为什么要这样做的读者,把后面完全的实验部分看完就能理解。

模型

encoder-decoder架构,编码层和解码层都是12层,一共有220M个参数,大概是 的两倍;

训练
  • 训练时,采用teacher forcing和cross-entropy作为损失函数,预测时,采用gready decoding;

  • 预训练:在C4训练集上训练 个step,最大长度为512,batch size为128,则训练一共能见到约 个token,少于BERT和RoBERTa。这个训练轮数没有覆盖到所有C4数据集,也即没有一个样本会重复训练。

  • 学习率策略:采用平方根倒数

  • fine-tuning :对每个下游任务训练 个step,输入最大长度为512,batch size为128,学习率为0.001,每5000个step计算验证集的分数,最后展示验证集上的最佳分数。

  • 词表:采用WordPiece,大概有32000个token。由于部分下游任务有德文、法文和罗马尼亚文,所以把这些非英语的词也加进了词表。

  • 预训练目标:借鉴BERT的"denoising object"和"word dropout"正则化技术的思想。如下图,输入部分:对输入随机挑选15%token,如这里的for、inviting、last,每一个被挑选token的连续片段**用哨兵token进行代替,如这里的for inviting是连续的,则只用一个代替,last左右只有它一个被挑选,用代替。目标输出:由这些哨兵token以及上一步被挑选的token加上一个代表结尾的token组成。


表现


T5

模型结构:

看下图Figure 3,最左边的是fully-visible mask,编码每个token的时候能看到上下文的所有信息,中间的是causal mask,编码token的时候只能看到上文的信息,右边的是两者的相结合,prefix部分的token能看到prefix所有token的信息,非prefix的token只能看到它的上文信息,什么叫prefix呢?如上面提到的英文翻译德文的例子,prefix就是"translate English to German: That is good.";

再对应下图Figure 4,最左边encoder-decoder结构,即上面提到的baseline,encoder部分是full-visible mask,decoder是causal mask;中间是语言模型,用的是causal mask;最右边是Prefix语言模型,采用上图最右边的causal with prefix mask。

比较不同的模型结构:为了公平,只有「两个模型有同样数量的参数或者同样的计算效率才能进行比较」,所以这里提出5个model

  • 模型1:编码层和解码层各有L层,这个模型的参数量是2P,计算量是M;

  • 模型2:编码层和解码层各有L层,但它们参数共享,即模型的参数量是P,计算量是M;

  • 模型3:编码曾和解码层各有L/2层,即模型的参数量是P,计算量是M/2;

  • 模型4:只有L层解码层,采用语言模型的形式,模型的参数量是P,计算量是M;

  • 模型5:只有L层解码层,但采用Prefix语言模型的形式,同模型4一样,参数量是P,计算量是M。

预训练目标
  • 第一种是上文baseline提到的"denoising objective" + "word dropout";

  • 第二种是语言模型的"autoregressive object"。

实验结果

简单点说,就是encoder-decoder的结构比decoder的要好,而且编码层和解码层共享参数,能减少接近一半的参数量,且模型效果损失不明显,是较优的模型架构方案。另外,预训练目标用denoising比LM要好,关于预训练目标下面会再深入讨论。

Unsupervised Objectives

三种主要的预训练目标思想
  • prefix language modeling:把样本切分成两部分,第一部分作为encoder的输入,这部分是full-visible mask的,第二部分作为decoder的目标输出,这部分是causal mask的;

  • masked language modeling(BERT-style):挑选15%的token,其中的90%用【MASK】代替,10%用随机token替换,预测这15%的token。「由于BERT用的是encoder的结构,要套到我们的text-to-text范式需要进行一些修改」,如图的样例,输入同原生BERT一样的输入,不过目标预测变成原序列,而不是15%的token,而且是用生成的方式做预测;

  • deshuffling objective:把token打乱,目标预测为原序列。

从实验结果看到,BERT-style的预训练目标效果是最好的。

简化BERT-style预训练目标

上面说到预训练目标取BERT-style效果最好,继续思考能否通过修改BERT-style,使其效果进一步提升或提高计算效率?作者做了三种尝试,对应上图Tabel 3的Objective列的第4行~第6行:

  • MASS-style:取15%的token进行【MASK】,目标预测为原序列;

  • I.i.d. noise,replace (corrupted) spans:即开头提到的baseline预训练目标,把被挑选的15%token的连续片段用哨兵token代替作为输入,目标预测这15%token;

  • I.i.d. noise,drop (corrupted) tokens:连哨兵token都不需要,直接把15%的token在输入时去掉,预测时把它们预测出来。

实验表明,这三种变体跟BERT-style效果差不多,但是后面两种方法有个很大的吸引力在于「不用把原始句子预测出来,只用预测被挑选的15%token,训练速度更快」,而Replace corrupted spans比Drop corrupted tokens效果稍微好一点,所以接下来实验,作者都采用replace corrupted spans作为预训练目标。


不同的corruption率

corruption率就是挑选多少的token进行预测,原生BERT和上面的实验采用的是15%,论文里做了简单的实验,实验结果表明15%是兼顾效果和计算效率的最佳选项。

corruption片段长度

由于我们采用的Replace corrupted spans,连续的corrupted tokens span会被一个哨兵token代替,假设设置span的长度越大,这样输入就会越短,计算效率会有所提高。实验表明span length取为3是不错的选择。

预训练目标的总结

Pre-training Dataset

不同数据集的影响:
  • C4:一开始提到的数据集,也是baseline预训练用的数据集;

  • Unfiltered C4:C4过滤前的数据集;

  • RealNews-like:从C4数据集中过滤出新闻相关的数据;

  • WebText-like:从C4数据集中筛选"高质量"的文本。怎么衡量高质量?根据的是这个网站被网民点赞或者点踩的分数。

  • Wikipedia:脱离C4数据集,采用维基百科的数据;

  • Wikipedia+Toronto Books Corpus:维基百科+书籍文本数据。

实验结果表明,用更专的数据来做预训练,对下游任务的提升越明显,或者换句更准确的话来说,「预训练的语料跟任务语料domain越接近,效果越好」。但一开始就限定语料的坏处在于,它不能适应多领域的任务。所以个人认为最佳的策略是「在丰富的数据上进行预训练,然后再在领域相关、任务相关的语料上继续预训练,最后再fine-tuning」


预训练语料大小

开头提到,由于C4数据集很大,baseline预训练完,也不能覆盖所有数据,也即每个样本,模型只见过一次,所以这里讨论缩小数据规模,让样本能被重复训练,效果会怎么样。

实验表明,数据量太少,很容易让模型过拟合(特别是模型很大,数据很少的时候),进而影响下游任务的性能。推荐的做法是「数据越多越好,即使预训练不能覆盖完」


Training Strategy

fine-tuning方法
  • 引入"adapted layers":adapted layers接在编码器和解码器的每一个block的全连接层后面,在fine-tuning的时候只更新它们。adapted layers有一个内部维度d作为超参;

  • gradual unfreezing:一开始离任务层近的参数先更新,其它保持不动,随着训练的进行,逐渐放开其它层的参数。

实验表明,所有参数一起更新效果是最好的,但是缺点就是慢。adapter layers效果也还可以,假如任务数据量小的话,d取小一些,任务数据量大的话,d取大一些。

多任务学习

加入更多的任务是否能提高模型的性能?得益于提出的text-to-text范式,我们可以在预训练的时候把有监督的训练也加进来,一起做预训练,而无需采用不同的损失函数。但现在有个问题是,假如现在有无监督任务、有监督任务1、有监督任务2、有监督任务3,一共4个任务,一起做训练的时候,怎么采样数据?作者做了三个实验

  • Examples-proportional mixing:设任务的数据集大小为 ,采样时,采样自第m个任务数据的概率为 ,这里K是提前设定的参数;

  • Temperature-scaled mixing:在上面examples-proportional mixing的基础上,再做一些软化,具体的,对上面求得的 再求 方根,当T=1,即Examples-proportional mixing,T越大,各个任务数据集采样越均衡;

  • Equal mixing:各个任务数据采样概率相同。

实验结果都一般,「不过注意,这里的多任务学习是多个任务一起做训练,相当于把pre-training和fine-tuning两个合并了,而不会对单个任务进行fine-tuning」,所以效果不好也可以理解。

多任务学习和fine-tuning结合

就是对上面实验的补充,先用多个任务进行预训练,再对具体任务进行微调。做了以下三个实验:

  • 实验一:用多个任务进行预训练,再对具体任务进行fine tuning,其中fine tuning的任务也是预训练任务的其中之一;

  • 实验二:与第一种方法类似,只不过fine tuning的任务不在预训练中,作者把这个称为"leave-one-out"多任务学习,这种更贴合实际场景;

  • 实验三:同实验一类似,只不过在预训练时,把无监督目标(即baseline的预训练目标)剔除。

实验结果前四者都差别不大。


Scaling

直觉来说,增大规模,模型效果会变好。何谓增大规模?包括使用「更大的模型,更多的训练轮数,模型集成」

这里作者提出一个假设,「假如现在有4倍的计算资源,你怎么用?」

首先,在baseline模型的基础上扩大参数规模,其中 模型参数量是baseline的2倍,计算量也变成2倍,另外一个 模型参数量是baseline的4倍,计算量也变成4倍。

  • 实验一:baseline模型,训练step为原来的4倍;

  • 实验二:baseline模型,batch size增大为原来的4倍,这样的话同实验一看到的数据量一样,但更利于并行;

  • 实验三: 模型,step为原来的2倍;

  • 实验四: 模型;

  • 实验五:4个baseline模型做融合;

  • 实验六:4个baseline模型做融合,这四个模型源自同一个预训练模型,只不过fine-tuning的时候采用不同的随机数,得到4个不同的模型。

实验结果表明,扩大规模都能提高模型性能,在现实应用中,个人经验还是要「权衡资源和最终的效果来决定采用何种策略」。就像在打比赛中,我们都会采用模型融合,但在实际业务上,为了兼顾资源利用率和时效性,单模的情况比较多。


Putting It All Together

把前面的最佳方案组合在一起,训练了小、中、大、超大、超超大的系列T5模型,效果自然是very good的了。

Takeaways

指论文已经提出的一些思考,我们吸收利用即可。

  • Text-to-text:把所有NLP任务都转换成text-to-text范式,实验证明,跟传统的task-specific结构效果相差不大;

  • Architectures:原生Transformer的encoder-decoder结构最好,虽然跟原生BERT只采用encoder相比,参数翻倍,但可以令编码层和解码层共享参数使参数减半,但计算变慢是无可避免的?

  • Unsupervised objectives Overall:"denoising"预训练目标(即BERT-style)是最好的,还做了让连续的corrupted token span用一个哨兵token代替的策略,预测目标从预测原序列变成预测这些corrupted token,目的是让输入序列变短、预测目标序列变短,提高计算效率;

  • Data sets: 虽然用任务领域相关的数据进行预训练效果最好,但会使得预训练模型的适用范围有限,此外,数据量不够大,会使得预训练模型过拟合,损害下游任务性能,所以还是推荐使用大的、丰富的数据集;

  • Training strategies:fine-tuning时所有参数一起更新是最好的,但计算代价大;此外,text-to-text范式使得多任务预训练很简单,但怎么进行数据采样是个待解决的问题,多任务预训练再fine tuning能有效缓解这个问题,此外,性能和传统的unsupervised pre-training接fine tuning效果差不多。

  • Scaling:使用更多的数据、训练更大的模型、模型融合都能提高性能;

  • Pushing the limits:提出在各个任务上取得SOTA的T5系列模型。

output

  • 更轻量的模型:有模型蒸馏、参数共享、条件计算等优化方向;

  • 更强的预训练目标:虽然论文了提出了效果不俗的预训练目标,但寻找更优的预训练目标是要不断投入的工作;

  • 分析任务之间的相似性:预训练里包含有与任务越相近的任务,预训练的效果越好,关键在于我们怎么衡量任务之间的相似程度;

  • 多语言的模型:这里发布的T5只是英语模型。

最后附上论文的所有实验截图~

一起交流

想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定要备注信息才能通过)

本文参考资料

[1]

《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》: https://www.jmlr.org/papers/volume21/20-074/20-074.pdf

END -



NLP任务增强:通过引入外部知识来提供额外信息

2021-07-07

茫茫社招路,硕士毕业半年的抉择

2021-06-29

2021最新 武汉互联网公司

2021-06-27

万物皆可Graph | 当推荐系统遇上图神经网络(二)

2021-06-28

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/541505
推荐阅读
相关标签
  

闽ICP备14008679号