数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
- 线性模型
- 支持向量机
- 朴素贝叶斯
- 决策树
- knn
- 集成学习
- 梯度提升树
- 数据预处理
- 模型评估
- 降维
- 聚类
- 半监督学习
- EM 算法
- 最大熵算法
- 隐马尔可夫模型
- 概率图与条件随机场
- 边际概率推断
- 主题模型
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- CRF ++
- lightgbm
- xgboost
- xgboost 使用指南
- scikit-learn
- spark
- numpy
- matplotlib
- matplotlib 使用指南
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
二十六、T5 [2020]
-
训练一个机器学习模型来执行自然语言处理任务,往往需要该模型能够以适合
downstream learning
的方式来处理文本。这可以被粗略地看作是开发通用的知识,使模型能够 "理解" 文本。这种知识的范围可以是low-level
的(如单词的拼写或含义),也可以是high-level
的(如 “小提琴太大从而无法装入大多数背包”)。在现代机器学习实践中,提供这种知识很少是显式的;相反,提供这种知识往往是作为辅助任务的一部分来学习。例如,历史上常见的方法是使用word vector
,将单词映射到一个continuous representation
中,理想情况下,相似的单词映射到相似的向量。这些向量通常是通过一个objective
来学习的,例如,鼓励co-occurring
的单词在continuous space
中相互靠近。最近,在一个数据丰富的任务上对整个模型进行预训练变得越来越常见。理想情况下,这种预训练使模型发展出通用的能力和知识,然后可以迁移到下游任务中。在计算机视觉的迁移学习应用中,预训练通常是通过在
ImageNet
这样的大型标记数据集上的监督学习来完成的。相比之下,NLP
中的现代迁移学习技术通常在未标记数据上使用无监督学习进行预训练。这种方法最近被用来在许多最常见的NLP benchmark
中获得SOTA
的结果。除了经验上的优势,NLP
的无监督预训练特别有吸引力,因为由于互联网的存在,未标记的文本数据大量存在。例如,Common Crawl
项目每月产生约20TB
文本数据(从网页中提取的文本)。这对神经网络来说是一种自然的契合:神经网络已经被证明具有卓越的可扩展性scalability
,也就是说,仅仅通过在更大的数据集上训练更大的模型,往往可以获得更好的性能。这种综合作用导致了最近的大量工作用于为
NLP
开发迁移学习方法,产生了广泛的预训练objective
、未标记数据集、benchmarks
、微调方法等等。这个新兴领域的快速进展和技术的多样性会使我们很难比较不同的算法、区分新贡献的效果、以及了解现有的迁移学习方法的空间。出于对更严格理解的需要,论文《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》
利用一个统一的迁移学习方法,使我们能够系统地研究不同的方法,并推动该领域的现有局限性。作者将他们的模型和框架称为Text-to-Text Transfer Transformer: T5
。论文的基本思路是:将每一个文本处理问题作为一个
"text-to-text"
的问题,即以文本为输入、产生新的文本作为输出。这种方法受到以前NLP
任务的统一框架的启发,包括将所有文本问题作为问答任务(《The natural language decathlon: Multitask learning as question answering》
)、语言建模任务(《Language models are unsupervised multitask learners》
)、以及span extraction
任务(《Unifying question answering text classification via span extraction》
)。最重要的是,text-to-text
框架允许我们直接将相同的模型、objective
、训练程序、以及解码过程应用于我们考虑的每一项任务。论文利用这种灵活性,对各种基于英语的NLP
问题进行性能评估,包括问答、文档摘要、以及情感分类等等。通过这种统一的方法,我们可以比较不同的迁移学习objective
、未标记的数据集、以及其他因素的有效性,同时通过扩大模型和数据集的规模从而探索迁移学习在NLP
中的局限性。作者强调:论文的目标不是要提出新的方法,而是要对该领域的现状提供一个全面的视角。因此,论文的工作主要包括对现有技术的综述、探索、以及经验比较。作者还通过
scale up
来自他们的系统性研究的insights
(训练模型达到110
亿个参数)来探索当前方法的局限性,在论文考虑的许多任务中获得SOTA
的结果。为了进行这种规模的实验,作者引入了"Colossal Clean Crawled Corpus: C4"
,这是一个由数百GB
的、从网上抓取的干净英语文本组成的数据集。认识到迁移学习的主要作用是可以在数据稀缺的环境中利用预训练的模型,作者发布了他们的代码、数据集、以及预训练好的模型。
26.1 配置
26.1.1 模型
-
由于
Transformer
越来越流行,我们研究的所有模型都是基于Transformer
架构的。我们没有提供这个模型的全面定义,而是让感兴趣的读者参考原始论文(《Attention is all you need》
)。总的而言,我们的
encoder-decoder Transformer
的实现密切遵循《Attention is all you need》
中的原始形式:-
首先,一个关于
token
的输入序列被映射成一个embedding sequence
,然后被馈入到编码器。 -
编码器由一堆
"blocks"
组成,每个block
包括两个子组件:一个self-attention layer
,以及后面跟一个小的feed-forward network
。-
layer normalization
被应用于每个子组件的输入。我们使用简化版的layer normalization
,其中activations
仅仅被rescale
而没有additive bias
。 -
在
layer normalization
之后,一个residual skip connection
将每个子组件的input
添加到其output
。 -
dropout
被用于feed-forward network
内部、skip connection
、attention weights
、以及整个stack
的input
和output
。
-
-
解码器的结构与编码器相似,只是它在每个
self-attention layer
之后包括一个标准的注意力机制,这个注意力机制关注编码器的输出。解码器中的自注意力机制使用一种自回归或因果的
self-attention
,它只允许模型关注past outputs
。 -
final decoder block
的输出被馈入一个具有softmax output
的dense layer
,其权重与input embedding matrix
共享。 -
Transformer
中的所有注意力机制都被拆分成独立的"heads"
,这些heads
的output
在被进一步处理之前被拼接起来。
-
-
由于
self-attention
是order-independent
的(即,它是对集合的操作),所以向Transformer
提供一个显式的position signal
是很常见的。虽然最初的
Transformer
使用正弦的position signal
、或learned position embeddings
,但最近使用relative position embeddings
变得更加普遍。relative position embeddings
不是为每个位置使用一个fixed embedding
,而是根据自注意力机制中正在比较的"key"
和"query"
之间的offset
产生不同的learned embedding
。我们使用
relative position embeddings
的简化形式,其中每个"embedding"
只是一个标量,被添加到用于计算注意力权重的相应logit
中。为了提高效率,我们还在模型的所有层中共享position embedding parameters
,尽管在同一个给定的层中每个attention head
使用不同的learned position embedding
。positional embedding
向量的维度为1
维,因此用法是:其中:
$ \mathbf P\in \mathbb R^{n\times n} $ 为不同位置之间的relative position embedding
组成的矩阵, $ n $ 为序列长度。通常情况下,要学习固定数量的
relative position embeddings
,每个embedding
对应于可能的key-query offsets
取值。在这项工作中,我们对所有的模型使用32
个relative position embeddings
,它对应的offsets
范围是0
到128
(根据对数来增加),超过128
的offsets
将分配一个相同的relative position embedding
(即,oov
)。请注意,一个给定的层对超过128
个token
的relative position
不敏感,但后续的层可以通过结合前几层的局部信息建立对更大offsets
的敏感性。 -
综上所述,我们的模型与
《Attention is all you need》
提出的原始Transformer
大致相当,只是去掉了Layer Norm bias
、将layer normalization
置于residual path
之前、并使用不同的position embedding
方案。由于这些架构变化与我们在迁移学习的实证调查中考虑的实验因素是正交的,我们将其影响的消融留给未来的工作。 -
作为我们研究的一部分,我们对这些模型的可扩展性进行了实验,即:当具有更多的参数或更多的层时,模型的性能会发生怎样的变化。
训练大型模型可能是不容易的,因为它们可能无法适应在单台机器上,而且需要大量的计算。因此,我们使用模型并行和数据并行的组合,在
Cloud TPU Pods
的"slices"
上训练模型。TPU pods
是multi-rack
机器学习超级计算机,包含1024
个TPU v3
芯片,通过高速2D mesh
互连且支持CPU
主机。我们利用Mesh TensorFlow library
从而方便实现模型并行和数据并行。
26.1.2 Colossal Clean Crawled Corpus
-
以前关于自然语言处理的迁移学习的大部分工作都是利用大型未标记数据集进行无监督学习。在本文中,我们对评估这种未标记数据的质量、特性、以及规模的影响感兴趣。为了生成满足我们需要的数据集,我们利用
Common Crawl
作为从网络上爬取的文本来源。Common Crawl
以前曾被用作自然语言处理的文本数据源,例如,训练N-gram
语言模型、作为常识推理的训练数据、为机器翻译挖掘parallel texts
、作为预训练数据集、甚至只是作为测试optimizers
的巨型文本语料库。Common Crawl
是一个公开的web archive
,它通过从爬取的HTML
文档中删除markup
和其他non-text
内容来提供"web extracted text"
。这个过程每月产生约20TB
的爬取的文本数据。不幸的是,大部分产生的文本不是自然语言。相反,它主要包括胡言乱语或模板文本,如menu
、错误信息、或重复的文本。此外,大量的爬取文本包含的内容不太可能对我们考虑的任何任务有帮助(攻击性语言、占位符文本、源代码等)。为了解决这些问题,我们使用了以下启发式方法来清理Common Crawl
的web extracted text
:-
我们只保留以终结标点符(即句号、感叹号、问号或尾部引号)结束的行。
-
我们丢弃了任何少于
5
个句子的网页,只保留了包含至少3
个单词的行。 -
我们删除了任何含有 "肮脏、顽皮、淫秽或其他不良单词的清单" 中任何单词的网页。
-
许多被爬取的页面包含
warning
,该warning
说应该启用Javascript
,因此我们删除了任何带有Javascript
的行。 -
一些页面有占位符
"lorem ipsum"
文本,我们删除了任何出现"lorem ipsum"
短语的页面。 -
一些页面无意中包含代码。由于大括号
"{"
出现在许多编程语言中(如在网络上广泛使用的Javascript
),而不是在自然文本中,我们删除了任何含有大括号的网页。 -
为了对数据集去重,对于数据集中任何
three-sentence span
的多次出现,我们仅保留其中的一次出现而丢弃其它地方的出现。
此外,由于我们的大多数下游任务都集中在英语文本上,我们使用
langdetect
来过滤掉任何未被分类为英语(分类概率至少为0.99
)的网页。我们的启发式方法受到过去使用Common Crawl
作为自然语言处理的数据来源的启发,例如:-
《Learning word vectors for 157 languages》
也使用自动化的语言检测器过滤文本并丢弃短行。 -
《Dirt cheap web-scale parallel text from the common crawl》
和《Learning word vectors for 157 languages》
都进行line-level
去重。
然而,我们选择创建一个新的数据集,因为之前的数据集使用了更有限的启发式过滤方法、没有公开提供、和/或范围不同(例如,仅限于新闻数据,只包括
Creative Commons
内容,或专注于机器翻译的平行训练数据)。 -
-
为了组装我们的
base dataset
,我们下载了2019
年4
月的web extracted text
,并应用了上述的过滤。这产生了一个文本集合,它不仅比用于预训练的大多数数据集大了几个数量级(约750GB
),而且还包括相当干净和自然的英语文本。我们把这个数据集称为Colossal Clean Crawled Corpus: C4
,并将其作为TensorFlow Datasets
的一部分发布。我们在实验部分考虑了使用该数据集的各种替代版本的影响。
26.1.3 下游任务
-
我们在本文中的目标是:度量通用语言学习
general language learning
的能力。因此,我们在一组不同的benchmark
上研究下游任务的性能,包括机器翻译、问答、抽象摘要、以及文本分类。具体来说,我们度量了如下任务的性能:GLUE
和SuperGLUE
文本分类meta-benchmarks
、CNN/Daily Mail
抽象摘要、SQuAD
问答、以及WMT English to German, French, Romanian
的翻译。所有的数据都来自于TensorFlow Datasets
。 -
GLUE
和SuperGLUE
各自包括一组文本分类任务,旨在测试通用语言理解能力:-
CoLA
:句子可接受性acceptability
判断。 -
SST-2
:情感分析。 -
MRPC, STS-B, QQP
:转述/句子相似性。 -
MNLI, QNLI, RTE, CB
:自然语言推理。 -
WNLI, WSC
:共指消解coreference resolution
。 -
COPA
:句子补全。 -
WIC
:词义消歧word sense disambiguation
。 -
MultiRC, ReCoRD, BoolQ
:问答。
我们使用
GLUE
和SuperGLUE
基准所分发的数据集。为了简单起见,在微调时,我们通过将GLUE
的所有组成的数据集拼接起来,从而将GLUE benchmark
中的所有任务(以及类似的SuperGLUE
)作为单个任务。正如《A surprisingly robust trick for Winograd schema challenge》
所建议的,我们还将Definite Pronoun Resolution : DPR
数据集纳入SuperGLUE
任务。 -
-
CNN/Daily Mail
数据集是作为一个问答任务引入的,但被《Abstractive text summarization using sequence-to-sequence RNNs beyond》
改造为文本摘要;我们使用《Get to the point: Summarization with pointer-generator networks》
的非匿名版本作为抽象摘要abstractive summarization
任务。 -
SQuAD
:是一个常见的问答benchmark
。在我们的实验中,我们将question
和context
馈入模型,并要求模型逐个token
地生成答案。 -
对于
WMT English to German
翻译,我们使用与《Attention is all you need》
相同的训练数据(即News Commentary v13, Common Crawl, Europarl v7
),以及相同的newstest2013
作为验证集。对于
English to French
翻译,我们使用WMT 2015
年的标准训练数据、以及newstest2014
作为验证集。对于
English to Romanian
,这是一个标准的lower-resource
机器翻译benchmark
,我们使用WMT2016
的训练集和验证集。请注意,我们只对英语数据进行预训练,所以为了学习翻译,给定的模型将需要学习用一种新语言来生成文本。
26.1.4 Input 和 Output 格式
-
为了在上述不同的任务上训练一个单一的模型,我们把所有我们考虑的任务都变成了
"text-to-text"
的形式,即:一些文本馈入模型作为上下文或条件,然后要求模型产生一些输出文本。这个框架同时为预训练和微调提供了一个一致的training objective
。具体而言,不管是什么任务,模型都是用最大似然objective
来训练的。为了为模型指定需要执行的任务,我们在把原始输入序列馈入模型之前,给input
添加一个task-specific
的前缀。例如,如果要求模型将句子
"That is good."
从英语翻译成德语,模型将被馈入序列"translate English to German: That is good."
,并被训练从而输出"Das ist gut."
。对于文本分类任务,模型只是预测与
target label
相对应的单个单词。例如,在MNLI benchmark
上,目标是预测一个前提premise
是否蕴含("entailment"
)、矛盾("contradiction"
)、或者中性("neutral"
)一个假设hypothesis
。经过我们的预处理,输入序列变成"mnli premise: I hate pigeons. hypothesis: My feelings towards pigeons are filled with animosity."
,相应的target
单词是"entailment"
。请注意,如果我们的模型在文本分类任务中输出的文本与任何可能的标签文本都不对应,就会出现问题。例如,如果模型输出的是
"hamburger"
,而该分类任务唯一可能的标签是"entailment"
、"neutral"
、或"contradiction"
。在这种情况下,我们总是把模型的输出算作是错误的,尽管我们从未在任何一个我们的trained models
中观察到这种行为。请注意,用于给定任务的文本前缀的选择本质上是一个超参数。我们发现改变前缀的
exact wording
的影响有限,因此没有对不同的prefix choice
进行广泛的实验。下图是我们的text-to-text
框架,其中有一些input/output
的例子。 -
每个任务的
preprocessed inputs
的完整例子(来自论文附录D
):其中
{XXX}
、{YYY}
等表示占位符(代表一段文本),Processed input:
的冒号后面的内容才是馈入到模型中的字符串。注意:
Original input
表示原始的输入,Original target
表示原始的label
(都是整数或浮点数),Processed input
表示处理后的输入,Processed target
表示处理后的label
(都是字符串)。-
CoLA
:Original input: Sentence: "{XXX}." Processed input: "cola sentence: {XXX}." Original target: 1 Processed target: "acceptable"
-
RTE
:xxxxxxxxxx
Original input: Sentence 1: "{XXX}." Sentence 2: "{YYY}." Processed input: "rte sentence1: {XXX}. sentence2: {YYY}." Original target: 1 Processed target: "not_entailment" -
MNLI
:xxxxxxxxxx
Original input: Hypothesis: "{XXX}." Premise: "{YYY}." Processed input: "mnli hypothesis: {XXX}. premise: {YYY}." Original target: 2 Processed target: "contradiction" -
MRPC
:xxxxxxxxxx
Original input: Sentence 1: "{XXX}." Sentence 2: "{YYY}." Processed input: "mrpc sentence1: {XXX}. sentence2: {YYY}." Original target: 1 Processed target: "equivalent" -
QNLI
:xxxxxxxxxx
Original input: Question: "{XXX}?" Sentence: "{YYY}." Processed input: "qnli question: {XXX}? sentence: {YYY}." Original target: 0 Processed target: "entailment" -
QQP
:xxxxxxxxxx
Original input: Question 1: "{XXX}?" Question 2: "{YYY}?" Processed input: "qqp question1: {XXX}? question2: {YYY}?" Original target: 0 Processed target: "not_duplicate" -
SST2
:xxxxxxxxxx
Original input: Sentence: "{XXX}." Processed input: "sst2 sentence: {XXX}." Original target: 1 Processed target: "positive" -
STSB
:xxxxxxxxxx
Original input: Sentence 1: "{XXX}." Sentence 2: "{YYY}." Processed input: "stsb sentence1: {XXX}. sentence2: {YYY}." Original target: 3.25 Processed target: "3.2" -
CB
:xxxxxxxxxx
Original input: Hypothesis: "{XXX}." Premise: "{YYY}?" Processed input: "cb hypothesis: {XXX}. premise: {YYY}?" Original target: 1 Processed target: "contradiction" -
COPA
:xxxxxxxxxx
Original input: Question: "{XXX}" Premise: "{YYY}." Choice 1: "{ZZZ1}." Choice 2: "{ZZZ2}." Processed input: "copa choice1: {ZZZ1}. choice2: {ZZZ2}. premise: {YYY}. question: {XXX}" Original target: 1 Processed target: "True" -
MultiRC
:xxxxxxxxxx
Original input: Answer: "{XXX}." Paragraph: "{YYY}." Question: "{ZZZ}?" Processed input: "multirc question: {ZZZ}? answer: {YYY}. paragraph: {XXX}." Original target: 1 Processed target: "True" -
WiC
:[]
表示占位符。xxxxxxxxxx
Original input: POS: "[Y/N]" Sentence 1: "{XXX}." Sentence 2: "{YYY}." Word: "[word]" Processed input: "wic pos: [Y/N] sentence1: {XXX}. sentence2: {YYY}. word: [word]" Original target: 0 Processed target: "False" -
WSC DPR
:xxxxxxxxxx
Original input: Span 2 text: "it" Span 1 text: "stable" Span 2 index: 20 Span 1 index: 1 Text: "The stable was very roomy, with four good stalls; a large swinging window opened into the yard , which made it pleasant airy." Processed input: "wsc: The stable was very roomy, with four good stalls; a large swinging window opened into the yard , which made *it* pleasant airy." Original target: 1 Processed target: "stable" -
CNN/Daily Mail
:xxxxxxxxxx
Original input: "{XXX}." Processed input: "summarize: {XXX}." Original target: "{YYY}." Processed target: "{YYY}." -
SQuAD
:xxxxxxxxxx
Original input: Question: "{XXX}?" Context: "{YYY}." Processed input: "question: {XXX}? context: {YYY}." Original target: "{ZZZ}" Processed target: "{ZZZ}" -
WMT English to German
:xxxxxxxxxx
Original input: "{XXX}." Processed input: "translate English to German: {XXX}." Original target: "{YYY}." Processed target: "{YYY}." -
WMT English to French
:xxxxxxxxxx
Original input: "{XXX}." Processed input: "translate English to French: {XXX}." Original target: "{YYY}." Processed target: "{YYY}." -
WMT English to Romanian
:xxxxxxxxxx
Original input: "{XXX}." Processed input: "translate English to Romanian: {XXX}." Original target: "{YYY}." Processed target: "{YYY}."
-
-
我们的
text-to-text
框架遵循以前的工作,将多个NLP
任务转换一个共同的格式:-
《The natural language decathlon: Multitask learning as question answering》
提出了"Natural Language Decathlon"
,这是一个benchmark
,对一组10
个NLP
任务使用一致的question-answer
格式。Natural Language Decathlon
还规定:所有模型必须是多任务的,即能够同时处理所有的任务。相反,我们允许在每个单独的任务上分别对模型进行微调,并使用简短的
task prefix
,而不是显式的question-answer
格式。 -
《Language models are unsupervised multitask learners》
通过将一些输入作为前缀馈入模型,然后对输出进行自回归采样,来评估语言模型的zero-shot learning
的能力。例如,自动化摘要是通过馈入一个文档,后面跟着"TL;DR:"
("too long, didn’t read"
的缩写)的文字,然后通过自回归地解码来预测摘要。我们主要考虑这样的模型:在用单独的解码器生成输出之前,用编码器显式处理
input
。并且我们关注迁移学习而不是zero-shot learning
。 -
最后,
《Unifying question answering text classification via span extraction》
将许多NLP
任务统一为"span extraction"
,其中对应于possible output choices
的文本被附加到input
,模型被训练为:抽取对应于正确choice
的input span
。相比之下,我们的框架也允许生成式任务,如机器翻译和抽象摘要,在这些任务中不可能列举所有
possible output choices
。
-
-
我们能够直接将我们所考虑的所有任务转换成
text-to-text
的格式,但STS-B
除外,它是一个回归任务,目标是预测1
到5
分之间的相似度分数。我们发现这些分数大多以0.2
为增量,所以我们简单地将任何分数四舍五入到最接近的0.2
增量,并将结果转换为数字的字符串表示(例如,浮点数2.57
将被映射为字符串"2.6"
)。在测试时,如果模型输出的字符串对应于
1
到5
之间的数字,我们就将其转换为浮点值。否则,我们就将模型的预测视为不正确。这就有效地将STS-B
回归问题改成了21-class
分类问题。 -
另外,我们还将
Winograd
任务(GLUE
中的WNLI
,Super-GLUE
中的WSC
,以及我们添加到SuperGLUE
中的DPR
数据集)转换成更简单的格式,更适合于text-to-text
框架。Winograd
任务中的样本包括一个包含歧义代词ambiguous pronoun
的文本段落,该代词可能指代段落中的多个名词短语。例如,文本段落"The city councilmen refused the demonstrators a permit because they feared violence."
,其中包含一个歧义代词"they"
,可以指代"city councilmen"
或"demonstrators"
。我们将WNLI
、WSC
、以及DPR
任务转换为text-to-text
问题,通过突出文本段落中的ambiguous pronoun
并要求模型预测其所指的名词。上面提到的例子将被转化为:输入"The city councilmen refused the demonstrators a permit because *they* feared violence."
,模型将被训练来预测target
文本"The city councilmen"
。对于
WSC
来说,样本包含段落、歧义代词、候选名词、以及反映候选代词是否匹配的True/False
标签(忽略任何文章)。我们只对有True
标签的样本进行训练,因为我们不知道具有"False"
标签的样本的正确名词目标。在评估时,如果模型输出中的单词是候选名词短语中的一个子集(或者反之),我们就给它一个"True"
标签,否则就给它一个"False"
标签。这就删除了大约一半的WSC
训练集,但是DPR
数据集增加了大约1000
个代词解析样本。DPR
的样本都有正确的指代名词标注,因此很容易以上述格式使用这个数据集。WNLI
的训练集和验证集与WSC
的训练集有很大的重叠。为了避免验证样本泄露到我们的训练数据中(这是实验部分的多任务实验中的一个特殊问题),我们从来不在WNLI
上训练,也不报告WNLI
验证集的结果。忽略WNLI
验证集上的结果是标准做法,因为它对训练集来说是 "对抗性的",即验证样本都是具有相反标签的训练样本的轻微扰动版本。因此,每当我们报告验证集时(除了特殊说明之外),我们在GLUE
的平均分数中不包括WNLI
。将WNLI
的样本转换为上述的"referent noun prediction"
的变体是比较麻烦的;我们在论文附录B
中描述了这个过程。
26.2 实验
-
我们对新的预训练
objective
、模型架构、未标记数据集等技术进行了经验性的调查,希望能够区分出它们的贡献和意义。我们通过采取合理的
baseline
并一次改变setup
的一个方面来系统地研究这些贡献。这种"coordinate ascent"
的方法可能会错过二阶效应(例如,一些特定的无监督objective
可能在比我们的baseline setting
更大的模型上效果最好),但对我们研究中的所有因素进行组合探索将是非常昂贵的。 -
我们的目标是在一组不同的任务上比较各种不同的方法,同时保持尽可能多的因素固定。为了满足这一目标,在某些情况下,我们并不完全复制现有的方法。
例如,像
BERT
这样的encoder-only
模型被设计为对每个input token
产生一个预测,或对整个输入序列产生一个预测。这使得它们适用于分类任务或span prediction
任务,但不适用于翻译任务或抽象式生成等生成式任务。因此,我们考虑的模型架构没有一个是与BERT
相同的,也没有一个是由encoder-only
组成的架构。相反,我们测试了精神上相似的方法。例如,我们考虑了与
BERT
的"masked language modeling" objective
类似的objective
,我们也考虑了在文本分类任务上与BERT
行为类似的模型架构。
26.2.1 Baseline
-
我们对
baseline
的目标是:要反映典型的现代实践。我们使用一个简单的denoising objective
来预训练一个标准的Transformer
,然后在我们的每个下游任务中分别进行微调。 -
模型:我们使用了
《Attention is all you need》
提出的标准的encoder-decoder Transformer
。虽然许多用于自然语言处理的迁移学习的现代方法使用encoder-only
或decoder-only
,但我们发现:使用标准的encoder-decoder
架构在生成任务和分类任务上都取得了良好的效果。我们在后续实验部分探讨了不同模型架构的性能。我们的
baseline
模型被设计成:encoder
和decoder
各自的大小和配置与BERT_BASE
相似。具体而言:-
encoder
和decoder
都由12
个block
组成,每个block
包括self-attention
、可选的encoder-decoder attention
(这个只有decoder
有)、以及一个前馈神经网络。 -
每个
block
中的前馈神经网络包括一个输出维度为 $ d_\text{ff}=3072 $ 的稠密层,然后是一个ReLU
非线性层和另一个稠密层。另一个稠密层的维度,论文并未直接说明,猜测也是
$ d_\text{ff} = 3072 $ 。 -
所有注意力机制的
"key"
和"value"
矩阵的内部维度为 $ d_\text{kv}=64 $ ,所有注意力机制有12
个头。 -
所有其他子层和
embedding
的维度为 $ d_\text{model} =768 $ 。
总的来说,这导致了一个具有大约
220M
个参数的模型。这大约是BERT_BASE
的参数数量的两倍,因为我们的baseline
模型包含两个stack
而不是一个。对于正则化,我们在模型中任何地方都使用了dropout rate = 0.1
。 -
-
训练:所有的任务都被表述为
text-to-text
的任务。这使我们能够始终使用标准的最大似然进行训练。对于优化,我们使用AdaFactor
。在测试时我们使用贪婪解码,即在每个timestep
选择概率最高的logit
。-
预训练:在微调之前,我们在
C4
上对每个模型进行 $ 2^{19}=524288 $ 步的预训练。我们使用的最大序列长度为512
,batch size = 128
。只要有可能,我们将多个序列 "打包" 到批次的每个条目entry
中,因此我们的batch
大约包含 $ 512\times 128 = 65536 $ 个token
。总的来说,这个batch size
和training step
的数量相当于对 $ 2^\text{35}\simeq 34B $ 个token
进行预训练。这比BERT
和RoBERTa
要少得多,后者使用了大约2.2T
的token
。只使用 $ 2^{35} $ 个token
的结果是合理的计算预算,同时仍然提供了足够的预训练量从而获得可接受的性能。我们在后续实验部分考虑了预训练关于更多training step
的影响。请注意, $ 2^{35} $ 个token
只涵盖了整个C4
数据集的一部分,所以我们在预训练期间从不重复任何数据。在预训练期间,我们使用一个 "逆平方根" 的学习率调度:
$ 1/\sqrt{\max(n,k)} $ ,其中 $ n $ 为当前的training iteration
, $ k $ 为warm-up steps
(在我们的所有实验中设置为 $ 10^4 $ )。 这为前 $ 10^4 $ 步设定了一个恒定的学习率0.01
,然后学习率呈指数衰减直到预训练结束。我们还试验了使用三角学习率,这产生了稍好的结果,但需要提前知道总的training steps
。由于我们将在一些实验中改变training steps
的数量,我们选择了更通用的逆平方根调度。 -
微调:我们的模型在所有的任务中都被微调为
$ 2^{18} = 262144 $ 步。这个值是在high-resource
任务(即有大数据集的任务)和low-resource
任务(小数据集)之间的权衡,前者从额外的微调中获益、后者则迅速过拟合。在微调期间,我们继续使用bath size = 128
,序列长度为512
(即每个batch
$ 2^{16}=65536 $ 个token
)。在微调时,我们使用0.001
的恒定学习率。我们每5000
步保存一个checkpoint
,并报告与最佳验证性能相对应的model checkpoint
的结果。对于在多个任务上微调的模型,我们为每个任务独立选择best checkpoint
。对于所有的实验,除非特别说明,我们报告验证集结果从而避免模型选择以及报告测试集结果。
预训练的
training step
数量是微调期间的两倍。此外,预训练的学习率从1.0
指数下降到0.001381
,然而微调的学习率固定为一个很低的值0.001
。 -
-
Vocabulary
:我们使用SentencePiece
将文本编码为WordPiece tokens
。在所有的实验中,我们使用了32,000
个wordpieces
的词表。由于我们最终在English to German, French, Romanian
的翻译上对我们的模型进行了微调,所以我们还要求我们的词表涵盖这些非英语语言。为了解决这个问题,我们将C4
中使用的Common Crawl
中的页面分类为德语、法语、以及罗马尼亚语。然后,我们在英语、德语、法语、罗马尼亚语的比例为10:1:1:1
的数据混合体上训练我们的SentencePiece
模型。这个词表在我们模型的输入和输出中都是共享的。请注意,我们的词表使得我们的模型只能处理预先确定的、固定的语言集合。 -
无监督
objective
:受BERT
的"masked language modeling" objective
和"word dropout"
正则化技术的启发,我们设计了一个objective
,随机采样然后丢弃输入序列中15%
的token
。所有dropped-out tokens
的consecutive spans
都被单个哨兵token
所取代。每个哨兵token
都被分配一个token ID
,该ID
对序列来说是唯一的。哨兵token ID
是被添加到我们的词表中的special token
,不对应于任何wordpiece
。target
序列的组成方式如下:所有的dropped-out spans
、间隔以对应的哨兵token
、最后加上一个哨兵token
来标记target
序列结束。我们选择掩码
consecutive spans of tokens
,并且仅预测dropped-out tokens
,是为了减少预训练的计算成本。我们在实验部分对预训练objective
进行了深入研究。下图给出了一个例子:-
原始的文本为
"Thank you for inviting me to your party last week."
。 -
处理之后,输入为
"Thank you <X> me to your party <Y> week."
,target
为"<X> for inviting <Y> last <Z>"
。
注意:这里每一个哨兵
token
都是序列中唯一的(不必要求全局唯一),它们起到 “锚” 的作用,使得能够根据targets
和inputs
来恢复原始输入。假设哨兵token
都是[MASK]
(即,BERT
的做法),那么模型无法知晓"last"
是对应第一个drop
位置、还是第二个drop
位置。是否要求每个序列中,哨兵
token
出现的次序相同?比如,序列S1
中哨兵token
出现的次序为<X><Y><Z>
,那么序列S2
中哨兵token
出现的次序是否可以为<Z><X><Y>
? -
-
Baseline
性能:我们介绍了使用上述baseline
实验程序的结果,以了解在我们这组下游任务中可以期待什么样的性能。理想情况下,我们会在研究中多次重复每个实验,以获得我们结果的置信区间。不幸的是,由于我们运行了大量的实验,这将是非常昂贵的。作为一个更便宜的选择,我们从头开始训练我们的baseline
模型10
次(即用不同的随机初始化和数据集混洗),并假设这些runs of base model
的方差也适用于每个实验变体。另外,我们还度量了在没有预训练的情况下,在所有下游任务中训练我们的模型 $ 2^{18} $ 步(与我们用于微调的数量相同)的性能。这让我们了解到在baseline setting
下,预训练对我们的模型有多大的好处。在正文中报告结果时,我们只报告了所有
benckmark scores
的一个子集,从而节省空间和方便解释:-
对于
GLUE
和SuperGLUE
,我们仅报告了所有子任务的平均得分(如官方所规定的)。 -
对于所有的翻译任务,我们报告由
SacreBLEU v1.3.0
提供的BLEU
分数,其中包括"exp"
平滑和"intl"
tokenization
。我们将WMT English to German, English to French, English to Romanian
的分数分别称为EnDe, EnFr, EnRo
。 -
对于
CNN/Daily Mail
,我们发现模型在ROUGE-1-F, ROUGE-2-F, ROUGE-L-F
指标上的表现高度相关,因此我们单独报告ROUGE-2-F
得分。 -
同样,对于
SQuAD
,我们发现"exact match"
(简称EM
)和"F1"
得分的表现高度相关,因此我们只报告"exact match"
得分。我们在论文附录E
的Table 16
中提供了所有实验在每个任务上取得的每一个分数。
我们的结果表的格式是,每一行对应于一个特定的实验配置,每一列给出每个
benchmark
的分数。我们将在大多数表格中包括baseline
配置的平均性能。凡是baseline
配置出现的地方,我们都会用 "★" 来标记(如Table 1
的第一行)。我们还将用黑体标出特定实验中在任何最大(最好)分数的两个标准差之内的分数(包括最大分数自身)。baseline
结果如下表所示:-
总的来说,我们的结果与现有的类似规模的模型相媲美。例如,
BERT_BASE
在SQuAD
上取得了80.8
的exact match
分数,在MNLI-matched
上取得了84.4
的准确率,而我们分别取得了80.88
和84.24
(见Table 16
)。请注意,我们不能直接将我们的
baseline
与BERT_BASE
进行比较,因为我们的是一个encoder-decoder
模型,而且预训练的步数大约是BERT_BASE
的1/4
。 -
不出所料,我们发现预训练在几乎所有的
benchmark
中都提供了显著的增益。唯一的例外是WMT English to French
翻译,它是一个足够大的数据集,预训练的增益是很微小的。我们在实验中加入了这项任务,从而测试迁移学习在high-resource
条件下的行为。由于我们执行
early stopping
并选择best-performing checkpoint
,我们的baseline
和"no pre-training"
之间的巨大差异强调了预训练在数据有限的任务上有多大的改善。虽然我们在本文中没有显式地衡量数据效率的提高,但我们强调这是迁移学习范式的主要好处之一。
至于
inter-run
方差,我们发现对于大多数任务来说,标准差小于任务baseline
得分的1%
。这一规则的例外情况包括CoLA, CB, COPA
,它们都是GLUE
和SuperGLUE
基准的low-resource
任务。例如,在CB
上,我们的baseline model
的平均F1
得分是91.22
、标准差是3.237
(见Table 16
),这可能部分是由于CB
的验证集只包含56
个样本。请注意,GLUE
和SuperGLUE
的分数是组成每个benchmark
的所有任务的平均分数来计算的。因此,我们警告说,单独使用GLUE
和SuperGLUE
分数时,CoLA, CB, COPA
的高inter-run
方差会使模型难以比较。 -
-
论文附录
E
的Table 16
:
26.2.2 架构
-
这里我们回顾并比较针对
encoder-decoder
架构的不同变体。 -
模型架构:不同架构的一个主要区别因素是,模型中不同注意力机制所使用的
"mask"
。回顾一下,Transformer
中的自注意力操作将一个序列作为输入,并输出一个相同长度的新序列。输出序列的每个条目是通过计算输入序列的条目的加权平均而产生的。具体而言,令 $ \mathbf{\vec y}_i $ 为输出序列的第 $ i $ 个元素, $ \mathbf{\vec x}_j $ 为输入序列的第 $ j $ 个元素,则 $ \mathbf{\vec y}_i = \sum_j w_{i,j} \mathbf{\vec x}_j $ ,其中 $ w_{i,j}\in \mathbb R $ 为自注意力机制产生的标量权重,且 $ w_{i,j} $ 是 $ \mathbf{\vec x}_i $ 和 $ \mathbf{\vec x}_j $ 的函数。然后,
attention mask
被用来将某些权重归零,从而限制在给定的output timestep
中可以关注哪些输入条目。我们将考虑的mask
的图示如下图所示。例如,causal mask
(Figure 3
,中间)当满足 $ j\gt i $ 时将 $ w_{i,j} $ 置为零。-
我们考虑的第一个模型结构是一个
encoder-decoder Transformer
,它由two layer stacks
组成:-
编码器,它被馈入一个输入序列。
编码器使用一个
"fully-visible"
的attention mask
,这允许自注意力机制在产生每个输出条目时注意任何输入条目。 -
解码器,它生成一个新的输出序列。
解码器使用
"causal"
的attention mask
,这阻止了模型在生成第 $ i $ 个输出条目时关注 $ j>i $ 的输入条目。这使得在训练期间,模型在生成输出时不能"see into the future"
。
Figure 4
的左侧显示了这种结构变体的示意图。标准的
encoder-decoder
的decoder
的输入有两个:来自于encoder
、来自于target
序列。而这里的decoder
的输入其实也有两个,只是因为绘图的关系,这里并没有绘制出来而已。此外,这里只是把
decoder
画在encoder
上方而已,也可以把decoder
画在encoder
的右侧。 -
-
Transformer decoder
可以作为一个语言模型language model: LM
,这构成了我们考虑的第二个模型结构,如下图中间部分所示。语言模型通常被用于压缩或序列生成。然而,它们也可以在
text-to-text
框架中使用,只需将inputs
序列和targets
序列拼接起来即可。例如,考虑English to German
翻译。如果我们有一个input
句子"That is good."
和target
句子"Das ist gut."
,那么拼接后的输入序列为"translate English to German: That is good. target: Das ist gut."
。 我们将简单地训练模型从而对拼接后的输入序列进行next-step prediction
。loss
函数是仅考虑target
部分还是考虑input + target
整体?理论上讲,我们需要计算的是 $ p(\text{target}\mid \text{input}) $ ,因此只需要考虑target
部分。但是看这里的描述,感觉是 $ p(\text{input,target}) $ ,同时考虑了input
和target
。可以通过实验来评估这里。此外,如果建模了
$ p(\text{input,target}) $ ,那么模型不仅需要准确地建模 $ p(\text{target}\mid \text{input}) $ ,还需要准确地建模 $ p(\text{input}) $ 。而建模 $ p(\text{input}) $ 意味着模型除了监督的目标任务之外(即 $ p(\text{target}\mid \text{input}) $ ),还考虑对input
文本进行无监督的 ”预训练“。此外,实验部分表面,
decoder-only
的表现要比Enc-Dec
更差,有可能是因为这里loss
函数考虑了 $ p(\text{input}) $ 的原因。如果屏蔽掉 $ p(\text{input}) $ 的损失,是否会好一点?如果我们想获得模型对这个例子的预测,那么我们将序列
"translate English to German: That is good. target:"
馈入模型,然后要求模型自回归地生成剩余部分。通过这种方式,该模型可以预测一个给定输入序列的输出序列。 -
在
text-to-text setting
中使用语言模型的一个基础的和经常被引用的缺点是:causal masking
迫使模型在生成第 $ i $ 个条目的representation
时关注 $ j考虑前面的
English to German
翻译的例子。我们需要提供一个prefix
(也叫做context
)序列、以及一个target
序列。在causal masking
的情况下,prefix
中第 $ i $ 个条目的representation
只能取决于prefix
中前面的条目。而这是不必要的限制。在
Transformer-based
的语言模型中,只需改变masking pattern
就可以避免这个问题。在prefix
序列部分,我们不使用causal mask
而是使用fully-visible mask
,如下图右侧所示。我们称这种模式为prefix LM
。在上面提到的
English to German
翻译的例子中,fully-visible mask
将被应用于前缀"translate English to German: That is good. target:"
,causal mask
将用于预测目标"Das ist gut."
。在
text-to-text
框架中使用prefix LM
最初是由《Generating Wikipedia by summarizing long sequences》
所提出。最近,《Unified language model pre-training for natural language understanding generation》
表明:这种架构在各种text-to-text
任务上是有效的。这个架构类似于一个encoder-decoder
模型,其参数在编码器和解码器之间共享,并且encoder-decoder
的注意力被整个input
序列和target
序列的full attention
所取代。
如果
Encoder
和Decoder
的宽度相同,那么T5
(下图中的左侧)长得很像一个Encoder
,只是它前50%
的层是全连接的、后50%
的层不包含 “未来的连接”。 -
-
我们注意到,对于分类任务,当遵循我们的
text-to-text
框架时,prefix LM
架构与BERT
非常相似。对于分类任务,
prefix LM
架构的label
只有一个单词代表类别,如Figure 4
右图所示,此时退化为:输入为x1, x2, x3, y1
、输出为x2, x3, y1, '.'
,而且decoder
之间是全连接的。这和
BERT
非常类似,但是二者之间存在:-
BERT
的objective
是恢复被masked
的单词。因此输入为x1, x2, x3, [mask], "."
,然后仅考虑[mask]
上的输出并进行预测。 -
而
prefix LM
是自回归模型,需要预测每个位置的next token
。
为了了解原因,考虑
MNLI benchmark
中的一个例子,前提premise
是"I hate pigeons."
,假设hypothesis
是"My feelings towards pigeons are filled with animosity."
,而正确的标签是"entailment"
。要把这个例子馈入语言模型,我们要把它转化为"mnli premise: I hate pigeons. hypothesis: My feelings towards pigeons are filled with animosity. target: entailment"
。其中,fully-visible prefix
对应于"mnli premise: I hate pigeons. hypothesis: My feelings towards pigeons are filled with animosity. target:"
,这可以被视为是类似于BERT
中使用的"classification" token
。因此,我们的模型将对整个input
有full visibility
,然后通过输出"entailment"
这个单词来完成分类任务。给定task prefix
的条件下,该模型很容易学会输出有效的class label
。因此,
prefix LM
和BERT
架构之间的主要区别是:在prefix LM
中,classifier
被简单地集成到Transformer decoder
的输出层。 -
-
不同模型架构的比较:为了比较这些架构变体,我们希望每个模型都能以某种有意义的方式是相等
equivalent
的,例如,两个模型具有相同数量的参数、或者对于给定的(input-seq, target-seq) pair
时两个模型具有相同的计算量。不幸的是,不可能同时根据这两个标准来比较一个encoder-decoder
模型和一个language model
架构。要知道为什么,首先要注意:一个具有
L + L
层的encoder-decoder
模型(指的是编码器L
层且解码器L
层)与一个具有2L
层的语言模型的参数数量大致相同。然而,具有L + L
层的encoder-decoder
模型的计算成本将与只有L
层的语言模型大致相同。 这是因为:语言模型中的L
层必须同时应用于输入序列和输出序列;而encoder-decoder
模型中,编码器只应用于输入序列、解码器只应用于输出序列。注意,这里的参数数量相等、计算量相等仅仅是近似的:由于
encoder-decoder attention
的存在,decoder
中还存在一些额外的参数;attention layer
中也存在一些计算成本,这些成本与序列长度呈二次方的关系。然而在实践中,我们观察到L
层语言模型与L + L
层的encoder-decoder
模型的step times
几乎相同,这表明二者计算成本大致相当。此外,对于我们考虑的模型规模,encoder-decoder attention
层的参数数量约为总参数数的10%
,因此我们做了一个简化的假设,即L + L
层的encoder-decoder
模型的参数数量与2L
层语言模型相同。为了提供一个合理的比较手段,我们考虑了
encoder-decoder
模型的多种配置。我们将把BERT_BASE
的层数和参数数量分别称为L
和P
。我们将用M
来指代L + L
层的encoder-decoder
模型(或只用L
层decoder-only
模型,即语言模型)处理一个给定的input-target pair
所需的FLOPs
数量。总的来说,我们将比较:-
一个
L + L
层的encoder-decoder
模型,模型有2P
个参数,计算成本为M FLOPs
。 -
一个
L + L
层的encoder-decoder
模型,但是参数在编码器和解码器之间共享,导致P
个参数和M FLOPs
计算成本。 -
一个
L/2 + L/2
层的encoder-decoder
模型,模型有P
个参数,计算成本为M/2 FLOPs
。 -
一个
L
层的decoder-only prefix LM
模型,模型有P
个参数,计算成本为M FLOPs
。 -
一个
L
层的LM
模型,模型有P
个参数,计算成本为M FLOPs
。
注:这里没有考虑
encoder-only
模型,因为它无法执行文本生成任务。 -
-
objective
函数:我们对比了basic language modeling objective
、our baseline denoising objective
。我们包括language modeling objective
,因为它历来被用作预训练objective
,并且它自然适合我们考虑的语言模型架构。-
对于
encoder-decoder model
和prefix LM
,我们从未标记的数据集中抽取一个span
的文本,并选择一个随机点,将其分成prefix
部分和target
部分。 -
对于标准语言模型,我们训练该模型来预测从头到尾的整个
span
。
denoising objective
就是MLM
的objective
,language modeling objective
就是LM
的objective
。 -
-
结果:每个架构所取得的分数都如下表所示,可以看到:
-
对于所有的任务,具有
denoising objective
的encoder-decoder
架构表现最好。这个变体具有最高的参数数量(2P
),但计算成本与仅有P
个参数的decoder-only
模型相同。 -
令人惊讶的是,在编码器和解码器之间共享参数的表现几乎一样好。
同时进行的工作
ALBERT
也发现:在Transformer block
之间共享参数可以是降低总参数数的有效手段,而不会牺牲很多性能。 -
将编码器和解码器的层数减半,明显地损害了性能。
-
共享参数的
encoder-decoder
的性能优于decoder-only prefix LM
,这表明增加一个显式的encoder-decoder attention
是有益的。 -
最后,我们证实了一个广泛存在的概念:即与
language modeling objective
相比,使用denoising objective
总能带来更好的下游任务表现。
-
26.2.3 无监督 Objective
-
总体而言,我们所有的
objective
都会接受一个关于token ID
的序列,这个序列对应于来自未标记文本数据集中的一个tokenized
的span of text
。token
序列被处理从而产生一个(被破坏的)input
序列和一个相应的target
序列。然后,像往常一样用maximum likelihood
训练模型以预测target
序列。这些
objective
的例子如下表所示。例如:原始的文本是
"Thank you for inviting me to your party last week."
-
Prefix LM
:编码器的输入为"Thank you for inviting"
,解码器的输出为"me to your party last week."
。 -
BERT-style
:编码器的输入为"Thank you for <M> <M> to your party apple week."
,解码器的输出为"Thank you for inviting me to your party last week."
。注意,这里除了
<M>
替换之外,还替换了"last"
为随机的token
(这里为"apple"
)。这里和
BERT
不同。BERT
是encoder-only
模型,仅预测被掩码的token
。并且BERT
中不同token
之间是独立地被掩码。而这里考虑预测整个原始序列,而且每次掩码整个span
。 -
Deshuffling
:编码器的输入为"party me for you to . last you inviting week Thank"
,解码器的输出为"Thank you for inviting me to your party last week."
。 -
MASS-style
:编码器的输入为"Than you <M> <M> me to your party <M> week."
,解码器的输出为"Thank you for inviting me to your party last week."
。它和
BERT-style
很像,然而BERT-style
中会执行token
的随机替代,而这里没有。 -
iid.noise, replace spans
:编码器的输入为"Thank you <X> me to your party <Y> week."
,解码器的输出为"<X> for inviting <Y> last <Z>"
。iid.noise
指的是每个token
的掩码事件是相互独立的。此外,对于连续的masked token
被合并成masked span
。它就是论文baseline
用到的objective
。 -
iid.noise, drop tokens
:编码器的输入为"Thank you me to your party week."
,解码器的输出为"for inviting last"
。 -
random spans
:编码器的输入为"Thank you <X> to <Y> week."
,解码器的输出为"<X> for inviting me <Y> your party last <Z>"
。它和
iid.noise, replace spans
的区别在于:这里直接针对span
进行掩码(而不是针对token
),其中掩码的位置、span
长度都是随机的。
-
-
不同的
High-Level
方法:首先,我们比较了三种技术,它们受到常用objective
的启发,但在方法上有很大不同:-
"prefix language modeling" objective
:这种技术将a span of text
分成两部分,一部分作为编码器的输入序列,另一部分作为由解码器预测的target
序列。 -
"masked language modeling" objective
启发的objective
:"masked language modeling"
需要a span of text
,并破坏了15%
的token
。在所有corrupted tokens
中,90%
被替换成一个特殊的mask token
、10%
被替换成一个随机token
。由于
BERT
是一个encoder-only
模型,它在预训练期间的目标是在编码器的输出端重建masked tokens
。在encoder-decoder
的情况下,我们只是将完整的原始序列作为target
。请注意,这与我们的baseline objective
不同,在baseline objective
中只使用corrupted tokens
作为target
;我们在实验中比较了这两种方法。 -
deshuffling objective
:这种方法需要一个token
序列,对其进行混洗,然后使用完整的原始序列作为target
。
Table 3
的前三行提供了这三种方法的inputs
和targets
的例子。这三个objectives
的性能如下表所示。可以发现:-
总的来说,
BERT-style objective
表现最好,尽管prefix language modeling objective
在翻译任务上达到了类似的性能。事实上,BERT objective
的动机是为了超越基于语言模型的预训练。 -
deshuffling objective
的表现比prefix language modeling objective
和BERT-style objective
都要差很多。
-
-
简化
BERT Objective
:基于上一节的结果,我们现在将重点探索对BERT-style denoising objective
的修改。这个objective
最初是作为一个预训练技术而提出的,用于为分类和span prediction
而训练的encoder-only
模型。因此,有可能对其进行修改,使其在我们的encoder-decoder text-to-text setup
中表现得更好或更有效。-
首先,我们考虑
BERT-style objective
的一个简单变体:不包括random token
而仅有mask token
(占所有token
中的比例为15%
)。MASS
使用了一个类似的masking objective
,所以我们把这个变体称为"MASS-style" objective
。 -
其次,我们有兴趣看看是否有可能避免预测完整的原始序列,因为这需要解码器在长序列上的
self-attention
。我们考虑了两种策略:-
首先,我们不是用一组
mask token
来一一对应地替换每个corrupted token
,而是用单个unique mask token
来替换整个区间的corrupted tokens
。然后,我们将所有的corrupted span
、以及所有的unique mask token
的拼接作为target
序列。这就是我们在
baseline
中使用的pre-training objective
,如Table 3
中的第五行所示(即iid.noise, replace spans
)。 -
其次,我们还考虑了一个变体:仅仅从输入序列中完全删除
corrupted tokens
,而让模型按顺序重建dropped tokens
。其中,我们将dropped tokens
的拼接作为target
序列,如Table 3
中的第六行所示(即iid.noise, drop tokens
)。
-
下表展示了原始的
BERT-style objective
和这三种objective
的比较结果。可以看到:-
在我们的
setting
中,所有这些变体的表现都很相似。唯一的例外是,由于
dropping corrupted tokens
在CoLA
上的得分明显较高(60.04
,而我们的baseline average
为53.84
,见Table 16
),所以dropping corrupted tokens
在GLUE
得分上产生了小的改善。这可能是由于CoLA
涉及到对一个给定的句子在语法和句法上是否可以接受进行分类,而能够确定什么时候缺少tokens
与detecting acceptability
密切相关。 -
然而,在
SuperGLUE
上,dropping tokens
的表现比replacing tokens
的表现要更差。 -
replace corrupted spans
和drop corrupted spans
都有潜在的吸引力,因为它们使target
序列更短,从而使训练更快。
-
-
变化的
Corruption Rate
:到目前为止,我们一直在破坏15%
的token
,这是BERT
中使用的值。同样,由于我们的text-to-text
框架与BERT
的不同,我们有兴趣看看不同的破坏率corruption rate
是否对我们更有效。我们在下表中比较了10%, 15%, 25%, 50%
的破坏率。可以看到:-
总体而言,我们发现破坏率对模型的性能影响有限。唯一的例外是,我们考虑的最大破坏率(
50%
)导致GLUE
和SQuAD
的性能明显下降。 -
使用更大的破坏率也会导致更长的
targets
序列,这有可能会减慢训练速度。在
encoer-decoder
架构中,更小的破坏率导致更长的encoder-input
和更短的decoder-input
;更大的破坏率导致更短的encoder-input
和更长的decoder-input
。在序列生成任务中,生成一个token
的计算成本较高(在decoder
侧),而编码一个token
的计算成本较低(在encoder
侧)。
基于这些结果和
BERT
的历史先例,我们将在未来使用15%
的破坏率。 -
-
Corrupting Spans
:我们现在转向通过预测更短的targets
序列来加速训练。到目前为止,我们所使用的方法是对每个input token
进行独立同分布地判断,以决定是否对其进行破坏。当多个consecutive tokens
被破坏时,它们被视为一个"span"
,并使用单个unique mask token
来替换整个span
。用单个token
替换整个span
的结果是:未标记的文本数据被处理成较短的序列。由于我们使用的是一个
i.i.d. corruption strategy
,所以并不总是有大量的corrupted tokens
连续出现。因此,我们可以通过专门破坏spans of tokens
,而不是以i.i.d.
的方式破坏单个tokens
来获得额外的加速。corrupting spans
以前也被认为是BERT
的pre-training objective
,SpanBERT
发现它可以提高性能。为了测试这个想法,我们考虑一个
objective
,它专门破坏连续的、随机间隔的spans of tokens
,即Table3
中的random spans objective
。这个objective
可以通过corrupted tokens
的比例、以及corrupted spans
的总数进行参数化。然后随机选择span length
从而满足这些指定的参数。例如,如果我们正在处理一个有500
个token
的序列,并且我们指定15%
的tokens
应该被破坏,并且总共应该有25
个span
,那么corrupted tokens
总数将是500*0.15=75
,平均span length
将是75/25=3
。我们在下表中比较了
span-corruption objective
和i.i.d-corruption objective
。我们在所有情况下使用15%
的破坏率,并使用2, 3, 5, 10
的平均span length
进行比较。可以看到:-
这些
objective
之间的差异有限,尽管在某些情况下,平均span length
为10
的版本略微低于其他值。 -
在大多数
non-translation benchmarks
上,使用3
的平均span length
略微(但明显)优于i.i.d. objective
。
-
-
讨论:下图显示了我们在探索无监督
objective
期间所做选择的流程图。-
总体而言,对于预训练而言,我们观察到的最显著的性能差异是
denoising objective
优于language modeling
和deshuffling
。 -
在我们探索的
denoising objective
的众多变体中,我们没有观察到明显的差异。然而,不同的
objective
会导致不同的序列长度,从而导致不同的训练速度。这意味着,在我们这里考虑的denoising objective
中的选择,主要应根据其计算成本来进行(即,尽量选择target
序列较短的objective
)。 -
我们的结果还表明,对于我们所考虑的任务和模型来说,对类似于我们这里所考虑的
objective
的额外探索可能不会导致显著的收益。
-
26.2.4 预训练数据集
-
和
unsupervised objective
一样,预训练数据集本身也是迁移学习pipeline
的一个重要组成部分。然而,与objective
和benchmars
不同的是,新的预训练数据集通常不被视为重大贡献,而且通常不会与预训练模型和代码一起发布。相反,它们通常是在介绍新方法、或新模型的过程中被引入。因此,不同的预训练数据集的比较相对较少,也缺乏用于预训练的 "标准" 数据集。为了更深入地探究预训练数据集对性能的影响,在本节中我们比较了我们的C4
数据集的变体、以及其他潜在的预训练数据源。我们将所有的C4
数据集的变体作为TensorFlow Datasets
的一部分发布。 -
未标记数据集:在创建
C4
数据集时,我们开发了各种启发式方法来过滤来自Common Crawl
的web-extracted
文本。我们感兴趣的是:这种过滤是否提升了下游任务的性能。此外,我们也比较了其它过滤方法、以及其他常见的预训练数据集。为此,我们比较了我们的baseline
模型在以下数据集上预训练后的表现:-
C4
:它作为baseline
,制作方法如前文所述。 -
Unfiltered C4
:未被过滤的C4
的替代版本。请注意,我们仍然使用langdetect
来抽取英文文本。因此,我们的"unfiltered"
变体仍然包含一些过滤。 -
RealNews-like
:我们通过额外过滤C4
来生成另一个未标记的数据集,只包括来自"RealNews"
数据集(《Defending against neural fake news》
)中使用的一个domain
的内容。 -
WebText-like
:WebText
数据集只使用了提交给Reddit
并获得至少3
分的网页内容。提交给Reddit
的网页的分数是根据赞同(upvote
)或反对(downvote
)该网页的用户比例计算的。使用Reddit
分数作为质量信号背后的想法是:该网站的用户只会对高质量的文本内容进行投票。为了生成一个可比较的数据集,我们首先尝试从
C4
中删除所有不是来自OpenWebText
工作所编制的列表中的URL
的内容。然而,这导致了相对较少的内容(只有大约2GB
),因为大多数网页从未出现在Reddit
上。回顾一下,C4
是基于一个月的Common Crawl
数据而创建的。为了避免使用一个过小的数据集,我们因此从Common Crawl
下载了2018
年8
月至2019
年7
月的12
个月的数据,然后应用针对C4
的启发式过滤,然后应用Reddit
过滤器。这产生了一个17GB
的WebText-like
数据集,其大小与原始的40GB WebText
数据集是可比的。 -
Wikipedia
:我们使用来自TensorFlow Datasets
的English Wikipedia
文本数据,其中省略了文章中的任何markup
或reference
章节段落。 -
Wikipedia + Toronto Books Corpus
:使用Wikipedia
的预训练数据的一个缺点是,它只代表自然文本的一个可能的领域(百科全书文章)。为了缓解这一问题,BERT
将来自Wikipedia
的数据与Toronto Books Corpus : TBC
相结合。TBC
包含从电子书中抽取的文本,这代表了不同领域的自然语言。BERT
的普及使得Wikipedia + TBC
的组合被用于许多后续的工作中。
在这些数据集上进行预训练后取得的结果如下表所示。
-
第一个明显的收获是,从
C4
中移除启发式过滤会统一降低性能,并使未过滤的变体在每个任务中表现最差。 -
除此之外,我们发现在某些情况下,具有更受限领域的预训练数据集的表现优于多样化的
C4
数据集。例如:-
使用
Wikipedia + TBC
语料库产生了73.24
分的SuperGLUE
分数,超过了我们的C4
数据集的71.36
。这几乎完全归功于MultiRC
的Exact Match
得分从25.78
(C4 baseline
)提升到50.93
(Wikipedia + TBC
,见Table 16
所示)。MultiRC
是一个阅读理解数据集,其最大的数据来源来自于小说书籍,这正是TBC
所涵盖的领域。 -
同样,使用
RealNews-like
的数据集进行预训练,使ReCoRD
的Exact Match
得分从68.16
提高到73.72
。ReCoRD
是一个在新闻文章上衡量阅读理解的数据集。 -
作为最后一个例子,使用
Wikipedia
的数据在SQuAD
上产生了明显的(但不那么引人注目)的收益。SQuAD
是一个问答数据集,其段落来源自Wikipedia
。是否有数据泄露问题?
SQuAD
和Wikipedia
数据集都来自同一个地方。但是作者并未说明。
在之前的工作中也有类似的观察,例如
《SciBERT: A pretrained language model for scientific text》
发现,在research papers
的文本上对BERT
进行预训练,提高了其在科学任务上的表现。这些发现背后的主要教训是:对
in-domain
未标记数据的预训练可以提高下游任务的性能。RoBERTa
还观察到:在一个更多样化的数据集上进行预训练,在下游任务上产生了改进。这一观察也激励了自然语言处理在domain adaptation
的平行研究方向。“更多样化的数据集“ 意味着
out-domain
,而本文的结论是in-domain
。既然二者都能提高下游任务的性能,是否意味着只要增加数据规模即可,而无需关心是in-domain
还是out-domain
?当然,噪音数据除外,增加更多的噪音还会损害任务的性能。 -
-
只在单一领域进行预训练的一个缺点是,所得到的数据集往往小得多。例如,
WebText-like
变体表现与C4
数据集一样好甚至更好,但Reddit-based filtering
产生的数据集比C4
小约40
倍,尽管它基于Common Crawl
的12
倍的数据。数据集小很多并不一定意味着是缺点。如果数据集更小,但是效果相当,那么这意味着节省了预训练的时间成本和硬件成本。
请注意,在我们的
baseline setting
中,我们只对 $ 2^{35} \simeq 34B $ 个token
进行预训练,这只比我们考虑的最小的预训练数据集大8
倍左右。我们将在下一节研究在什么时候使用一个更小的预训练数据集会带来问题。假设平均每个
token
为四个字符占据四个字节,那么34B
大约136GB
,是16GB
的8.5
倍。由于C4
数据集是745GB
,这表明C4
的预训练甚至不足一个epoch
。
-
-
预训练数据集的规模:我们用来创建
C4
的pipeline
被设计为能够创建非常大的预训练数据集。有了这么多的数据,我们就可以在不重复样本的情况下对模型进行预训练。目前还不清楚在预训练期间重复样本对下游性能是有帮助还是有害,因为我们的pre-training objective
本身就是随机的,可以帮助防止模型多次看到完全相同的数据。为了测试未标记数据集规模的影响,我们在人为截断的
C4
版本上预训练了我们的baseline
模型。回顾一下,我们在 $ 2^{35}\simeq 34B $ 个token
(C4
总规模的一小部分)上预训练我们的baseline
模型。我们考虑在由 $ 2^{29}, 2^{27}, 2^{25}, 2^{23} $ 个token
组成的C4
的截断变体上进行训练。这些规模对应于在预训练过程中分别重复数据集64, 256, 1024, 4096
次(从而确保每个预训练的总token
预算是固定的)。由此产生的下游性能如下表所示(注意,这里
Full dataset
指的并不是完成的C4
数据集,而是34B
个token
的截断的C4
数据集):-
正如预期的那样,性能随着数据集的缩小而下降。我们怀疑这可能是由于这个事实:模型开始记忆预训练数据集。
为了衡量这是否属实,我们在
Figure 6
中绘制了每个数据集规模的训练损失。事实上,随着预训练数据集规模的缩小,模型的训练损失明显变小,这表明可能存在记忆现象。《Cloze-driven pretraining of self-attention networks》
同样观察到:截断预训练数据集的规模会降低下游的任务表现。 -
当预训练数据集只重复
64
次时,这些影响是有限的。这表明,一定数量的重复预训练数据可能不会造成伤害。然而,考虑到额外的预训练数据可能是有益的(在后面的实验将展示这一点),而且获得额外的未标记数据是廉价和容易的,我们建议尽可能地使用大的预训练数据集。 -
这种影响对于较大的模型规模来说可能更加明显,也就是说,较大的模型可能更容易对较小的预训练数据集过拟合。
-
26.2.5 训练策略
-
到目前为止,我们已经考虑了这样的
setting
:模型的所有参数都在无监督任务上进行预训练,然后再在各个监督任务上进行微调。在本节中,我们将比较不同的微调方案、以及在多个任务上同时训练模型的方法。 -
微调方法:有人认为,对模型的所有参数进行微调会导致不理想的结果,特别是在
low-resource
任务上(《To tune or not to tune? adapting pretrained representations to diverse tasks》
)。早期关于文本分类任务的迁移学习的结果主张只微调一个小分类器的参数,该分类器被馈入由fixed pre-trained model
所产生的sentence embedding
。这种方法不太适用于我们的encoder-decoder
模型,因为整个解码器必须被训练成针对给定的任务输出target sequences
。相反,我们专注于两种替代的微调方法,这些方法只更新我们的encoder-decoder
模型的参数子集。-
第一种微调方法是
"adapter layers"
(《Parameter-efficient transfer learning for NLP》
、《Simple, scalable adaptation for neural machine translation》
),其动机是为了在微调时保持大部分原始模型是固定的。adapter layers
是额外的dense-ReLU-dense blocks
(即,new feed-forward network
) ,在Transformer
的每个block
中的每个已有的feed-forward networks
之后添加。这些新的new feed-forward networks
被设计成使其输出维度与输入相匹配。这使得它们可以被插入到网络中,而无需对结构或参数进行额外的改变。假设
Transformer
中FFN
的输出为1024
维,那么可以添加一个new FFN
,其输入维度为1024
维、中间隐层维度为 $ d $ 、输出维度为1024
维。它的原理是:
pretrained model
已经学到了良好的representation
,而微调期间adapter layer
负责将新的数据投影到这个representation space
,而不是让pretrained model
去学习新的representation space
。即:数据适配模型,而不是模型适配数据。在进行微调时,只有
adapter layer
和layer normalization
参数被更新。这种方法的主要超参数是new feed-forward network
的内部维度 $ d $ ,它改变了添加到模型中的新参数数量。我们对 $ d $ 的各种值进行了实验。 -
第二种微调方法是
"gradual unfreezing"
(《Universal language model fine-tuning for text classification》
)。在gradual unfreezing
中,随着时间的推移,越来越多的模型参数被微调。gradual unfreezing
最初被应用于由单个stack
组成的语言模型架构。在这种情况下,在微调开始时,只有最后一层的参数被更新;然后在训练了一定数量的updates
后,倒数第二层的参数也被包括在内。以此类推,直到整个网络的参数被微调。为了使这种方法适用于我们的encoder-decoder
模型,我们在编码器和解码器中平行地逐渐解冻各层,在对编码器和解码器都从顶部开始解冻。由于我们的
input embedding matrix
和output classification matrix
的参数是共享的,我们在整个微调过程中更新它们。回顾一下,我们的
baseline
模型中编码器和解码器各由12
层组成,微调了 $ 2^{18} $ 步。因此,我们将微调过程细分为12
组,每组 $ 2^{18}/12 $ 步,并在第n
组中微调从第12-n
层到12
层。我们注意到,
《Universal language model fine-tuning for text classification》
建议在每个epoch
之后再微调一个额外的层。然而,由于我们的监督数据集的大小变化很大,而且我们的一些下游任务实际上是许多任务的混合物(GLUE
和SuperGLUE
),我们反而采用了更简单的策略,即每 $ 2^{18}/12 $ 步之后再微调一个额外的层。
这些微调方法的性能比较见下表所示。对于
adapter layers
,我们使用d=32/ 128/ 512/ 2048
。可以看到:-
类似过去的结果(
《Parameter-efficient transfer learning for NLP》
、《Simple, scalable adaptation for neural machine translation》
),像SQuAD
这样的lower-resource
任务在小的 $ d $ 值下工作得很好,而higher resource
任务需要大的维度来实现合理的性能。这表明,只要维度与任务规模相适应,
adapter layers
可能是一种有前途的技术从而在较少参数上进行微调。注意,在我们的
case
中,我们将GLUE
和SuperGLUE
各自作为一个单一的 "任务",将它们的子数据集拼接起来,所以尽管它们包括一些low-resource
数据集,但合并后的数据集足够大,以至于需要一个大的 $ d $ 值。 -
gradual unfreezing
在所有的任务中都造成了轻微的性能下降,尽管它在微调期间确实提供了一些加速。通过更仔细地调优unfreezing schedule
,可能会得到更好的结果。
第一行
All parameters
指的是微调所有的模型参数。整体而言,
"gradual unfreezing"
的效果要好得多。 -
-
多任务学习:到目前为止,我们一直在单个无监督学习任务上预训练我们的模型,然后在每个下游任务上单独进行微调。另一种被称为 "多任务学习" 的方法,是一次在多个任务上训练模型。这种方法的目标通常是训练一个可以同时执行许多任务的单一模型,也就是说,该模型和它的大部分参数在所有任务中都是共享的。
我们在一定程度上放松了这一目标,而是研究一次对多个任务进行训练的方法,以便最终产生在每个单独任务上表现良好的单独的
parameter settings
。例如,我们可能在许多任务上训练一个单一的模型,但在报告性能时,我们可以为每个任务选择一个不同的checkpoint
。这就放松了多任务学习的框架,与我们迄今为止所考虑的pre-train-then-fine-tune
的方法相比,使其处于更平等的地位。我们还注意到,在我们统一的
text-to-text
框架中,"多任务学习" 仅仅对应于将数据集混合在一起。 由此可见,通过将预训练的无监督任务视为被混合在一起的任务之一(其它的任务还包括下游的监督学习任务),我们仍然使用多任务学习来在未标记数据上训练。相比之下,多任务学习在NLP
中的大多数应用都增加了task-specific
的分类网络,或者为每个任务使用不同的损失函数。正如
《Massively multilingual neural machine translation in the wild: Findings and challenges》
所指出的,多任务学习中一个极其重要的因素是,模型应该在每个任务中训练多少数据。我们的目标是不对模型进行under-train
或over-train
:即,我们希望模型能够看到足够多的来自给定任务的数据使模型能够很好地执行任务,但又不希望看到太多的数据以至于模型记住了训练集。如何准确地设置来自每个任务的数据比例取决于各种因素,包括数据集的大小、学习任务的 "难度"(即模型在能够有效执行任务之前必须看到多少数据)、正则化等等。另一个问题是 "任务干扰" 或 "负转移
negative transfer
"的可能性,即在一项任务上取得良好的表现会阻碍另一项任务的表现。考虑到这些问题,我们首先探索了各种策略从而用于设置来自每个任务的数据比例。《Can you tell me how to get past Sesame Street? Sentence-level pretraining beyond language modeling》
也进行了类似的探索。-
examples-proportional mixing
:模型对一个给定任务的过拟合速度的一个主要因素是任务的数据集规模。因此,设置混合比例mixing proportion
的一个自然方法是按照每个任务的数据集的大小来采样。这相当于将所有任务的数据集串联起来,并从合并后的数据集中随机采样。然而,请注意,我们包括我们的
unsupervised denoising task
,它使用的数据集比其他任务的数据集大几个数量级。因此,如果我们简单地按照每个数据集的大小采样,模型看到的绝大多数数据将是未标记的,它将对所有的监督任务under-train
。即使没有无监督任务,一些任务(如WMT English to French
)也非常大,同样会占据大部分的batch
。为了解决这个问题,我们在计算比例之前对数据集的大小设置了一个人为的
"limit"
。具体而言,如果 $ N $ 个任务的每个数据集中的样本数量是 $ e_n, n \in \{1, \cdots,N\} $ ,那么在训练期间我们将从第 $ m $ 个任务中采样的概率设为 $ r_m = \min(e_m,K)/\sum \min(e_n,K) $ ,其中 $ K $ 是人工设置的数据集规模限制。即,将数据集大小设置一个阈值
$ K $ 从而计算采样概率。注意,并没有对数据集进行真实的截断,这里仅仅是用于计算采样概率。 -
temperature-scaled mixing
:缓解数据集规模之间巨大差异的另一种方法是调整混合率的 "温度"。这种方法被multilingual BERT
使用,以确保模型在low-resource
语言上得到充分的训练。为了实现与温度 $ T $ 的比例关系,我们将每个任务的混合率 $ r_m $ 提高到 $ 1/T $ 次幂(即, $ r_m\leftarrow r_m^{1/T} $ ),并将混合率重新归一化使混合率的总和为1.0
。当 $ T=1 $ 时,这种方法相当于examples-proportional mixing
;随着 $ T $ 的增加,混合率变得更接近于equal mixing
。我们保留了数据集规模的限制
$ K $ (用于在温度缩放前获得 $ r_m $ ),但将其设置为一个比较大的值 $ K=2^{21} $ 。我们使用大的 $ K $ 值是因为提高温度会降低最大数据集的混合率。 -
equal mixing
:在这种情况下,我们以相等的概率从每个任务中抽取样本。具体而言,每个batch
中的每个样本都是从均匀随机采样的训练集中而来(注,均匀指的是数据集本身)。这很可能是一个次优策略,因为模型在low-resource
任务上会迅速过拟合,而在high-resource
任务上则欠拟合。我们主要把它作为一个参考点reference point
,说明当比例设置得不理想时,可能会出现什么问题。
为了将这些混合策略与我们的
baseline pre-train-then-fine-tune
进行平等的比较,我们对多任务模型进行相同的总步数训练: $ 2^{19} + 2^{18} = 786432 $ 。对比结果如下表所示。可以看到:总的来说,我们发现在大多数任务上,多任务训练比pre-train-then-fine-tune
效果要差。注意,
T5
的多任务训练其实就是把多个任务的数据集混合在一起,实验比较了不同的混合比例。这里没有微调阶段。-
equal mixing
策略尤其导致性能急剧下降,这可能是因为low-resource
任务已经过拟合、high-resource
任务没有看到足够的数据、或者模型没有看到足够多的未标记的数据来学习通用语言能力。 -
对于
examples-proportional mixing
策略,我们发现对于大多数任务来说,存在 $ K $ 的一个 "甜蜜点sweet spot
",在那个 $ K $ 值时模型获得了最好的性能,而更大或更小的 $ K $ 值往往会导致更差的性能。例外的情况(在我们考虑的 $ K $ 值范围内)是WMT English to French
翻译,这是一个high-resource
任务,它总是受益于较高的 $ K $ 。 -
最后,我们注意到,
temperature-scaled mixing
也提供了一种从大多数任务中获得合理性能的方法,其中 $ T=2 $ 在大多数情况下表现最好。
《Massively multi-lingual neural machine translation in the wild: Findings and challenges》
和《The natural language decathlon: Multitask learning as question answering》
之前已经观察到多任务模型的表现优于在每个单独任务上训练的单独模型,而且《Multi-task deep neural networks for natural language understanding》
和《Snorkel MeTaL: Weak supervision for multi-task learning》
已经表明多任务setup
可以在非常相似的任务中带来好处。接下来,我们将探讨如何缩小多任务训练与
pre-train-then-fine-tune
方法之间的差距。相比微调,多任务方法有几个优势:
-
多任务模型只需要维护一个模型就可以处理多个任务。而微调方法需要针对每个任务微调一个模型,最终得到多个模型,这不利于模型的部署和管理。
-
多任务模型可以跨任务泛化,有助于已有任务和新任务的预测性能。
-
-
将多任务学习与微调相结合:回顾一下,我们正在研究一个宽松的多任务学习版本,在这个版本中,我们在一个混合任务上训练一个单一的模型,但允许我们使用模型的不同
checkpoints
来评估性能。我们可以通过考虑以下情况来扩展这种方法:模型一次性在所有任务上进行预训练,然后在单个监督任务上进行微调。这是MT-DNN
使用的方法,该方法在推出时在GLUE
和其他benchmark
上取得了SOTA
的性能。我们考虑这种方法的三种变体:-
在第一种情况下,我们采用
examples-proportional mixture
对模型进行预训练,其中 $ K=2^{19} $ ,然后在每个单独的下游任务上对其进行微调。这有助于我们衡量在预训练期间,包含监督任务是否对下游任务有帮助。 -
我们还希望,在预训练模型适应单个任务之前,混合许多监督源可以帮助它获得一组更普遍的 "技能"。为了直接衡量这一点,我们考虑了第二个变体,即我们在相同的
examples-proportional mixture
( $ K=2^{19} $ )上对模型进行预训练,只是我们从这个pre-training mixture
中省略了一个下游任务。然后,我们在预训练时遗漏的任务上对模型进行微调。我们对每一个下游任务重复这一过程。我们称这种方法为
"leave-one-out"
多任务训练。这模拟了现实世界的情况,即预训练好的模型在预训练期间没有看到的任务上被微调。 -
注意,多任务预训练提供了监督任务的一个
diverse mixture
。由于其他领域(如计算机视觉)使用监督数据集进行预训练,我们有兴趣看看从multi-task pre-training mixture
中省略无监督任务是否仍然产生良好的结果。因此,在我们的第三个变体中,我们用 $ K=2^{19} $ 的所有监督任务的examples-proportional mixture
进行预训练。
在所有这些变体中,我们都遵循我们的标准程序,先进行
$ 2^{19} $ 步的预训练、再进行 $ 2^{18} $ 步的微调。这些方法的比较结果如下表所示。为了比较,我们还包括了我们的
baseline
(pre-train-then-fine-tune
)和标准的多任务学习(没有微调)在 $ K=2^{19} $ 的examples-proportional mixture
上的结果。可以看到:-
在多任务预训练之后进行微调,其结果与我们的
baseline
相当。这表明,在多任务学习之后使用微调可以帮助缓解前文中描述的不同混合率之间的一些trade-off
问题。 -
有趣的是,
leave-one-out
训练的性能只是稍微差一点,这表明一个在各种任务上训练过的模型仍然可以适应新的任务(即多任务预训练可能不会导致夸张的任务干扰)。 -
最后,除了翻译任务外,
supervised multi-task pre-training
在每种情况下都表现得很差。这可能表明,翻译任务从预训练中获益较少,而无监督的预训练在其他任务中是一个重要因素。
既然多任务(包括无监督预训练任务)加微调的效果,并没有显著超越无监督预训练加微调,那么为什么要用多任务?不仅费时费力,还需要收集更多的监督数据。因此,无监督预训练 + 微调即可,最重要的就是搜集大型高质量的预训练数据集。
根据
MT-DNN
的结论,多任务加微调是可以提升效果的。在MT-DNN
中,不同的任务共享backbone
,但是每个任务具有task-specific
输出。而在T5
中,所有任务共享同一个模型(不仅共享backbone
,也共享输出层),因此可能影响多任务的利用。为此,后续的ExT5
聚焦于改善多任务的利用。 -
26.2.6 Scaling
-
机器学习研究的 "惨痛教训" 认为,能够利用额外计算的通用方法最终会战胜依赖人类专业知识的方法。最近的结果表明,对于自然语言处理中的迁移学习,这可能成立,即:已经多次证明,与更精心设计的方法相比,
scaling up
可以提高性能。然而,有多种可能的scale
方式,包括使用更大的模型、对模型进行更多step
的训练、以及ensembling
。在本节中,我们通过在如下的前提下来比较这些不同的方法:"你刚刚得到了4
倍的计算量,你应该如何使用它?"我们从我们的
baseline
模型开始,它有220M
的参数,分别预训练 $ 2^{19} $ 步、以及微调 $ 2^{18} $ 步。编码器和解码器的规模都与BERT_BASE
类似。在增加模型规模的实验中,我们遵循
BERT_LARGE
的指导方针,使用 $ d_\text{ff}=4096, d_\text{model}=1024, d_\text{kv}=64 $ 和head = 16
的注意力机制。然后,我们产生了两个变体,分别对应于16
层和32
层(注,编码器解码器都为16
层、以及编码器和解码器都为32
层),产生的模型的参数是我们原始模型的2
倍和4
倍。这两个变体也有大约2
倍和4
倍的计算成本。利用我们的
baseline
和这两个更大的模型,我们考虑了三种使用4
倍计算量的方法:用相同的模型训练4
倍的step
、用2
倍大的模型训练2
倍的step
、用4
倍大的模型训练相同的step
。当我们增加训练
step
时,为了简单起见,我们同时扩大预训练step
和微调step
。请注意,当增加预训练step
时,我们实际上包括了更多的预训练数据,因为C4
是如此之大以至于我们在训练 $ 2^{23} $ 步时也没有完成对数据的一次遍历。让模型看到
4
倍的数据的另一种方法是将batch size
增加4
倍。由于更有效的并行化,这有可能导致更快的训练。然而,用4
倍大的batch size
进行训练可能会产生与4
倍多的training step
不同的结果(《Measuring the effects of data parallelism on neural network training》
)。我们包括一个额外的实验,用4
倍大的batch size
训练我们的baseline
模型,从而比较这两种情况。在我们考虑的许多
benchmark
上,通过使用model ensemble
进行训练和评估来获得额外的性能是常见的做法。这提供了一种使用额外计算的正交方式。为了比较其他的scaling
方法和ensembling
,我们还测量了ensemble
的性能,其中这个ensemble
由4
个单独预训练和微调的模型组成。在将logits
馈入output softmax
之前,我们对整个ensemble
的logits
进行平均,以获得aggregate prediction
。与其预训练4
个单独的模型,一个更便宜的选择是采用一个预训练的模型,并产生4
个单独的微调版本。虽然这没有使用我们整个4
倍的计算预算,但我们也包括了这种方法,看看它是否能产生与其他scaling
方法相竞争的性能。下游任务的同一个监督数据集上,如何产生四个微调版本?论文并未说明。一个简单的方案是:对监督数据集执行四次不同的
train/validate/test
数据集拆分,每种拆分训练一个微调版本。下表显示了应用这些不同的
scaling
方法后取得的性能。-
不足为奇的是,增加训练时间和/或模型规模一直在改善
baseline
。 -
训练
4
倍的step
或使用4
倍大的batch size
之间没有明显的赢家,尽管两者都有好处。 -
一般来说,与单纯增加训练时间或
batch size
相比,增加模型规模会导致性能的额外提升。从
baseline
到1xsize, 4 x training steps
和1x size, 4 x batch size
是增加训练时间或batch size
。而从baseline
到4 x size, 1 x training steps
是增加模型规模。后者的提升幅度更大。 -
在我们研究的任何任务中,我们没有观察到训练一个
2
倍大的模型(但是增加2
倍训练时间)和训练一个4
倍大的模型之间有很大的区别。这表明,增加训练时间和增加模型规模可以作为提高性能的补充手段。 -
我们的结果还表明,
ensembling
提供了一种正交的、有效的手段,通过scale
来提高性能。在一些任务中(
CNN/DM
、WMT English to German
、WMT English to Romanian
),将4
个完全独立训练的模型ensembling
起来的结果明显优于其他所有的scaling
方法。将预训练好的模型分别进行微调从而实现
ensembling
,也比baseline
有了很大的性能提高,这表明该方法是更便宜的提高性能的手段。唯一的例外是
SuperGLUE
,它的ensembling
方法都没有比baseline
有明显的提高。 -
我们注意到,不同的
scaling
方法有不同的trade-off
,这些trade-off
与它们的性能是分开的。-
例如,相对于小模型,使用更大的模型会使下游的微调和推理更加昂贵。
-
另外,我们注意到,
ensembling
$ N $ 个独立的模型的成本与使用一个具有 $ N $ 倍计算成本的模型的成本相似(计算成本、存储成本)。
因此,在选择
scaling
方法时,对模型的最终使用的考虑是很重要的。 -
-
26.2.7 所有东西放在一起
-
我们现在利用我们的系统性研究的见解来确定我们可以在流行的
NLP benchmark
上将性能推到什么程度。我们从我们的baseline training
方法开始,并做了以下改变:-
Objective
:我们将baseline
中的i.i.d. denoising objective
换成了span-corruption objective
,这是受SpanBERT
的启发。具体来说,我们使用平均span length
为3
,并破坏原始序列的15%
。我们发现,这个objective
产生了略微更好的性能,同时由于target
序列长度较短,计算效率略高。 -
更长时间的训练:我们的
baseline
模型使用了相对较少的预训练(是BERT
的1/4
、是XLNet
的1/16
、是RoBERTa
的1/64
)。幸运的是,C4
足够大,我们可以在不重复数据的情况下训练更长的时间。我们发现,额外的预训练确实是有帮助的,增加
batch size
或者增加training step
数量都可以带来这种好处。因此我们选择序列长度512
、batch size
为 $ 2^{11}=2048 $ 、预训练1M steps
,对应于总共约1T
个预训练token
(约为我们baseline
的32
倍)。我们表明在
RealNews-like, WebText-like, Wikipedia + TBC
等等数据集上进行预训练,在很多下游任务上的表现会优于在C4
上的预训练。然而,这些数据集的变体非常小,在对1T
个token
进行预训练的过程中,它们会被重复数百次。由于我们表明,这种重复可能是有害的,所以我们选择继续使用C4
数据集。 -
模型规模:我们还展示了如何扩大
baseline
模型的规模来提高性能。然而,在计算资源有限的情况下,使用较小的模型对于微调或推理是有帮助的。基于这些因素,我们用一组model size
来训练模型:-
Base
:这是我们的baseline
模型,它有大约220M
个参数。 -
Small
:我们考虑一个较小的模型,它通过使用 $ d_\text{model} = 512, d_\text{ff} = 2048 $ 、head = 8
的注意力、以及在编码器和解码器中各只有6
层来缩小baseline
模型的规模。这个变体有大约60M
个参数。 -
Large
:由于我们的baseline
使用BERT_BASE
规模的编码器和解码器,我们还考虑了一个变体,其中编码器和解码器的规模和结构都与BERT_LARGE
相似。具体来说,这个变体使用 $ d_\text{model}=1024, d_\text{ff}=4096, d_\text{kv}=64 $ 、head = 16
的注意力、以及编码器和解码器各24
层,导致大约770M
个参数。 -
3B and 11B
:为了进一步探索使用更大的模型时可能出现的性能,我们考虑了另外两个变体。在这两种情况下,我们都使用 $ d_\text{model} = 1024 $ 、24
层的编码器和解码器、以及 $ d_\text{kv} = 128 $ 。-
对于
3B
变体,我们使用 $ d_\text{ff}=16384 $ 和head = 32
的注意力,这导致了大约2.8 B
个参数。 -
对于
11B
变体,我们使用 $ d_\text{ff}=65536 $ 和head = 128
的注意力,这导致了大约11 B
个参数。
我们选择扩大
$ d_\text{ff} $ 的规模,是因为现代加速器(如我们训练模型的TPU
)对于像Transformer
的前馈网络中的大型稠密矩阵乘法是最有效的。注:在
mT5
论文中,作者提到:对T5
的改进版本选择扩大 $ d_\text{model} $ 而不是扩大 $ d_\text{ff} $ 。 -
-
-
多任务预训练:我们表明在微调前对无监督和有监督任务的
multi-task mixture
进行预训练,效果与单独对无监督任务进行预训练一样好。这是MT-DNN
所倡导的方法。它还有一个实际的好处,就是能够在整个预训练期间监测 "下游" 任务的表现,而不是仅仅在微调期间监测。因此,我们在最后一组实验中使用了多任务预训练。我们假设,训练时间较长的大型模型可能会受益于较大比例的未标记数据,因为它们更有可能对较小的训练数据集过拟合。然而,我们也注意到,在多任务预训练之后进行微调,可以缓解因选择次优比例的未标记数据而可能出现的一些问题。 基于这些想法,我们在使用标准的
example-proportional mixing
之前,为我们的未标记数据使用以下数据集规模阈值(即, $ K $ 值):Small
为710,000
、Base
为2,620,000
、Large
为8,660,000
、3B
为33,500,000
、11B
为133,000,000
。对于所有的模型变体,在预训练期间,我们还将WMT English to French
和WMT English to German
数据集的有效数据集规模限制在1M
个样本。 -
对单个
GLUE
和SuperGLUE
任务进行微调:到目前为止,在对GLUE
和SuperGLUE
进行微调时,我们将每个benchmark
中的所有数据集拼接起来,这样我们只对GLUE
和SuperGLUE
的模型进行一次微调。这种方法使我们的研究在逻辑上更简单,但我们发现,与单独对每个任务进行微调相比,这在某些任务上牺牲了少量的性能。在单个任务上进行微调的一个潜在问题是,我们可能会对
low-resource
的任务迅速过拟合,然而可以通过对所有任务进行训练从而得到缓解。例如,对于许多low-resource
的GLUE
任务和SuperGLUE
任务来说,我们batch size
为 $ 2^{11} $ 的长度为512
的序列会导致整个数据集在每个batch
中出现多次。。因此,在对每个GLUE
和SuperGLUE
任务进行微调时,我们使用较小的batch size
,batch size = 8
的长度为512
的序列。我们还每
1000
步而不是每5000
步保存checkpoints
,从而确保我们在模型过拟合之前能够获得模型的参数。 -
beam search
:我们之前所有的结果都是使用贪婪解码greedy decoding
的报告。对于具有长输出序列的任务,我们发现使用beam search
可以提高性能。具体而言,我们在WMT
翻译、以及CNN/DM
摘要任务中使用beam width = 4
和 $ \alpha = 0.6 $ 的长度惩罚。 -
测试集:由于这是我们的最后一组实验,我们报告的是测试集而不是验证集的结果。
-
对于
CNN/Daily Mail
,我们使用随着数据集分发的标准测试集。 -
对于
WMT
任务,这相当于使用newstest2014
进行English-German
测试、newstest2015
进行English-French
测试、newstest2016
进行English-Romanian
测试。 -
对于
GLUE
和SuperGLUE
,我们使用benchmark evaluation servers
来计算官方测试集的分数。 -
对于
SQuAD
,在测试集上进行评估需要在一个benchmark server
上运行推理。不幸的是,该服务器上的计算资源不足以从我们最大的模型中获得预测结果。因此,我们继续报告SQuAD
验证集的性能。幸运的是,在SQuAD
测试集上表现最好的模型也在验证集上报告了结果,所以我们仍然可以与表面上SOTA
的模型进行比较。
-
除了上面提到的那些变化,我们使用与我们的
baseline
相同的训练程序和超参数(AdaFactor
优化器、用于预训练的逆平方根学习率调度、用于微调的恒定学习率、dropout
正则化、词表大小等)。概括起来就是几点:预训练数据集要大、模型规模要大、目标函数要合适。至于多任务预训练,对最终效果影响不大。下游任务微调和
beam search
,这是通用做法并且,通常不难实现。 -
-
这组最后的实验结果如下表所示。
-
总的来说,在我们考虑的
24
个任务中,我们在18
个任务上取得了SOTA
的性能。正如预期的那样,我们最大的(11B
参数)模型在所有任务中的模型大小变体中表现最好。 -
我们的
T5-3B
模型变体确实在一些任务中击败了以前的SOTA
,但将模型规模扩展到11B
个参数是实现我们最佳性能的最重要因素。
具体而言:
-
我们取得了
SOTA
的GLUE
平均得分90.3
分。值得注意的是,在自然语言推理任务MNLI
、RTE
和WNLI
中,我们的表现大大优于之前的SOTA
。就参数数量而言,我们的
11B
模型变体是已经提交给GLUE benchmark
的最大模型。然而,大多数提交的最佳成绩都使用了大量的ensembling
和计算来产生预测结果。 -
对于
SQuAD
,我们在Exact Match
得分上超过了之前的SOTA
,超过了1
分。 -
对于
SuperGLUE
,我们在SOTA
的基础上做了很大的改进(从平均得分84.6
到88.9
)。 -
我们在任何一项
WMT
翻译任务上都没有达到SOTA
的性能。这可能部分是由于我们使用了一个纯英语的未标记数据集。我们还注意到,这些任务中的大多数最佳结果都使用了回译back-translation
,这是一种复杂的数据增强方案。在低资源的English to Romanian benchmark
上的SOTA
也使用了额外的跨语言无监督训练形式(《Cross-lingual language model pretraining》
)。 -
最后,在
CNN/Daily Mail
上,我们达到了SOTA
性能,尽管只是在ROUGE-2-F
得分上取得了显著的成绩。
-
-
为了实现其强大的结果,
T5
将我们的实验研究的洞察与前所未有的规模相结合。请注意,我们发现扩大预训练数量(总的预训练token
数量)、或扩大baseline
模型的规模会产生巨大的收益。鉴于此,我们有兴趣衡量我们引入T5
的"non-scaling"
变化对其强大性能的贡献有多大。因此,我们进行了一个最后的实验,比较了以下三种配置:-
标准的
baseline
模型在 $ 2^{35} \simeq 34B $ 的token
上进行预训练。 -
标准的
baseline
模型在1T
的token
上进行预训练(即与T5
使用的预训练量相同),我们称之为"baseline-1T"
。 -
T5-Base
。
请注意,
baseline-1T
和T5-Base
之间的差异包括我们在设计T5
时所作的"non-scaling"
变化。因此,比较这两个模型的性能给我们提供了一个具体的衡量标准,即我们的系统性研究中的洞察的影响。实验结果如下表所示。可以看到:
-
baseline-1T
在所有任务上都超越了baseline
,这表明额外的预训练提高了baseline
模型的性能。 -
T5-Base
在所有的下游任务上都大大超过了baseline-1T
。这表明,规模并不是促成T5
成功的唯一因素。我们假设,较大的模型不仅受益于其规模的增加,而且也受益于这些non-scaling
因素(如,多任务预训练、针对每个子任务进行微调、beam search
等等)。
-
26.3 反思
-
在完成了我们的系统性研究后,我们首先总结了一些最重要的发现。我们的研究结果为哪些研究途径可能更有希望、或更没有希望提供了一些高层次的视角。最后,我们概述了一些主题,我们认为这些主题可以为该领域的进一步发展提供有效方法。
-
经验之谈:
-
text-to-text
:我们的text-to-text
框架提供了一种简单的方法,使用相同的损失函数和解码程序对各种文本任务进行单个的模型训练。我们展示了这种方法如何成功地应用于生成任务,如抽象摘要、分类任务(如自然语言推理)、甚至回归任务(如STS-B
)。尽管它很简单,但我们发现text-to-text
框架获得了与task-specific
架构相当的性能,并在与scale
相结合时最终产生了SOTA
的结果。 -
架构:虽然一些关于
NLP
的迁移学习的工作已经考虑了Transformer
的架构变体,但我们发现原始的encoder-decoder
形式在我们的text-to-text
框架中效果最好。尽管encoder-decoder
模型使用的参数是"encoder-only"
( 如BERT
)或"decoder-only"
(语言模型)架构的两倍,但encoder-decoder
模型的计算成本相似。我们还表明,共享编码器和解码器中的参数并没有导致性能的大幅下降,同时将总参数规模减半。 -
unsupervised objective
:总的来说,我们发现大多数denoising objective
,即训练模型以重建随机破坏的文本,在text-to-text setup
中表现相似。因此,我们建议使用产生短的target
序列的objective
,以便无监督的预训练在计算上更有效率。 -
数据集:我们引入了
Colossal Clean Crawled Corpus: C4
,它包括从Common Crawl web dump
中启发式地清理过的文本。在将C4
与使用额外过滤的数据集进行比较时,我们发现在in-domain unlabeled data
上进行训练可以提高一些下游任务的性能。然而,对single domain
的约束通常会导致更小的数据集。我们另外表明,当未标记的数据集小到在预训练过程中重复多次时,性能会下降。这就促使我们在通用语言理解任务中使用像
C4
这样的大型的、多样化的数据集。 -
训练策略:我们发现,在微调过程中更新预训练模型的所有参数的方法,优于那些旨在更新较少参数的方法,尽管更新所有参数是最昂贵的。
我们还试验了各种方法从而单次训练模型从而用于多个任务,在我们的
text-to-text setting
中,这只是相当于在构建batch
时将不同数据集的样本混合起来。多任务学习的首要问题是设定每个任务的混合比例。我们最终没有找到一种设置混合比例的策略,使得与pre-train-then-fine-tune
的基本方法的性能相匹配。然而,我们发现,在混合任务上进行预训练后再进行微调,可以产生与无监督预训练相当的性能。 -
Scaling
:我们比较了各种利用额外计算的策略,包括在更多的数据上训练模型、训练一个更大的模型、以及使用模型的一个ensemble
。我们发现每一种方法都能显著提高性能,尽管在更多的数据上训练一个较小的模型,往往比在更少的step
中训练一个较大的模型要好得多。我们还表明,模型
ensemble
可以提供比单个模型更好的结果,这提供了一种利用额外计算的正交手段。此外,有两种ensemble
策略:每个子模型都是完全单独地pre-training and fine-tuning
、预训练得到一个base
预训练模型然后微调得到多个子模型。我们发现后者要比前者的效果更差,虽然后者的效果仍然大大优于没有ensemble
的baseline
模型。 -
突破极限:我们结合上述洞察,训练了更大的模型(多达
11B
个参数),从而在我们考虑的许多benchmark
中获得SOTA
的结果。对于无监督训练,我们从C4
数据集中抽取文本,并应用denoising objective
从而破坏连续的spans of tokens
。在对单个任务进行微调之前,我们对multi-task mixture
进行了预训练。此外,我们的模型是在超过1T
个token
上训练的。为了便于复制、扩充、以及应用我们的成果,我们公布了我们的代码、
C4
数据集、以及每个T5
变体的预训练模型权重。
-
-
展望:
-
大型模型的不便之处:我们研究的一个不令人惊讶但重要的结果是,大型模型往往表现更好。用于运行这些模型的硬件不断变得更便宜、更强大,这一事实表明,扩大规模可能仍然是实现更好性能的一种有希望的方式。然而,在一些应用和场景中,使用较小或较便宜的模型总是有帮助的。
例如,大模型部署的难度较大,很多真实场景都有硬件限制或
latency
的限制。与此相关的是,迁移学习的一个有益用途是可以在
low-resource
任务上获得良好的性能。low-resource
任务经常发生在缺乏资金来标记更多数据的环境中。因此,low-resource
的应用往往也只能获得有限的计算资源,这就会产生额外的成本。因此,我们主张研究能用更便宜的模型实现更强性能的方法,以便将迁移学习应用到它能产生最大影响的地方。目前沿着这些方向的一些工作包括知识蒸馏、参数共享、以及条件计算。 -
更有效的知识抽取:回顾一下,预训练的目标之一是为模型提供通用的 "知识",以提高其在下游任务中的表现。我们在这项工作中使用的方法,也是目前常见的做法,是训练模型对
corrupted spans of text
进行降噪。我们怀疑这种简单的技术可能不是教给模型通用知识的一个非常有效的方法。更具体地说,如果能够达到良好的微调性能,而不需要首先在
1T
个文本token
上训练我们的模型,将是非常有用的。沿着这些思路,一些同时进行的工作通过预训练一个模型来区分真实文本和机器生成的文本来提高效率(《Electra: Pre-training text encoders as discriminators rather than generators》
)。 -
任务之间相似性的公式化:我们观察到,对未标记的
in-domain data
进行预训练可以提高下游任务的性能。这一发现主要依赖于基本的观察,比如SQuAD
是使用Wikipedia
的数据创建的。制定一个关于预训练和下游任务之间的 "相似性" 的更严格的概念将是有用的,这样我们就可以对使用什么来源的未标记数据做出更有原则的选择。在计算机视觉领域有一些早期的经验性工作。一个更好的任务关联性relatedness
概念也可以帮助选择有监督的预训练任务,这已经被证明对GLUE benchmark
有帮助(《Sentence encoders on STILTs: Supplementary training on intermediate labeled-data tasks》
)。 -
语言无关模型:我们失望地发现,在我们研究的翻译任务中,
English-only pre-training
没有达到SOTA
的结果。我们也有兴趣避免需要提前指定一个可以编码哪些语言的词表的困难。为了解决这些问题,我们有兴趣进一步研究语言无关language-agnostic
的模型,即无论文本的语言如何,都能以良好的性能执行特定的NLP
任务的模型。
-
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论