Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
1910.10683.pdf (arxiv.org)
1.Abstract
预训练可以让模型学习到可以被迁移到下游任务重的通用能力和知识。在迁移学习中,模型首先在数据丰富的任务上进行预训练,然后在下游任务上进行微调。现存的缺陷:
-
训练结构:近期涌现了很多种不同的NLP迁移学习方法,这些方法使用不同的预训练目标、不同的数据集、不同的benckmark和不同的fine-tuning方法。
-
模型结构:几乎所有的pretrain+finetune的范式,都需要在下游的某个特定的nlp任务中添加新的layer,将模型的输出转化为任务特定的输出格式。
T5通过引入一个统一的框架来探索NLP的迁移学习技术的前景,该框架将所有基于文本的语言问题转换为文本到文本的格式。其基本思想:
把每一个文本相关的问题都建模为“文本到文本”问题,即T5不需要对原始的模型添加任何参数,只需要对下游的数据添加**任务声明前缀。**这样做的好处在于可以使用同一个模型、目标函数、训练和解码过程来对待每一个NLP任务,灵活性非常高;并且可以对比不同的迁移学习目标、标注数据和其他因素的影响,同时通过放大模型和数据的规模来探索NLP迁移学习的极限。
2.Model construction
2.1.Model
本质上T5使用的生成式的方法来完成所有的nlp任务,经过测试发现 encoder-decoder的结构最好,于是最终T5的架构选型就为encoder-decoder结构(即原始的transformer结构)。
它的输入首先会通过采用Self-Attention机制的(Transformer)Encoder来进行编码(句子各部分均参与Attention计算),这里的Self-Attention机制可以让时刻的输入关注到其左右两边和位置的信息。之后,Encoder的输出会通过(Transformer)Encoder-Decoder(也是利用Self-Attention机制)来关联时刻的输出,也就是关联和。最后,利用Masked Self-Attention机制的(Transformer)Decoder会关联时刻输出和其前序的输出。
在细节上,T5与原生的Transformer结构非常类似,区别在于:
-
作者采用了一种简化版的Layer Normalization,去除了Layer Norm 的bias;将Layer Norm放在残差连接外面。
-
位置编码:T5使用了一种简化版的相对位置编码,即每个位置编码都是一个标量,被加到logits上用于计算注意力权重。各层共享位置编码,但是在同一层内,不同的注意力头的位置编码都是独立学习的。一定数量的位置Embedding,每一个对应一个可能的 key-query 位置差。作者学习了32个Embedding,至多适用于长度为128的位置差,超过位置差的位置编码都使用相同的Embedding。
2.2.预训练任务
对于原始文本(Original Text),T5首先会随机Mask掉某个区间的词并用特殊的标识符(如,,等)来替换被Mask掉的区间(Span), 来作为模型的输入(Inputs)。
之后在预训练阶段(Pretrain)阶段,类似于BERT的MLM,T5会预测被Mask的区间是哪些词,但与BERT不同的是,T5的预训练标签(Targets)会通过,,等带有顺序信息的特殊字符来与输入中的, , 等特殊标识符做对齐(Align)。
这是因为T5采用的Text-to-Text框架,需要通过这样的标识符来对齐被Mask的区间(Span)和相应的预训练标签(Targets)。
为什么选择这种结构的预训练任务呢?
与训练方式的选择从四方面来进行比较:
1.高层次方法(自监督的预训练方法)对比,总共三种方式:
- 语言模型式,就是 GPT2那种方式,从左到右预测;
- BERT-style式,就是像 BERT 一样将一部分给破坏掉,然后还原出来;
- DE shuffling(顺序还原)式,就是将文本打乱,然后还原出来。
其中,发现 Bert-style 最好
2.对文本一部分进行破坏时的策略,也分三种方法:
- Mask法,如现在大多模型的做法,将被破坏 token 换成特殊符如 [M]
- replace span(小段替换)法,可以把它当作是把上面 Mask 法中相邻 [M] 都合成了一个特殊符,每一小段替换一个特殊符,提高计算效率;
- Drop法,没有替换操作,直接随机丢弃一些字符。
其中,发现 Replace Span 最好,类似做法如 SpanBERT 也证明了有效性。
3.对文本百分之多少进行破坏(Corruption Rate),挑了 4 个值:
- 10%
- 15%
- 25%
- 50%
其中,发现 BERT 的15%是最好的。
4.因Replace Span需要决定对大概多长的小段进行破坏(Corrupted Span Length),于是对不同长度探索:
- 2
- 3
- 5
- 10
其中,最后发现3结果最好。
最终的T5完整的模型结构和训练结构如下:
- Transformer Encoder-Decoder 模型
- BERT-style式的破坏方法
- Replace Span的破坏策略
- 15 %的Mask比例
- Corrupted Span Length选择3 长度的破坏句子中小段
2.3.微调任务
添加图片注释,不超过 140 字(可选)
Input and Output Format
上图中,绿色部分表示翻译任务,红色表示文本分类任务,黄色表示文本相似度任务,蓝色部分表示摘要任务,左侧的框图表示T5的输入数据格式,右边则表示输出的结果。
可以看出:T5将自然语言处理任务转化为几乎一致的格式,即输入是任务前缀声明+原始文本,输出的文本序列为相应的生成结果。
这种输入和输出的格式类似于GPT3在few shot learning下的设定,但GPT3由于受限于decoder-only的模型结构,只在文本生成类的任务上具有独特的又是,T5则同时适用于所有自然语言处理任务。
为了让模型知道在执行什么任务,在输入文本前加上任务相关的前缀。作者发现变换前缀的用词对结果影响不大,因此并未探讨不同的前缀词的影响:
1.对于翻译任务,只需将训练数据集的输入部分前加上“translate English to German” 的任务前缀声明即,额完成英文到德文的翻译。
2.对于文本分类任务,输入"sentiment:This movie is terrible!",前面加“sentiment:”的前缀,就能输出"negative"的判定结果。
3.对于需要输出连续值的文本语义相似度任务,则是以 0.2 为间隔,从 1 到 5 分之间分成 21 个值作为输出分类任务。比如上图中,输出 3.8 其实不是数值,而是一串文本。
模型的微调和预测阶段,输入输出构造:
模型输入:前缀(提示词)+输入文本
模型输出:文本(翻译、摘要等可以直接用,分类等可以通过简单的转换得到预测结果)
2.4.训练策略
者受到MT-DNN多任务学习的启发,设计了以下五组对比实验,来验证多任务学习在Text-to-Text的框架内是否可以带来提升,以及应该选择什么样的方式完成训练:
Leave-one-out multi-task training:在训练数据和下游数据(除了目标任务的数据)进行预训练,之后再在目标任务上进行微调。
Multi-task pre-training + fine-tuning:首先在训练数据和下游数据(多个任务)进行预训练,其中,下游数据包括文本分类,阅读理解,文本匹配等加入前缀的训练数据集。之后,在每个具体下游任务进行微调。
作者发现:
-
没有大规模无标语料预训练的Supervised multi-task pre-training效果最差,再次说明了大规模无标语料的预训练对模型效果影响。
-
对比Multi-task training和Multi-task pre-training + fine-tuning可以发现两阶段的训练(Pretain +Fine-tune)方式优于单阶段的训练方式(合并Pretain +Fine-tune)。
-
对比Leave-one-out multi-task training和Multi-task pre-training + fine-tuning, 可以发现缺少具体任务的预训练(Pretrain),会一定程度降低模型的效果。
-
Unsupervised pre-training + fine-tuning和Multi-task pre-training + fine-tuning,取得了相当的效果。
最终,作者认为同时在大规模无标语料和下游任务上训练对模型泛化性有好处,因此选择了:
Multi-task pre-training + fine-tuning作为T5实际采用的训练策略。
3.Conclusion
T5证明了pre-train+text-text这一框架的效果很好,考虑的各方面都很全面。其实,GPT2和GPT3都在尝试类似的事情。本质上,Text-to-Text就是一种自然的NLP多任务建模方式,因为人类本身在做NLP任务时采用的就是这种方式。另外,统一的预训练模型可以共享不同任务(Task)但同领域(Domain)的数据,这样对同领域的不同任务效果提升也会有所帮助。