【NLP】T5速读

2,485 阅读5分钟
ALBERT凳子还没坐热,GLUE就又换了老大,Google T5 (Text-to-Text Transfer Transformer)大力出奇迹,威震天在角落默不作声。

简介

这次的T5模型虽然名字和BERT+系列不一样,但底子里还是差不多的。给我的感觉就是大型Seq2Seq的BERT+干净的数据+多任务+一些改动。论文的作者深入对比了不同的预训练目标、模型结构、无监督数据集、迁移方法、NLU任务,最终拼成了T5。文章除去reference一共34页,可以说很良心地剖析了transformer的效果,本文尽量把细节和结论都清晰地整理出来。

来感受一下T5的size:

贴一下在GLUE和SUPERGLUE的登顶照:

1. 模型

输入和输出

和GPT2一样,T5把所有的NLP问题归结为了“text-to-text”的任务,下图展示了T5在翻译、分类、相似度、摘要任务上的输入输出样例:



Relative position embeddings (PE)

T5使用了简化的相对位置embeding,即每个位置对应一个数值而不是向量,将相对位置的数值加在attention softmax之前的logits上,每个head的有自己的PE,所有的层共享一套PE。个人认为这种方式更好一点,直接在计算attention weight的时候加入位置信息,而且每一层都加一次,让模型对位置更加敏感。

原文中有句话很难懂,之后懂了解读一下:

In this work, we use 32 embeddings for all of our models with ranges that increase in size logarithmically up to an offset of 128 beyond which we assign all relative positions to the same embedding.

2. 数据

Colossal Clean Crawled Corpus (C4)

作者选取了Common Crawl数据集,这个数据集每周大约爬取20TB的WEB数据。虽然数据集已经抽取了文本,但实际上并不干净,里面还包含了很多非自然语言的东西,比如错误消息、菜单、重复文本,用过脏数据的同学一定深有体会。于是本文对数据进行了比较细致的处理:

  • 只取结尾有标点的句子
  • 去掉包含脏话的网页
  • 有很多页面包含"enable Javascript"的提示,去掉包含Javascript的句子
  • "lorem ipsum"是一个测试网页排版的拉丁文,去掉包含这个占位符的网页
  • 去掉包含代码片段的网页
  • 以三句为一个片段进行去重
  • 去掉非英文的网页

经过上述处理后最终生成了750GB的数据集C4,并且在TensorFlow Datasets开源了。

3. 任务及数据格式

任务

机器翻译、问答、生成式摘要、文本分类(单句&双句)

数据格式

  • 输入:参考GPT2,直接把任务名称当作prefix和输入拼在一起
  • 输出:分类任务(如推断),需要输出"entailment", "neutral", "contradiction"这三种文本,否则都算错;回归任务输出str类型的浮点数。还有其他任务,请需要的同学前往附录D参考~

4. 训练

预训练

  • 参考SpanBERT,mask掉15%,平均长度为3的span
  • 训练更长步数,1百万步*1024个样本
  • 使用Multi-task预训练,即混入在无监督数据中混入一定比例的任务数据

精调

  • 也是Multi-task,将所有GLUE/SuperGLUE的数据拼在一起变成精调一个task,减少过拟合,但同时也会牺牲一些精度
  • batch size减小到8
  • 其实最后同时进行了多任务精调和单独精调,根据dev集选择最好的结果

解码

大部分使用Greedy decoding,对于输出句子较长的任务使用beam search

5. 结论

Architectures

  1. 原始的Transformer结构表现最好
  2. encoder-decoder结构和BERT、GPT的计算量差不多
  3. 共享encoder和decoder的参数没有使效果差太多

Unsupervised objectives

  1. 自编码和自回归的效果差不多
  2. 作者推荐选择更短目标序列的目标函数,提高计算效率

Datasets

  1. 在领域内进行无监督训练可以提升一些任务的效果,但在一个小领域数据上重复训练会降低效果
  2. Large、diverse的数据集最香了

Training strategies

  1. 精调时更新所有参数 > 更新部分参数
  2. 在多个任务上预训练之后精调 = 无监督预训练

Scaling

  1. 在小模型上训练更多数据 < 用少量步数训练更大的模型
  2. 从一个预训练模型上精调多个模型后集成 < 分开预训练+精调后集成


本来想把实验部分也写出来,最后败给了页数,之后细读发现有用的东西还会放上来。总体感觉T5除了position embedding之外没什么新的东西,在GLUE以及机器翻译上的提升都很有限,但作者本来的意图也是做一个全面的分析,砸百万美元替大家排忧解难,此处应有掌声。

从最近的研究来看,目前模型复杂度和性能真的是很难平衡,但今天也听到了量子计算的福音,科技永远向前,希望NLP越来越好。


(我会继续补充的)



hi all!最近终于有了自己的公众号,叫NLPCAB,本来想叫LAB,但觉得和一个人能撑起实验室我就上天了,所以取了谐音CAB,有些可爱并且意味深长?之后会努力和Andy发干货,也希望各位同学投稿学习笔记~