PTMs:史上最全面总结 NLP 预训练模型
作者:JayLou 娄杰
预训练模型(Pre-trained Models,PTMs) 的出现将 NLP 带入了一个全新时代。2020 年 3 月 18 日,邱锡鹏老师发表了关于 NLP 预训练模型的综述《Pre-trained Models for Natural Language Processing: A Survey》, 这是一篇全面的综述,系统地对 PTMs 进行了归纳分类。
本文以此篇综述论文为主要参考,通过借鉴不同的归纳方法进行总结,同时也整合了专栏之前已经介绍过的《nlp 中的词向量对比》和《nlp 中的预训练语言模型总结》两篇文章,以 QA 形式对 PTMs 进行全面总结归纳。
获取总结图片下载以及单模型精读请到 github:NLP 预训练模型的全面总结,希望为大家的学习工作提供一些帮助。
笔者注:本文总结与原综述论文也有一些不同之处(详见文末),如有错误或不当之处请指正。很多总结归纳的点不太好拿捏,大家多给意见 ~
一、为什么要进行预训练?
深度学习时代,为了充分训练深层模型参数并防止过拟合,通常需要更多标注数据喂养。在 NLP 领域,标注数据更是一个昂贵资源。PTMs 从大量无标注数据中进行预训练使许多 NLP 任务获得显著的性能提升。总的来看,预训练模型 PTMs 的优势包括:
- 在庞大的无标注数据上进行预训练可以获取更通用的语言表示,并有利于下游任务;
- 为模型提供了一个更好的初始化参数,在目标任务上具备更好的泛化性能、并加速收敛;
- 是一种有效的正则化手段,避免在小数据集上过拟合(一个随机初始化的深层模型容易对小数据集过拟合);
二、什么是词嵌入和分布式表示?PTMs 与分布式表示的关系?
词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量,这也是分布式表示:向量的每一维度都没有实际意义,而整体代表一个具体概念。
分布式表示相较于传统的独热编码(one-hot)表示具备更强的表示能力,而独热编码存在维度灾难和语义鸿沟(不能进行相似度计算)等问题。传统的分布式表示方法,如矩阵分解(SVD/LSA)、LDA 等均是根据全局语料进行训练,是机器学习时代的产物。
PTMs 也属于分布式表示的范畴,本文的 PTMs 主要介绍深度学习时代、自 NNLM$[^footnote]
以来的 “modern” 词嵌入。
三、PTMs 有哪两大范式?对比不同的预训练编码器?
PTMs 的发展经历从浅层的词嵌入到深层编码两个阶段,按照这两个主要的发展阶段,我们归纳出 PTMs 两大范式:「浅层词嵌入」和「预训练编码器」。
1、浅层词嵌入( Non-Contextual Embeddings**)**
浅层词嵌入,这一类 PTMs 范式是我们通常所说的“词向量”,其主要特点是学习到的是上下文独立的静态词嵌入,其主要代表为 NNLM、word2vec(CBOW、Skip-Gram)、Glove 等。这一类词嵌入通常采取浅层网络进行训练,而应用于下游任务时,整个模型的其余部分仍需要从头开始学习。因此,对于这一范式的 PTMs 没有必要采取深层神经网络进行训练,采取浅层网络加速训练也可以产生好的词嵌入 。
浅层词嵌入的主要缺陷为:
- 词嵌入与上下文无关,每个单词的嵌入向量始终是相同,因此不能解决一词多义的问题。
- 通常会出现 OOV 问题,为了解决这个问题,相关文献提出了字符级表示或 sub-word 表示,如 CharCNN、FastText 和 Byte-Pair Encoding 。
图 1: 常见的 3 种浅层词嵌入对比:NNLM、word2vec、Glove:
图 1 给出了三种常见的浅层词嵌入之间的对比,Glove 可以被看作是更换了目标函数和权重函数的全局 word2vec。此外,相关文献也提出了句子和文档级别的嵌入方式,如 Skip-thought、Context2Vec 等。
2、预训练编码器(Contextual Embeddings)
第二类 PTMs 范式为预训练编码器,主要目的是通过一个预训练的编码器能够输出上下文相关的词向量,解决一词多义的问题。这一类预训练编码器输出的向量称之为「上下文相关的词嵌入」。
图 2: NLP 编码器对比:
图 2 给出了 NLP 各种编码器间的对比。PTMs 中预训练编码器通常采用 LSTM 和 Transformer(Transformer-XL),其中 Transformer 又依据其 attention-mask 方式分为 Transformer-Encoder 和 Transformer-Decoder 两部分。此外,Transformer 也可看作是一种图神经网络 GNN
这一类「预训练编码器」范式的 PTMs 主要代表有 ELMO、GPT-1、BERT、XLNet 等。
四、PTMs 按照任务类型如何分类?
PTMs 按照任务类型可分为 2 大类:监督学习 和 无监督学习/自监督学习。
监督学习在 NLP-PTMs 中的主要代表就是 CoVe,CoVe 作为机器翻译的 encoder 部分可以应用于多种 NLP 下游任务。除了 CoVe 外,NLP 中的绝大多数 PTMs 属于自监督学习。
自监督学习是无监督学习的一种方法,自监督学习主要是利用辅助任务从大规模的无监督数据中挖掘自身的监督信息,通过这种构造的监督信息对网络进行训练,从而可以学习到对下游任务有价值的表征。因此,从“构造监督信息”这个角度来看,自监督也可看作是监督学习和无监督学习的一种融合。严格地讲,从是否由人工标注来看,自监督学习属于无监督学习的范畴。
综合各种自监督学习的分类方式,笔者将 NLP-PTMs 在自监督学习中分为两种类型:基于上下文(Context Based)和基于对比(Contrastive Based)。
1、基于上下文(Context Based)
基于上下文的 PTMs,主要基于数据本身的上下文信息构造辅助任务,在 NLP 中我们通常引入语言模型作为训练目标。PTMs 中的语言模型主要分为三大类:
图 3: 三类语言模型之间的对比
第一类:自回归语言模型(LM)
- 优点:* 语言模型(language model,LM)联合概率的无偏估计,即为传统的语言模型,考虑被预测单词之间的相关性,天然适合处理自然生成任务;
- 缺点:
- 联合概率按照文本序列顺序拆解(从左至右分解),无法获取双向上下文信息表征;
- 代表模型:ELMO、GPT-1、GPT-2、ULMFiT、SiATL
第二类:自编码语言模型(DAE)
- 优点:* 本质为降噪自编码(DAE)特征表示,通过引入噪声[MASK]构建 MLM(Masked language model),获取双向上下文信息表征(本文将自编码语言模型统一称为 DAE,旨在采用部分损坏的输入,旨在恢复原始的未失真输入);如果当前 token 被预测,则 否则 , 为原始文本被替换后的输入。
- 缺点:
- 引入独立性假设,为语言模型联合概率的有偏估计,没有考虑预测 token 之间的相关性;
- 预训练时的「MASK」噪声在 finetune 阶段不会出现,造成两阶段不匹配问题;为解决这一问题,在 15% 被预测的 token 中,80% 被替换为「MASK」,10% 被随机替换,10% 被替换为原词。
- 代表模型:BERT、MASS、T5、RoBERTa、UniLM、XLM、SpanBERT、ERNIE-Baidu、E-BERT、ERNIE-THU、BART。
BERT 是自编码语言模型的一个典型代表,但其采用的 MLM 策略和 Transformer-Encoder 结构,导致其不适合直接处理生成任务。为了解决这一问题,也可采用基于 Seq2Seq MLM 方法:encoder 部分采取 masked 策略,而 decoder 部分以自回归的方式预测 encoder 部分被 mask 的 token。此外,还有很多基于自编码语言模型的 PTMs 提出了不同的 MLM 增强策略,称之为 Enhanced Masked Language Modeling (E-MLM)
上述 DAE 具体的 PTMs 方法见图 4。
第三类:排列语言模型(PLM)
排列语言模型(Permuted Language Model,PLM)综合了 LM 和 DAE-LM 两者的优点。严格来讲,PLM 和 LM 是标准的自回归语言模型(注:PLM 是一种广义的自回归方法),而 MLM 不是一个标准的语言模型,其引入独立性假设,隐式地学习预测 token(mask 部分本身的强相关性)之间的关系。如果衡量序列中被建模的依赖关系的数量,标准的自回归语言模型可以达到上界,不依赖于任何独立假设。LM 和 PLM 能够通过自回归方式来显式地学习预测 token 之间的关系。然而,LM 无法对双向上下文进行表征,借鉴 NADE 的思想,PLM 将这种传统的自回归语言模型(LM)进行推广,将顺序拆解变为随机拆解(从左至右分解),产生上下文相关的双向特征表示。
PLM 最为典型的代表就是 XLNet,这是对标准语言模型的一个复兴:提出一个框架来连接标准语言模型建模方法和预训练方法。
一个关键问题:为什么 PLM 可以实现双向上下文的建模?PLM 的本质就是语言模型联合概率的多种分解机制的体现, 其将 LM 的顺序拆解推广到随机拆解。 PLM 没有改变原始文本序列的自然位置,只是定义了 token 预测的顺序。PLM 只是针对语言模型建模不同排列下的因式分解排列,并不是词的位置信息的重新排列。
最后,我们对基于上述三类语言模型的 PTMs 进行总结:
图 4: 基于上下文(Context Based)的 3 种语言模型 PTMs 总结:
2、基于对比(Contrastive Based)
基于对比(Contrastive Based),不同于 Context Based 主要基于数据本身的上下文信息构造辅助任利用,Contrastive Based 主要利用样本间的约束信息构造辅助任务,这类方法也是 Contrastive learning(CTL)。CTL 假设观察到的文本对(正样本)在语义上比随机采样的文本(负样本)更相似。CTL 背后的原理是「在对比中学习」。相较于语言建模,CTL 的计算复杂度更低,因而在预训练中是理想的替代训练标准。
CTL 通过构建正样本(positive)和负样本(negative),然后度量正负样本的距离来实现自监督学习:可以使用点积的方式构造距离函数,然后构造一个 softmax 分类器,以正确分类正样本和负样本。鼓励相似性度量函数将较大的值分配给正例,将较小的值分配给负例:
相似性度量函数通常可采取两种方式: 或
第一类: Deep InfoMax (DIM)
DIM 方法来源于 CV 领域,对于全局的特征(编码器最终的输出)和局部特征(编码器中间层的特征),DIM 需要判断全局特征和局部特征是否来自同一图像。
InfoWord 将 DIM 引入到 NLP 中,用 Mutual Information 的一个下界 InfoNCE 来重新解释 BERT 和 XLNET 的 objective,并提出一个新的 DIM objective 以最大化一个句子的 global representation 和其中一个 ngram 的 local representation 之间的 Mutual Information。
第二类:Replaced Token Detection (RTD)
噪声对比估计(Noise-Contrastive Estimation,NCE)通过训练一个二元分类器来区分真实样本和假样本,可以很好的训练词嵌入。RTD 于与 NCE 相同,根据上下文语境来预测 token 是否替换 。
- word2vec* 中的 negative sampling 可看作是 RTD,负样本从词表中进行带权采样。
- ELECTRA* 提出了一种新的预训练任务框架,构建生成器-判别器,生成器通过 MLM 任务对被 mask 的 token 进行预测,迭代器判断原始句子中的每个 token 是否被 replace 过。生成器相当于对输入进行了筛选,使判别器的任务更难,从而学习到更好的表示。生成器-判别器共享 embedding,生成器部分采用 small-bert,判别器部分对每一个 token 采用 sigmoid 计算 loss。finetune 阶段只采用判别器部分。RTD 也被看作解决 MLM 中「MASK」在预训练和 finetune 间差异的一种手段。
- WKLM* 在实体 level 进行替换,替换为具有相同实体类型的实体名称。
第三类:Next Sentence Prediction (NSP)
NSP 区分两个输入句子是否为训练语料库中的连续片段,第二个句子 50% 为第一句子实际的连续片段,50% 从其他语料随机选择。NSP 可以引导模型理解两个输入句子之间的关系,从而使对此信息敏感的下游任务受益,如 QA 任务。而 RoBERTa 表明:NSP 在对单个文档中的文本块进行训练时,去除 NSP 任务或在下游任务上可以稍微提高性能。
第四类:Sentence Order Prediction (SOP)
SOP 使用同一文档中的两个连续片段作为正样本,而相同的两个连续片段互换顺序作为负样本。NSP 融合了主题预测和相关性预测,主题预测更容易,这使得模型进行预测时仅依赖于主题学习。与 NSP 不同,SOP 使用同一文档中的两个连续段作为正样本,但顺序互换为负样本。采取 SOP 任务的 PTMs 有 ALBERT、StructBERT、BERTje。
图 5 对上述基于对比(Contrastive Based)的四类 PTMs 进行了总结:
图 5: 基于上下文(Contrastive Based)的 PTMs 总结:
五、PTMs 有哪些拓展?
1、引入知识
PTMs 通常从通用大型文本语料库中学习通用语言表示,但是缺少特定领域的知识。PTMs 中设计一些辅助的预训练任务,将外部知识库中的领域知识整合到 PTMs 中被证明是有效的。
- ERNIE-THU 将在知识图谱中预先训练的实体嵌入与文本中相应的实体提及相结合,以增强文本表示。由于语言表征的预训练过程和知识表征过程有很大的不同,会产生两个独立的向量空间。为解决上述问题,在有实体输入的位置,将实体向量和文本表示通过非线性变换进行融合,以融合词汇、句法和知识信息。
- LIBERT(语言知识的 BERT)通过附加的语言约束任务整合了语言知识。
- SentiLR 集成了每个单词的情感极性,以将 MLM 扩展到标签感知 MLM(LA-MLM),ABSA 任务上都达到 SOTA。
- SenseBERT 不仅能够预测被 mask 的 token,还能预测它们在给定语境下的实际含义。使用英语词汇数据库 WordNet 作为标注参照系统,预测单词在语境中的实际含义,显著提升词汇消歧能力。
- KnowBERT 与实体链接模型以端到端的方式合并实体表示。
- KG-BERT 显示输入三元组形式,采取两种方式进行预测:构建三元组识别和关系分类,共同优化知识嵌入和语言建模目标。这些工作通过实体嵌入注入知识图的结构信息。
- K-BERT 将从 KG 提取的相关三元组显式地注入句子中,以获得 BERT 的扩展树形输入。
- K-Adapter 通过针对不同的预训练任务独立地训练不同的适配器来注入多种知识,从而可以不断地注入知识,以解决注入多种知识时可能会出现灾难性遗忘问题。
- 此外,这类 PTMs 还有 WKLM、KEPLER 等。
2、模型压缩
由于预训练的语言模型通常包含至少数亿个参数,因此很难将它们部署在现实应用程序中的在线服务和资源受限的设备上。模型压缩是减小模型尺寸并提高计算效率的有效方法。
5 种 PTMs 的压缩方法为:
- pruning(剪枝):将模型中影响较小的部分舍弃。
- 如 Compressing BERT,还有结构化剪枝 LayerDrop* ,其在训练时进行 Dropout,预测时再剪掉 Layer,不像知识蒸馏需要提前固定 student 模型的尺寸大小。
- quantization(量化):将高精度模型用低精度来表示;
- 如 Q-BERT 和 Q8BERT* ,量化通常需要兼容的硬件。
- parameter sharing (参数共享):相似模型单元间的参数共享;
- ALBERT* 主要是通过矩阵分解和跨层参数共享来做到对参数量的减少。
- module replacing(模块替换):
- BERT-of-Theseus* 根据伯努利分布进行采样,决定使用原始的大模型模块还是小模型,只使用 task loss。
- knowledge distillation (知识蒸馏):通过一些优化目标从大型、知识丰富、fixed 的 teacher 模型学习一个小型的 student 模型。蒸馏机制主要分为 3 种类型:
- 从软标签蒸馏:DistilBERT、EnsembleBERT
- 从其他知识蒸馏:TinyBERT、BERT-PKD、MobileBERT、 MiniLM、DualTrain
- 蒸馏到其他结构:Distilled-BiLSTM
图 6: 不同的知识蒸馏 PTMs:
3、多模态
随着 PTMs 在 NLP 领域的成功,许多研究者开始关注多模态领域的 PTMs,主要为通用的视觉和语言特征编码表示而设计。多模态的 PTMs 在一些庞大的跨模式数据语料库(带有文字的语音、视频、图像)上进行了预训练,如带有文字的语音、视频、图像等,主要有 VideoBERT、CBT 、UniViLM、 ViL-BERT 、 LXMERT、 VisualBERT 、 B2T2 、Unicoder-VL 、UNITER 、 VL-BERT 、 SpeechBERT。
4、领域预训练
大多数 PTM 都在诸如 Wikipedia 的通用语料中训练,而在领域化的特定场景会收到限制。如基于生物医学文本的 BioBERT,基于科学文本的 SciBERT,基于临床文本的 Clinical-BERT。一些工作还尝试将 PTMs 适应目标领域的应用,如医疗实体标准化、专利分类 PatentBERT、情感分析 SentiLR 关键词提取。
5、多语言和特定语言
学习跨语言共享的多语言文本表示形式对于许多跨语言的 NLP 任务起着重要的作用。
- Multilingual-BERT 在 104 种 Wikipedia 文本上进行 MLM 训练(共享词表),每个训练样本都是单语言文档,没有专门设计的跨语言目标,也没有任何跨语言数据,M-BERT 也可以很好的执行跨语言任务。
- XLM 通过融合跨语言任务(翻译语言模型)改进了 M-BERT,该任务通过拼接平行语料句子对进行 MLM 训练。
- Unicoder 提出了 3 种跨语言预训练任务:1)cross-lingual word recovery;2) cross-lingual paraphrase classification;3) cross-lingual masked language model.
虽然多语言的 PTMs 在跨语言上任务表现良好,但用单一语言训练的 PTMs 明显好于多语言的 PTMs。此外一些单语言的 PTMs 被提出:BERT-wwm, ZEN, NEZHA , ERNIE-Baidu, BERTje, CamemBERT, FlauBERT, RobBERT。
六: 如何对 PTMs 进行迁移学习?
PTMs 从大型语料库中获取通用语言知识,如何有效地将其知识适应下游任务是一个关键问题。迁移学习的方式主要有归纳迁移(顺序迁移学习、多任务学习)、领域自适应(转导迁移)、跨语言学习等。NLP 中 PTMs 的迁移方式是顺序迁移学习。
1、如何迁移?
- 选择合适的预训练任务:语言模型是 PTM 是最为流行的预训练任务;同的预训练任务有其自身的偏置,并且对不同的任务会产生不同的效果。例如,NSP 任务可以使诸如问答(QA)和自然语言推论(NLI)之类的下游任务受益。
- 选择合适的模型架构:例如 BERT 采用的 MLM 策略和 Transformer-Encoder 结构,导致其不适合直接处理生成任务。
- 选择合适的数据:下游任务的数据应该近似于 PTMs 的预训练任务,现在已有有很多现成的 PTMs 可以方便地用于各种特定领域或特定语言的下游任务。
- 选择合适的 layers 进行 transfer:主要包括 Embedding 迁移、top layer 迁移和 all layer 迁移。如 word2vec 和 Glove 可采用 Embedding 迁移,BERT 可采用 top layer 迁移,Elmo 可采用 all layer 迁移。
- 特征集成 还是 fine-tune?对于特征集成预训练参数是 freeze 的,而 fine-tune 是 unfreeze 的。特征集成方式却需要特定任务的体系结构,fine-tune 方法通常比特征提取方法更为通用和方便。
2、fine-tune 策略: 通过更好的微调策略进一步激发 PTMs 性能
- 两阶段 fine-tune 策略:如第一阶段对中间任务或语料进行 finetune,第二阶段再对目标任务 fine-tune。第一阶段通常可根据特定任务的数据继续进行 fine-tune 预训练。
- 多任务 fine-tune:MTDNN 在多任务学习框架下对 BERT 进行了 fine-tune,这表明多任务学习和预训练是互补的技术。
- 采取额外的适配器:fine-tune 的主要缺点是其参数效率低,每个下游任务都有自己的 fine-tune 参数。因此,更好的解决方案是在固定原始参数的同时,将一些可 fine-tune 的适配器注入 PTMs。
- 逐层阶段:逐渐冻结而不是同时对所有层进行 fine-tune,也是一种有效的 fine-tune 策略。
七、PTMs 还有哪些问题需要解决?
(本部分来自,有删减和修正)
虽然 PTMs 已经在很多 NLP 任务中显示出了他们强大的能力,然而由于语言的复杂性,仍存在诸多挑战。综述论文给出了五个未来 PTMs 发展方向的建议。
1、PTMs 的上限
目前,PTMs 并没有达到其上限。大多数的 PTMs 可通过使用更长训练步长和更大数据集来提升其性能。目前 NLP 中的 SOTA 也可通过加深模型层数来更进一步提升。这将导致更加高昂的训练成本。因此,一个更加务实的方向是在现有的软硬件基础上,设计出更高效的模型结构、自监督预训练任务、优化器和训练技巧等。例如, ELECTRA 就是此方向上很好的一个解决方案。
2、面向任务的预训练和模型压缩
在实践中,不同的目标任务需要 PTMs 拥有不同功能。而 PTMs 与下游目标任务间的差异通常在于两方面:模型架构与数据分布。尽管较大的 PTMs 通常情况下会带来更好的性能表现,但在低计算资源下如何使用是一个实际问题。例如,对于 NLP 的 PTM 来说,对于模型压缩的研究只是个开始,Transformer 的全连接架构也使得模型压缩具有挑战性。
3、PTMs 的架构设计
对于 PTMs,Transformer 已经被证实是一个高效的架构。然而 Transformer 最大的局限在于其计算复杂度(输入序列长度的平方倍)。受限于 GPU 显存大小,目前大多数 PTM 无法处理超过 512 个 token 的序列长度。打破这一限制需要改进 Transformer 的结构设计,例如 Transformer-XL。
4、finetune 中的知识迁移
finetune 是目前将 PTM 的知识转移至下游任务的主要方法,但效率却很低,每个下游任务都需要有特定的 finetune 参数。一个可以改进的解决方案是固定 PTMs 的原始参数,并为特定任务添加小型的 finetune 适配器,这样就可以使用共享的 PTMs 服务于多个下游任务。
5、PTMs 的解释性与可靠性
PTMs 的可解释性与可靠性仍然需要从各个方面去探索,它能够帮助我们理解 PTM 的工作机制,为更好的使用及性能改进提供指引。
写在最后:本文总结 与 原综述论文的一些不同之处:
- 本文定义了 PTMs 两大范式:浅层词嵌入和预训练编码器。不同于原文,XLNet 在原综述论文中被归为 Transformer-Encoder,本文认为将其归为 Transformer-XL 更合适。
- 本文 PTMs 按照自监督学习的分类不同于原文。本文按照 基于上下文(Context Based)和基于对比(Contrastive Based)两种方式归类;将原文的 LM、MLM、DAE、PLM 归为 Context Based;
- 本文将原文 MLM 和 DAE 统一为 DAE;
- 其他:1)在 3.1.2 的 E-MLM 段落中,可以将 StructBERT 拿出来,只放在 SOP;2)3.1.5 对 ELECTRA 的描述,应采取 ELECTRA 原文中的主要方法(参数共享),两阶段的方法只是一种实验尝试;3)在 puring 部分可以补充 LayerDrop;4)应将 UniLM 归为 MLM;;
(仁者见仁,智者见智啦 ~,大家也可以在评论区讨论,纠正我可能存在的错误吧 ~)