近年来,在大规模预训练语言模型上,各大公司的军备竞赛卷得十分激烈!前面我们介绍过GPT系列的三兄弟GPT-1,GPT-2,GPT3
,本文我们介绍Google推出的大一统模型——T5
,同样是数据和实验多得让你瞠目结舌的论文,没错,就是在炫富,你有钱你也可以烧啊!(不过相比后来出现的GPT-3还是小巫见大巫)
T5论文:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
目前NLP领域的主流模式是先在大量无标签的数据上预训练一个语言模型,然后再在下游具体任务上进行有监督的fine-tune,以此取得还不错的效果。在这个模式下,各大公司争奇斗艳,各个机构奋起直追,今天A提出了一种预训练目标函数,明天B提出了另一种预训练目标函数,并且收集了更多的训练语料,后天C提出了参数更庞大的模型,采用了不同的优化策略......各家都声称自己是state-of-the-art
,很难分析比较这些工作的有效贡献量。
因此,T5希望提出一个统一的模型框架,将各种NLP任务都视为Text-to-Text
任务,也就是输入为Text
,输出也为Text
的任务。由此可以方便地评估在阅读理解、摘要生成、文本分类等一系列NLP任务上,不同的模型结构,预训练目标函数,无标签数据集等的影响。
如图所示,T5(Text-to-Text Transfer Transformer)模型将翻译、分类、回归、摘要生成等任务都统一转成
Text-to-Text
任务,从而使得这些任务在训练(pre-train和fine-tune)时能够使用相同的目标函数,在测试时也能使用相同的解码过程。注意这里回归任务对应的浮点数会被转成字符串看待,从而可以token by token的预测出来。虽然感觉奇怪,but anyway, it works。
T5模型结构
T5模型采用Transformer的encoder-decoder结构,之前介绍过GPT采用的是Transformer的decoder结构。
T5模型和原始的Transformer结构基本一致,除了做了如下几点改动:
- remove the Layer Norm bias
- place the Layer Normalization outside the residual path
- use a different position embedding
数据集C4
作者对公开爬取的网页数据集Common Crawl进行了过滤,去掉一些重复的、低质量的,看着像代码的文本等,并且最后只保留英文文本,得到数据集C4: the Colossal Clean Crawled Corpus
。
输入输出格式
我们来看如何将各种下游NLP任务都统一转化成Text-to-Text
格式。
在下游任务上fine-tune模型时,为了告诉模型当前要做何种任务,我们会给每条输入样本加一个与具体任务相关的前缀。
- 翻译前缀
translate English to German:
- 分类前缀
cola sentence:
- 摘要前缀
summarize:
等等。注意这里每个任务前缀的选择可以认为是一种超参,即人为设计前缀样式。作者发现不同的前缀对模型的影响有限,因此没有做大量实验比较选择不同前缀的结果。
实验
作者首先设置了一个baseline模型,然后每次修改模型设置一个方面,采用控制变量法进行对比实验。
Baseline
网络结构
不同于BERT或GPT仅使用Transformer结构的一部分,T5的baseline模型直接采用标准的Transformer encoder-decoder结构,以便在生成任务和分类任务上都能取得不错的效果。
具体来说,baseline模型结构的encoder部分和BERT-base模型(12层)的大小一样,而decoder部分和encoder大小相似,因此baseline模型的参数量基本是BERT-base模型的2倍。
预训练目标
采用denoising objective
,也就是类似BERT的masked language modeling
目标函数。
如图所示,在输入样本中,用一些唯一的特殊符号<X>, <Y>
来表示原始样本中被随机masked的span或token,而目标样本则为被masked的span或token序列,用输入样本中对应位置的特殊符号<X>, <Y>
分隔,最后加上一个特殊符号<Z>
表示序列结束。
在下游任务上fine-tune
在每个下游任务上单独fine-tune后的评估结果如下:
可以发现pre-train的模型参数确实对下游任务的性能提升大有帮助。
接下来我们就要基于Baseline模型,对模型的某一部分进行修改,进行大量对比实验了。
对比模型结构
如图所示为Transformer结构的几种变种,主要区别在于模型中self-attention机制的可见范围。
-
fully-visible
attention mask:输出序列的每个元素可以看见输入序列的每个元素。 -
causal
attention mask:输出序列的每个元素只能看对应位置及之前的输入序列的元素,无法看见未来的元素。 -
causal with prefix
attention mask:输入序列的一部分前缀采用fully-visible
attention mask,其余部分采用causal
attention mask。
在最左侧的Encoder-Decoder结构中,Encoder部分采用fully-visible
attention mask,而Decoder部分采用causal
attention mask。
中间的Language model结构中,采用causal
attention mask。
最右侧的Prefix LM结构中,采用causal with prefix
attention mask。比如在翻译任务中,给定训练样本translate English to German: That is good. target: Das ist gut.
,我们对translate English to German: That is good. target:
采用fully-visible attention mask,对Das ist gut.
采用causal attention mask。
从表中可以发现,(1) 采用encoder-decoder结构且使用Denoising目标函数的效果最好; (2) encoder和decoder共享参数(Enc-dec, shared)的结构表现也差不多好; (3) 相同参数量的encoder-decoder结构(Enc-dec, shared)要比Prefix LM结构的效果好,说明添加显式的encoder和decoder之间的attention是有用的; (4) 采用Denoising目标函数的效果要好于采用一般的语言模型目标函数。
对比预训练目标
如图所示,给定句子“Thank you for inviting me to your party last week .”,图中展示了针对不同的预训练目标,模型的Input和Target样本的形式。
实验表明BERT-style
预训练目标的效果最好,因此作者又进一步分析了该目标的几种变种形式,如下图:
其中Replace corrupted spans
就是上上图中的noise replace spans
目标,Drop corrupted tokens
就是上上图中的noise, drop tokens
目标。结果表明,这几种BERT-style
预训练目标的变种效果差不多,但是后两种方法不需要预测整个输入序列,而仅需要预测被污染的部分,因此预测的序列长度更短,训练速度也更快。
对比预训练数据集
1. 对比数据集种类
- C4,unfiltered是没有经过过滤(比如去重、去除代码等)的数据集
- RealNews-like是从C4中筛选的仅新闻领域的数据
- WebText-like是从Common Crawl中过滤筛选的Reddit用户评分至少为3的数据,数据质量高
- Wikipedia是英文百科全书的数据
- TBC全称是Toronto Books Corpus,数据主要来自于电子书,和百科全书是不同的领域(different domains)。
注意,为了保证训练过程中除了数据集的种类,其他参数设置一样,作者在预训练时只用了 tokens,也就是各个数据集参与训练的样本数量是一样的。
从实验结构可以看出,(1) C4比unfiltered C4效果好,说明数据清洗的重要性;(2) Wikipedia+TBC在SGLUE上的效果比C4好,主要是因为在SGLUE中的MultiRC任务得分很高,MultiRC是一个阅读理解数据集,其中的数据主要是小说书籍,和TBC属于同一领域数据。由此说明预训练的数据集中包含一定的领域数据对下游该领域任务的性能提升有效;
2. 对比数据集大小
预训练依然只用 tokens,但是为了对比不同数据集大小的影响,需要对不同大小的数据进行重复,比如对于大小为的数据集,则需要对其重复64次以达到最终大小的量。
从表中可以看出,随着数据集不断缩小,模型的性能逐渐下降,说明大的模型很可能在小的数据集上发生了过拟合,因此建议预训练模型还是尽可能使用大数据集。
对比迁移方法
从实验结果可以看出,(1) Multi-task pre-training + fine-tuning
的效果可以和baseline Unsupervised pre-training + fine-tuning
差不多;(2) 去掉无监督任务的Supervised multi-task pre-training
的效果很差,说明无监督预训练确实很有用,此外,可以发现在翻译任务EnDe、EnFr、EnRo
上的效果没有下降很多,可能是因为只预训练英文语料对翻译任务影响不大。
对比模型规模
假如给了你4倍的算力,你应该把它用在哪?是扩大模型规模还是增长训练时间?
从表中可以看出,(1) 扩大模型规模和增长训练时间都能提高模型性能;(2) 将模型扩大到2倍规模,同时训练时间也扩大2倍的效果和将模型扩大到4倍规模的效果差不多,说明增加训练时间和扩大模型规模很可能是两种互补的可以提高模型性能的方法;(3) emsemble对提高模型性能确实有效。
大一统
通过对各种对比实验的结果进行分析,作者最终确定了训练T5模型的较优方案,其中以下几点值得注意:
- 无监督训练目标:采用
span-corruption
目标,类似SpanBERT的做法。 - 预训练策略:采用
multi-task
预训练方式(即无监督任务和有监督任务一起预训练),在对比迁移方法一小节中我们发现Multi-task pretraining + fine-tuning
的效果和Unsupervised pre-training + fine-tuning
的效果差不多,但是前者在预训练过程还能够监控下游任务的性能,因此作者最后采用Multi-task pre-training
。
总结
最后先来回顾下T5的特点:
T5 is an encoder-decoder model pre-trained on a multi-task mixture of unsupervised and supervised tasks and for which each task is converted into a text-to-text format. T5 works well on a variety of tasks out-of-the-box by prepending a different prefix to the input corresponding to each task, e.g., for a translation task: translate English to German: xxx...
个人感觉T5论文算是对当前NLP领域pre-train fine-tune主流模式下的各种训练技巧的一个总结和公平对比,分析各种训练技巧对模型性能提升的实际影响,从而采用合适的技巧预训练出一个好的模型。作者也说了,本文的目的不是提出一个新的方法,而是对NLP领域的一些技术支撑点提供一个较为全面的分析视角。
Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
Standford CS224N