T5论文笔记
T5论文笔记
T5模型:是一个端到端,text-to-text预训练模型,是个基于Transformer的Encoder-Decoder模型。
这项工作最重要的贡献是给整个NLP预训练模型领域提供了一个通用框架,将所有NLP任务都转化成Text-to-Text(文本到文本)任务,用同样的模型,同样的损失函数,同样的训练过程,同样的解码过程来完成所有NLP任务,正如论文里所说的“introducing a unified framework that converts every language problem into a text-to-text format”。
模型
为了解决Text-to-Text问题,目前主要有Encoder-Decoder、Languagemodel和Prefix LM三类结构。Languagemodel和PrefixLM比较适用于NLU类问题,但对于NLG,实验结果表明Encoder-Decoder效果更好。所以T5选择了Encoder-Decoder结构。
第一种,Encoder-Decoder型,即Seq2Seq常用模型,分成Encoder和Decoder两部分,对于Encoder部分,输入可以看到全体,之后结果输给Decoder,而Decoder因为输出方式只能看到之前的。此架构代表是MASS(今年WMT的胜者),而BERT可以看作是其中Encoder部分。
第二种,相当于上面的Decoder部分,当前时间步只能看到之前时间步信息。典型代表是GPT2还有最近CTRL这样的。
第三种,Prefix LM型,可看作是上面Encoder和Decoder的融合体,一部分如Encoder一样能看到全体信息,一部分如Decoder一样只能看到过去信息,最近开源的UniLM便是此结构。举例:完整输入为e“translate English to German: That is good. target: Das ist gut.” ,那么prefix就是“translate English to German: That is good. target:” 。
上面这些模型架构都是Transformer构成,之所以有这些变换,主要是对其中注意力机制的Mask操作进行变换。
关于注意力掩码机制,目前有Casual、Casualprefix和Fully-visible三类。Casual是一种常见的掩码机制,有从左到右和从右到左两种,当前点仅能看到该点之前的信息,看不到后面的信息,如果要看到两个方向的信息只能将两个信息concat(如BiLSTM模型),GPT就是采用这种掩码机制。Casualprefix可以看成是Casual的扩展,除了该点之前的信息外prefix也可以被看到,UniLM采用这种掩码机制。Fully-visible则是同时看两边,Bert采用的就是Fully-visible。
关于**Relative position embeddings(PE)**。T5使用了简化的相对位置embeding,即每个位置对应一个数值而不是向量,将相对位置的数值加在attention softmax之前的logits上,每个head的有自己的PE,所有的层共享一套PE。这种方式直接在计算attention weight的时候加入位置信息,而且每一层都加一次,让模型对位置更加敏感。
关于T5的baseline模型。采用编码器-解码器架构,编码器和解码器都由12个块组成(每个块包括自注意、可选的编码器-解码器注意和一个前馈网络)。每个块中的前馈网络由一个输出维数为d=3072的全连接层,一个ReLU和另一个全连接层组成。所有注意力机制“key”和“value”矩阵的d=64,所有注意力机制都有12个head。所有其他子层和嵌入的维数都是768。整个模型约有2.2亿参数,大约是BERT_BASE参数数量的两倍。对于正则化,作者在模型中统一使用0.1的概率。
baseline数据
这篇工作使用的数据集是“Colossal Clean Crawled Corpus(C4)”数据集,是一个由Common Crawl数据集(每个月大概抓取20TB文本数据)进行启发式清洗之后得到的巨大的干净的数据集,具体清洗数据的方法如下:
- 只保留结尾是正常符号的行。
- 丢弃了任何少于5个句子的页面,只保留了包含至少3个单词的行。
- 删除包含任何不好的词的页面。
- 删除任何包含lorem ipsum(用于排版测试)的页面。
- 删除包含编程语言中常用大括号的页面。
- 连续三句话重复出现的情况,只保留一个。
C4数据集达到750G。此外,作者在GLUE和SuperGLUE文本分类、CNN/Daily Mail抽象摘要、SQuAD问答以及WMT英语到德语、法语和罗马尼亚语的翻译方面进行性能测量。
baseline训练
通过实验,作者发现在微调过程中更新预训练模型所有参数的方法优于更新更少参数的方法。在训练过程中,使用AdaFactor,在测试时,使用greedy decoding(在每个timestep选择概率最高的logit)。
在微调前,对模型在C4数据集上预训练了2^19=524288步,最大序列长度为512,batchsize为128个句子,于是大约在2^35=34B个token上进行了预训练,远比BERT和RoBERTa少。预训练中,采用 “inverse square root” 学习率调整策略,$lr=1/\sqrt{max(n,k)}$,其中n是当前训练迭代数,k是warmup步骤数目(默认为10000步),于是在前10000步中,学习率固定为0.01,然后进行指数衰减。
在无标签数据上预训练时,需要一个无需标签也可以迫使模型学习到有用知识的目标。就现在来看“denoising”(也叫“masked language modeling”)目标成为了一个合适的标准,在这个目标下,模型被训练来预测输入里缺失或者损坏的token。作者在BERT模型”masked language modeling”目标和“word dropout”正则化技术的启发下,作者进行随机抽样,在输入中删除了15%的token,所有连续的空缺token用一个标记进行标记,target中还需要另外的一个结束标记,具体示例如下所示:
在微调时,进行了2^18=262144步,继续使用batch128长度512的输入数据,固定学习率为0.001,每5000步保存一次模型。
训练
有了baseline方法之后,作者从预训练方法、Mask策略、Mask比例和Span长度四个方面进行去进行对比研究以找到最好的T5模型:
第一个方面就是无监督的预训练方法对比。
语言模型式,就是像GPT-2一样,从左到右预测
BERT-style式,就是像BERT一样将一部分给破坏掉,然后还原出来(目的就是为了更好提取上下文的特征)
Deshuffiling(顺序还原)式,就是将文本打乱,然后还原出来。
其中BERT-style是最好的,T5模型使用的就是这种。第二个方面,对文本一部分进行破坏时的策略。
Mask法,随机破坏token,换成特殊符。
Replace span(小段替换),跟mask相似,不同的是mask一个字,replace span是连续的几个字。
Drop,没有替换操作,直接随机丢弃一些字符。
其中replace span法是最好的,T5模型使用的就是这种。第三个方面,对该文本百分之多少进行破坏。
挑选了4个值,10%,15%,25%,50%,最后发现BERT的15%是最好的。
第四个方面,Replace span对大概多长的小段进行破坏。
挑选了2,3,5,10这四个值,最后发现3结果是最好的。
于是根据上述对比结果,作者重新进行了训练,具体细节如下所述。
预训练
参考SpanBERT,换掉denoising目标,使用span-corruption目标,mask掉15%,采用平均长度为3的span。
训练更长步数,在2^11的batch,512的句子长度上训练了一百万步,共计大约一万亿个token。
实现了多种大小的模型,具体参数如下表:
模型 d_model d_ff d_kv heads layers parameters Base 768 3072 64 12 2.2亿 Small 512 2048 8 6 6千万 Large 1024 4096 64 16 24 7.7亿 3B 1024 16384 128 32 24 28亿 11B 1024 65536 128 128 24 110亿 - 使用Multi-task预训练,即在无标签数据中混入一定比例的有标签数据。
微调
也是Multi-task,将所有GLUE/SuperGLUE的数据拼在一起变成微调一个task,减少过拟合,但同时也会牺牲一些精度
batchsize减小到8
其实最后同时进行了多任务微调和单独微调,根据dev集选择最好的结果
解码
- 大部分使用Greedy decoding,对于输出句子较长的任务使用beam search,其中width=4,长度惩罚系数设为0.6。
研究
作者研究了T5-baseline模型在不同数据集上进行预训练之后的性能表现。得到了两个结论:首先,域内无标签数据上的预训练可以提高下有任务的性能,其次,在更多样化的数据集上进行预训练,可以对下游任务进行改进。
作者研究了小数据集导致的数据重复对模型的影响。得出结论:截断预训练数据集的大小可能会降低下游任务的性能表现,因为可能存在记忆现象。对于大模型,它们更容易对小数据集进行过拟合,因此对于越大的模型,就需要越大的数据集。
作者研究了两种不同的微调方法对模型的影响。第一种是“adapter layers”,其灵感来源于在微调时保持大部分原始模型不变的目标,具体做法是在transformer的前馈网络之后添加一个dense-ReLU-dense模块,使得前馈网络的输入和输出维度一致,这样就可以作为一个即插即用无需额外修改的模块,在微调时,只有adapter layer和LN层的参数进行更新。第二种是“gradual unfreezing”,具体来说就是随着时间的推移而逐渐更新越来越多的参数,在baseline模型中(解码器编码器都有12个block,迭代2^18步),每2^18/12步多更新一个block的参数(从后往前逐渐解冻)。最终得出结论,所有参数都进行微调得到的结果是最好的。
作者研究了同时在多个任务上进行训练对模型的影响。这里的“多任务学习”与我们常说的不同,这里是在许多任务上训练单个模型,然后对不同的下游任务选择不同的checkpoint来进行测试(也就是说不进行预训练-微调操作)。在多任务学习中,一个关键就是分别从每个数据集采样多少数据来进行训练,作者针对这个问题主要研究了三种数据混合方法。第一种是“equal mixing”,即均等采样,这显然是一个次优解,作者将其作为另一个baseline(还有一个baseline是预训练-微调方法)与其他两个方法进行对比。第二种是“examples-proportional mixing”,即按比例混合,公式为:$\theta_t^{PM}=min(\eta,N_t)/\sum_{t^{‘}} min(\eta,N_{t^{‘}})$,其中$N_t$代表第t个任务的数据集大小,而$\eta$为自己设定的数据集大小上界,以避免过大的数据集对混合率计算产生较大的影响。第三种是“temperature-scaled mixing”,要在上面的基础上进行开T次方操作,公式为:$\theta_t^{TS}=\sqrt[T]{\theta_t^{PM}}/\sum_{t^{‘}}\sqrt[T]{\theta_{t^{‘}}^{PM}}$,这样可以避免大数据集或者小数据集对于结果的影响。最终作者的出结论,还是预训练-微调的效果最好。
作者研究了如何将多任务学习和微调进行组合。结果如下图所示。
作者研究了不同scale方法对模型的影响。结果如下图所示。