一、简介
T5是基于Encoder-Decoder结构的Transformer的模型,对经典的Transformer做了三个带动。其核心将NLP任务看作一个序列到序列的统一框架,做大规模的预训练,主打通用。
最大将模型做到11B,基本上是Encoder-Decoder模型能够承受其训练成本的最大化,后文会引用另一位博主的分析为什么这种架构很难做得更大(区别于Decoder-only)
区分任务的方式在于将输入的开头加入任务的描述,比如翻译、总结:
2020年年初投稿
二、模型
结构和transformer一致,除了做出了以下的三点改变:
1.移除layer normalization中的偏置
2.将layer normalization放在残差结构之外
3.使用相对位置编码,区别于经典transformer的正余弦编码
三、数据清洗
数据主要源于Common Crawl这个定期爬取网络数据的爬虫项目
清洗方法:
1.仅保留以终端标点符号(即句号、感叹号、问号或结束引号)结尾的行。
2.丢弃少于5句的段、少于3个词的行
3.不合适关键词的数据去除
4.去除三句重复出现过的段
5.去除包含‘{’的类似代码非自然语言的数据
6.去除占位符出现的段
7.去除大概率不是英语的数据
预训练的数据大约34B tokens;微调时微调了26w步
四、可执行任务
句子分类、情感分析、段落句子相似性、自然语言推理、问答等
五、训练
5.1 训练目标
在输入前添加任务类型的前缀
训练目标是使用teach-forcing的方式的最大似然目标,使用交叉熵损失。也就是说,模型在训练时解码器能看到之前位置的token(未被mask)的是真实的token而不是模型之前的推理结果;在测试时,则使用贪心解码,也就是每一个token的生成时选择概率最大的那个,最为生成结果和decoder中的query输入。
5.2 预训练
在训练T5 base时用的类似于BERT的
探索不同的训练方式/目标(随机加噪声/自回归),加噪声,和encoder-decoder的层是否共享参数。
5.3 微调方法
encoder模型在下游任务上的加一个线性层冻结原来编码器的方式在encoder-decoder的结构下不适用,因为decoder必须不能被冻结来对给定的任务输出目标序列
尝试了两种方法
1.适配器层,在transformer的每一个块的前馈神经网络后加由线性层+激活函数(RELU)
+线性层组成的适配器层,这种层能够很好地适用于微调的场景,冻结原来预训练过的参数,还能够使得模型的输出维度匹配其输入维度
2.逐步解冻
从最后一层逐步放开每一层的参数更新,对于encoder-decoder的模型来说,逐步同时解冻encoder和decoder相应的层;对于输入的线性层和输出的线性层,二者是共享参数的,微调时都解冻。