T5论文笔记
论文地址: https://arxiv.org/abs/1910.10683
1. Introduction
这一节简单介绍了T5的背景和目标。从图中可以看到, T5是一个text to text model, 直接把任务名和问题一起输入模型,模型就能输出答案。 这样设计的好处是,同一个模型可以用来解决不同的问题,使得multi task learning成为可能。
2. Setup
这一节主要介绍T5使用的模型和数据。
2.1 Model
这一节介绍了T5使用的模型。早期的一些模型基于RNN, 作为例子这里引用了ULMFiT。目前有一种观点认为RNN(包括LSTM)已经过时了,现在必须用Transformer才够潮。我不同意这种观点:如果你比较贫穷,又想pretrain的话,ULMFiT仍然是个很不错的选择,它在比较少的数据和使用单个GPU就能达到很不错的效果。并且Transformer比RNN效果好并不是因为它在原理上更高明,而是在工程上它更容易scale到超大的模型和超大的数据集(也许这和在推荐系统里DNN能击败Xgboost有类似的原因)。如果有人能找到更快训练RNN的方法,也许哪一天RNN也能重新流行起来,事实上Transformer-XL里有一些结构就有RNN的影子。
T5基于Transformer,和BERT不同的是,BERT只用了Transformer Encoder. 这样的问题导致BERT在做classification和sequence labeling(例如entity recognition)上效果不错,但是在seq2seq上(例如QA,Translation)效果就没那么好。所以在T5里同时使用了encoder和decoder, 并且把所有问题都统一为text to text.
T5的Transformer和最早的版本只有很小的区别:
- remove layer norm bias
- normalization outside residual path (原始transformer是先add(input, output)再norm, 这里变成了先norm(input)再add(input, output), 大概是这个意思。)
- relative position embedding
同时论文里也指出,他们没有在实验中验证这些区别能对performance产生多大影响。
2.2 The Colossal Clean Crawled Corpus
这一节介绍T5 pretrain使用的dataset: C4. C4是Common Crawl的一个子集,只包含英文的data(使用langdetect判断), 并且使用了一些cleaning, 去掉重复、质量低的文章,把20TB的数据砍到了750GB. 具体处理见论文。
pretrain只包含英文,可能是T5在translation上表现不佳的原因。
2.3 Downstream Tasks
这里介绍了finetuning使用的task. 包括GLUE, SuperGLUE, SQuAD, WMT等等。
2.4 Input and Output Format
这里介绍了是怎么样把各种不同的任务dataset转成T5所使用的input format.
例如:
- Translation task, Input 是"translate English to German: That is good.", output是“Das ist gut.”
- Classification task, 直接output label.
等等.
3. Experiments
T5最大的模型有11B个参数,这么大的模型不可能反复实验和调参,所以在pretrain之前,T5 team在小模型上做了很多实验,以找出最合适的model和pretrain task. 他们首先建立了一个baseline model,然后在上面应用各种实验,观察finetune的效果有什么变化。
这些实验包括:
- model architectures (Section 3.2)
- unsupervised objectives (Section 3.3)
- pre-training data sets (Section 3.4)
- transfer approaches (Section 3.5)
- scaling (Section 3.6)
3.1 Baseline
这一节介绍baseline model.
3.1.1 Model
实验中使用了encoder-decoder Transformer model. 结构和BERT - base基本相同,所以参数量大约为后者的两倍。
3.1.2 Training
这里介绍了training使用的一些参数, 这节比较有趣的地方在于给出了一些参数例如steps是怎么来的.
seq len = 512, batch size = 128, 使用了packing1以后,一个batch里大约有$512*128 = 65536 = 2^{16}$个token. 训练的$step = 2^{19}$ , 所以整个training一共看了$2^{35} = 34B$个token. 这个模型仍然是在C4上train的,而34B远远小于C4的token数,所以模型并没有看过重复的data.
在pretrain中,他们使用了$learningRate = 1/\sqrt{max(n,k)}$的方式, n为step, k为一个常数$10^4$ . 他们也提到了Howard等人提出的triangular learning rate会比这个效果稍好。顺便说一下可以去看看fast.ai上的讲解,Howard在图像和NLP模型里都用这个方法达到了不错的效果。之所以这里的experiment没有用这种方法是因为他们的一些实验需要training steps是变化的,而triangular需要一开始知道要训练多少步。
在finetune中,训练的$step = 2^{18}$. 因为finetune使用的数据集有大有小,这个step数是一个考虑到各个数据集的tradeoff. 使用了恒定的$learningRate = 0.001$, 然后每隔5000个step记录结果并选择最好的validation checkpoint. 每个task的最好的performance checkpoint是独立选择的。
3.1.3 Vocabulary
T5使用了sentencepice作为tokenization的方案。因为最终要用到translation的方案,所以vocabulary也在German, Fresh, Romanian上fit过一遍。最终vocabulary大小为32k. 所以T5应该没法很好的处理中文和日文了,因为vocabuary里没有这些token, pretrain data里也不包含这些语言。
3.1.4 Unsupervised Objective
最新的研究表明denoising objective相对于left-to-right LM是对pretrain比较有效的。所以T5使用了类似于BERT的objective. 但不同的是,因为T5是一个seq2seq model,所以跟BERT给input上加mask不同,T5是直接在output上做变换。例如:
- Original Text: Thank you for inviting me to your party last week.
- Inputs: Thank you <x> me to your party <y> week.
- Ouput: <x> for inviting <y> last <z>
具体做法是mask掉15%的token, 然后在输出时只输出被还原的token. 因为输出变得很短,这样能减少pretrain中的计算量。
3.1.5 Baseline Performance
这里给出了Baseline model上train-finetune的performance, 以及和training from scratch的performance对比。 主要结论就是baseline model train-finetune的效果在几乎所有任务上都要显著比training from scratch好。所以这种seq2seq pretraining的方法看来是work的。
3.2 Architectures
这一节就开始在baseline model上作出一些修改,进行各种个样的实验了。首先是Architecture部分。
3.2.1 Model Structures
这一节讨论了各种模型结构上的不同。
首先是attention mask. attention mask是用来限制input和output之间的attention weight, 防止输出时"偷看答案"。 这里讨论的mask有三种: fully visible, causal(只能看到之前的) 和 causal with prefix(某个前缀 fully visible).
然后是architecture. 这里讨论了三种: encoder-decoder, language model, prefix LM. 这三个其实跟之前的mask是有关系的。
对于encoder-decoder, 因为输出和输入完全没有overlap, 所以encoder可以使用fully visible. decoder在training的时候不应该look into the future, 所以使用了causal. (这个mask应该是加在了decoder的self attention上, 至于decoder和encoder之间的attention应该是fully visible的)
对于language model, 在predict next token的时候不能看到答案,所以要用causal mask. 注意encoder-decoder中的decoder实际上就是language model.
因为language model中一个token只能attend到之前的token, 这会造成在一些任务例如翻译中损失很多信息。所以有了prefix LM来解决这个问题。修改mask让input中的前面一段可以fully visible.
论文里也提到了一点,就是prefix LM在classification任务中其实和BERT是几乎等效的,考虑以下例子:
BERT: [CLS] I hate pigeons. [SEP] My feelings towards pigeons are filled with animosity. => entailment
prefix LM: premise: I hate pigeons. hypothesis: My feelings towards pigeons are filled with animosity. => entailment
这样,对mask的设定,两者是一样的。
3.2.2 Comparing Different Model Structures
对不同的模型进行对比,应该基于类似的参数量和计算量来进行。但是问题在于,参数量和计算量是不成正比的。例如对于(L+L)层的encoder-decoder模型,它的参数量相当于2L层的language model(只有decoder), 但是计算量只相当于L层的language model. 这是因为对于language model,它必须同时对input和output进行计算; 而encoder只算input, decoder只算output. 基于这个原因,在后面比较的时候,同时列出了计算量和参数量。
3.2.3 Objectives
这里的objective用了两种,denoising(类似BERT) 和 language model(predict next token).
3.2.4 Results
这里按照Architecture, Objective, 参数量,计算量去比较了各种实验的performance(Table 2).
结论:
- encoder-decoder的效果比language model和prefix LM要好,即使是在参数量一样,计算量减半的情况下。比较神奇的是,即使把encoder和decoder share参数,效果几乎也一样好。
- denoising效果总是比language model要好。
3.3 Unsupervised Objectives
这里探讨了不同的unsupervised objectives的尝试。
3.3.1 Disparate High-Level Approaches
从结果上来看:BERT style会比prefix LM和deshuffling要好,deshuffling是最差的。
3.3.2 Simplifying the BERT Objective
这里又细分比较了BERT style的不同做法。其实看起来都差不多,最好的一种方法是replace corrupted spans. 这种方法在CoLA上有奇效,可能是因为里面有判断语法的问题,而语法判断和missing token是closely related.
3.3.3 Varying the Corruption Rate
这里还实验了不同的corruption rate, 看起来 10% - 25% 效果都差不多。
3.3.4 Corrupting Spans
这里实验了在固定15%的corruption rate下,span length的影响。看起来影响比较小。
3.3.5 Discussion
总结了一下实验的步骤。总的来说就是每次考虑一种变化,在固定最好的approach之后再继续后面的实验。 ![[t5-objective.png]]
3.4 Pre-training Data set
这一节也比较有意思。它比较了不同pretrain dataset的影响。
3.4.1 Unlabeled Data Sets
这里比较了不同的dataset, 比较有意思的发现: (注意因为只pretrain了$2^{35} \approx 34B$ tokens, 所以数据集大小并不代表全train完了)
- C4(745 GB) 比 C4 unfiltered(6.1TB)效果好。说明了data cleaning的重要性。
- WebText-like(17GB)的效果很好。这个dataset只包含reddit上score >= 3的内容。说明data quality很重要!读好书,才能成为一个好人。
- Wikipedia + Toronto Books Corpus效果好,单用Wikipedia效果不够好,说明domain knowledge很有用。
3.4.2 Pre-training Data set Size
这里讨论了数据集大小的影响。在固定$step = 2^{35} \approx 34B$ tokens的前提下,把C4 truncate到$2^{29}, 2^{27}, 2^{25}, 2^{23}$的大小,分别相当于$64,256,1024$和$4096$个epoch.
结论:随着dataset变小,模型效果下降。结合training loss曲线分析,如果重复过多次,会导致overfitting. 但是对于重复64次,模型效果下降不明显,说明少量重复(稍微多训练几个epoch)对效果影响不大。不过,对于pretraining来说,因为获取unlabeled data比较容易,多用data总是更好的。
经验规律:dataset中token的数量小于模型参数量的时候,会容易引发overfit.
3.5 Training Strategy
这里讨论了不同的training strategy.
3.5.1 Fine-tuning Methods
对于fine tuning, 讨论了几种不同的方法:
- all parameters
- adapter layers
- gradual unfreezing. 这又是一个Howard提出的方法,可以去看fast.ai. 记得这种方法对image model很有效,特别是先unfreeze batch norm, 再unfreeze其他,会让收敛快很多。
最后实验的结果:
- 跟gradual unfreezing比,其实直接fine tune所有参数效果比较好。不过gradual unfreeze会让训练更快一些。
- adapter layers参数越多效果越好(废话)。
3.5.2 Multi-task Learning
在之前的实验里,都是先pretrain unsupervised再fine tune downstream. 其实也可以用multi task learning 把所有任务放在一起训练. 在这里,模型选择的时候,对每个task选择最好的checkpoint进行evaluate,而不是一共只选一个。
对于multi task learning, 一个很重要的问题是怎么选择不同task data的比例。这里提到的几种方法:
- Examples-proportioinal mixing. 也就是按照每个task dataset的大小来进行mix。因为所有的dataset里,unsupervised的大小是最大的,并且占据绝对优势,所以这里在计算mix的时候进行了一个clipping, 把dataset example的最大数量给了一个限制K。
- Temperature-scaled mixing. 把某个task的mixing rate取一个$1/T$ power,然后normalize. 这样可以照顾到数据比较少的dataset, 让对应的task可以充分训练。当$T=1$的时候相当于Examples-proportioinal mixing, 而当$T \rightarrow \infty$的时候则相当于Equal mixing。
- Equal mixing.
总体的结论: multitask training一般会比先pretrain再finetune差. 对不同的任务, K会有不同的最优值,而T有一个共同的最优值$T=2$.
3.5.3 Combining Multi-Task Learning with Fine-Tuning
其实在multi task和pretrain-finetune之外还有一种选择,就是leave one out multi task: pretrain的时候把所有其他task一起train, 然后在target task上fine tune.
这里做了几种实验:
- unsupervised pretrain + finetune (baseline)
- multitask (去掉了了pretrain, 直接multitask downstream)
- multitask pretrain + finetune
- leave one out
- supervised multi task pretrain
结论: multi-task pretrain + finetune结果可以跟baseline差不多. leave one out效果没有下降很多,说明不同的task之间可以benefit。 去掉unsupervised以后效果很差,但是对translation效果影响不大,说明translation对pretraining的要求不高。
3.6 Scaling
这一节回答这么一个问题: 假如你有两倍的计算能力,你应该把它花在哪里?是训练更大的模型,还是训练更长的时间?还是训练几个模型来ensemble?
结论:
- 模型大小和训练时间: $2 \times size + 2 \times trainingSteps$ 的效果约等于 $4 \times size + 1 \times trainingSteps$.
- ensemble: $4 \times ensemble$ 不如模型扩大4倍, 但它的提升是和其他方法正交的。
3.7 Putting It All Together
这里介绍了最终模型使用的结构,参数和训练策略。基本上是从每个实验中取得最好的方法。然后列举了它在大量不同task上的performance。
4. Reflection
这一章讲了T5研究中的一些反思。
4.1 Takeaways
基本上又总结了一遍前面提到的各种发现。
4.2 Outlook
一些存在的问题和之后的方向。
- 模型越大效果肯定越好,但也越不方便不实用,要把模型做小。
- denoising还不够,想要更好的pretrain方法。
- Formalizing the similarity between tasks: 使用in domain data pretrain能提高效果,但目前没有什么方法判断in domain.
- Language-agnostic models: 发现只pretrain英语对translation task效果不够好。希望能找到(不需要multi lingual data)的更好方法。
将尽可能多的sequence放进一条样本内(总长度约等于seq len), 以达到节省计算资源的目的. ↩︎