先来一张图。
本文主要援引复旦大学邱锡鹏教授的论文:NLP预训练模型综述,对预训练模型进行了一些梳理
模型参数的数量增长迅速,而为了训练这些参数,就需要更大的数据集来避免过拟合,而大规模的标注数据集成本又非常高。而相比之下,大规模未标注的语料却很容易构建。
为了利用大量的未标注文本数据,我们可以先从其中学习一个好的表示,再将这些表示用在别的任务中。这一通过 PTMs 从未标注大规模数据集中提取表示的预训练过程在很多 NLP 任务中都取得了很好的表现。
预训练的优点可以总结为以下三点:
- 在大规模语料上通过预训练学习通用语言表示对下游任务很有帮助;
- 预训练提供了更好的模型初始化参数,使得在目标任务上有更好的泛化性能和更快的收敛速度;
- 预训练是一种有效的正则化方法,能够避免在小数据集上过拟合。
范式区分
这个区分主要是依据于网络深度表示方法来进行代际划分。
1.词嵌入(Embedding)属于第一代预训练模型
静态、浅层的模型训练。
例如:
word2vec(CBOW/Skip-Gram),paragraph vector,Skip-thought vectors, Context2Vec
这种嵌入方式有两个局限:一是一个词通过这种方法获得的词嵌入总是静态且与上下文无关的,无法处理多义词;二是难以解决不在词汇表中的词
2.其他的深度模型,都可以划为第二代预训练模型。
诸如LSTM、ELMo,GPT,BERT
任务区分
按任务进行划分,就是传统的机器学习任务,可以分成无监督学习,监督学习和自监督学习。
1.监督学习(Supervised learning)
这几个词应该很熟悉了,监督学习就是要提供标注好的语料信息。
最常见的就是CoVe,因为提供语料这种,开销非常大,所以在这方面的研究就比较少了,重点还是在无监督和自监督方面。
2.无监督学习 (Unsupervised learning)
无监督学习就是不需要标注好的语料信息。
无监督的有aoto-regressive LM, BiLM这种。
具体训练过程是基于一个大的语料,通过最大似然估计 (MLE) 训练计算一个句子出现的概率。
但是我理解,语言跟图像最大的区别就是,语言是对真实世界的抽象表达,而图像(尤其是照片)是对真实世界的记录,所以单纯的运用无监督的整体效果也不是太好,相当于抽象中的抽象。
3.自监督学习(self Supervised)
自监督学习就是提供一些定制好的规则,算法自行按照规则去总结对应的语料特征,本质上来讲自监督也是一种监督学习。
所以目前最火热的就是自监督学习,这方面,没有有监督学习那么大的前期开销,又能避免完全自学的模式,所以能够有比较好的表现,而且在算力上也能够负担的起。
所以,在自监督学习里面,又产生了很多自监督方法。
像现在最流行的BERT,GPT,XLNet都属于自监督的范围。
这里,自监督方法又分成两大派别,八大小方案
1)基于上下文 (Context Based)
a. 语言模型(LM Language Model)
这个是在无监督训练的基础上,获取到一个初始的预训练模型,然后叠加
b. 去噪自编码器 (DAE:Denoising auto encoder)
DAE 的目的是通过向输入文本中添加噪声,利用含噪声的样本去重构不含噪声的输入。主要有五个实现方式:挡住 (MASK) token、删除 token、填充 token、句子排列、文本轮换。
c. 掩码语言模型 (MLM:Masked Language Model)
MLM 随机选出一些词用 [MASK] 标记,然后去预测被 MASK 的词。但由于被 MASK 的词并不出现在 fine-tuning 的过程中,会导致预训练和微调的过程出现不一致性。针对这种情况,BERT 通过 80% [MASK],10% 随机 token,10% 原 token 的方式来进行 mask。
而 MLM 的一种变体, Seq2SeqMLM ,则是通过将 encoder-decoder (Seq2Seq) 应用到 MLM 上,这种变体有利于 Seq2Seq 类型的下游任务,比如 QA,总结和机器翻译。这一结构主要用在 MASS 和 T5 中。
而在 BERT 之后的很多论文都对 MLM 做了一些改进以增强性能,作者将其总结为 E-MLM (Enhanced Masked Language Modeling)。
其中 RoBERTa 使用动态 masking,UniLM 将对 mask 的预测扩展到三种任务:单向、双向和 Seq2Seq。XLM 通过一种串联并行双语句对叫做 TLM (translation language modeling) 的模型实现 MLM。
而 SpanBERT 和 StructBERT 则是引入了结构化信息。而 ERINE (Baidu) 则是选择 MASK 实体和短语,E-BERT 和 ERINE (THU) 则是利用了实体 embedding 方法,这三者都是借助了外部知识来丰富 MLM。
我在这里画了一条虚线连接DAE和MLM,是因为这两个方法再BERT中就是搭配来使用的,而且现在这基本上成了一种比较标准化的方案。
d. 排列语言模型(Permuted Language Model)
针对 MLM 中使用 MASK 导致的预训练与微调过程的不一致,Permuted Language Modeling (PLM) 对于一个给定序列,生成其所有可能排列进行采样作为训练的目标。值得注意的是,PLM 并不改变原始文本的位置,而是重新定义 token 预测的顺序。
2)基于对比(Contrastive Based)
CTL (Contrastive Learning) 基于一种“learning by comparison”的思路,假设某些观测文本对比随机采样文本在语义上更相似,通过构建正样本和负样本并度量距离来实现学习。CTL 通常比 LM 具有更少的计算复杂度,也因此成为一个值得选择的 PTMs 训练标准。
a. 最大化互信息(DIM:Deep Info Max)
DIM 最初是在 CV 领域提出的用于最大化图像全局特征与局部特征之间的互信息(Mutual Information)的方法。
InfoWord 将 DIM 引入到语义表达学习中,提出用 DIM objective 以最大化句子的全局表示和一个 N-gram 的具备表示之间的互信息。
b. 替换token检测(RTD:Replaced token detection)
RTD 根据上下文来预测 token 是否替换。
CBOW 的负采样(negetive sampling) 就可以看作是一个 RTD 的简单版本,其中采样是根据词汇表中的分布进行采样。
ELECTRA模型基于 RTD 提出了一种新的 generator-discriminator 框架。首先用 MLM 任务训练 generator,再用 generator 的权重初始化 discriminator,再用判别任务(判别哪些 token 被 generator 替换过)训练 discriminator。
最终在下游任务只需要对 discriminator 进行 fine-tuning。RTD也是一种很好的解决 MLM 导致的不一致问题的方法。
WKLM 则是通过在实体层面(entity-level)进行词替换,替换为同一个实体类型的实体名。
c. 预测下一句 (NSP:Next Sentence Prediction)
NSP 训练模型区分两个输入语句是否为训练语料中连续的片段,在选择预训练句对时,第二个句子 50% 是第一个句子实际的连续片段,50% 是语料中的随机段落。NSP 能够教会模型理解两个输入句子之间的联系,从而使得如 QA 和 NLI 这种对此类信息敏感的下游任务受益。
然而,近来 NSP 的必要性也遭到了质疑,XLNet 的作者发现不用 NSP loss 的单句训练优于使用 NSP 的句对训练。RoBERTa 的作者进一步分析表明:在对单个文本中的文本块训练时,去除 NSP 会在下游任务稍微提高性能。
d.句子顺序预测(SOP:Sentence Order Prediction)
NSP 结合了主题预测相关性预测,而因为主题预测更容易,模型将更依赖于主题预测。为更好建模句子之间的相关性,ALBERT 提出使用 SOP loss 替换 NSP loss,SOP 使用一个文档中的两个连续片段作为正样本,将这两个片段交换顺序作为负样本。
采用了 SOP 的 ALBERT 在多项下游任务中结果都优于 BERT。StructBERT 和 BERTje 也使用 SOP 作为自监督学习任务。
可以说使用SOP替代NSP已经成为一种必然。
特定的优化项区分
自从预训练模型出世之后,就开始了围绕着这些模型的改进和优化。这些优化有针对特定任务的优化譬如说机器翻译;有针对模型本身的优化譬如说剪枝,参数共享等等;有针对特定场景的优化,比如生物领域预训练,特殊语种预训练;有模型增强方案,比如加入知识图谱;有拓展范围的优化,比如多模态。
1.知识引入
这个主要就是在原有的语料基础上,增加新的知识,比如说特定领域的语料,或者是增加特定知识的特征输入,比如说有直接把知识图谱的三元组直接embedding以后作为特征输入的。有些效果还很不错。我理解,这相当于对原来的网络关系可以起到一个强化的作用,比起随机学习来说要有一定的效果。
LIBERT: linguistically-informed BERT ,通过附加语言约束任务纳入了语言知识。
SentiLR: 通过对每个单词添加情感极性,将 MLM 拓展至 Label-Aware MLM (LA-MLM),在多个情感分类任务达到 SOTA。
SenseBERT: 不仅能预测被 mask 的 token,还能预测 WordNet 中的 supersense。
ERINE (THU): 将知识图谱中预训练的实体嵌入与文本中相应的实体提及相结合,以增强文本表示。
KnowBERT: 端到端将带实体连接模型与实体表示集成。
KEPLER: 将知识嵌入和语言模型对象联合。
K-BERT: 不同于以上几个模型通过实体嵌入引入知识图谱中的结构化信息,K-BERT 通过直接将知识图谱中相关三元组引入句子,获得一个 BERT 的拓展的树形输入。
K-Adapter: 针对不同预训练任务独立训练不同的适配器以引入多种知识,以解决上述模型在注入多种知识出现的遗忘问题。
2.模型压缩
模型压缩主要是为了控制模型的大小,提高模型的可用性,比如说要把模型部署在空间和算力较小的机器上,手机上或者其他的平台。
剪枝(pruning): 去除不那幺重要的参数(e.g. 权重、层数、通道数、attention heads)
量化(weight quantization): 使用占位更少(低精度)的参数
参数共享(parameter sharing): 相似模型单元间共享参数
知识蒸馏(knowledge diistillation): 用一些优化目标从大型 teacher 模型学习一个小的 student 模型。
3.多模态 MultiModal Machine Learning (MMML)
多模态机器学习,英文全称 MultiModal Machine Learning (MMML),旨在通过机器学习的方法实现处理和理解多源模态信息的能力。目前比较热门的研究方向是图像、视频、音频、语义之间的多模态学习。
随 PTMs 在 NLP 领域的广泛应用,一些多模态 PTMs 也被设计出来,在一些语音、视频、图像数据集上进行了预训练,比如:
图像-语言: 用于图像问答(VQA) 和图像理解 (VCR),代表模型有 ViLBERT、LXMERT、VisualBERT、B2T2、VLBERT、 Unicoder-VL、UNITER
视频-语言: VideoBERT、CBT
音频-文本: 用于端到端语音问答(SQA) 任务,如 SpeechBERT
文本-代码:这里我还发现一个好玩的,CodeBERT。使用了6种编程语言和自然语言进行训练,支持Go, Java, PHP, Python等等,可以理解自然语言并生成代码,或者根据代码添加注释,这个有点意思,有兴趣的可以实测一下
4.领域预训练
这个就是针对于特定领域的语料进行的模型训练。因为原生的Bert预训练模型是使用的公开数据集,对于特定领域内容的采集并不丰富,所以在特定领域内容上的表现可能不是很好。
所以有能力的机构或者产品都会根据自己的情况来决定是否要进行领域自适应。
使用本领域的数据进行一个模型训练,一些大厂都会做这一步,不过如果你的算力无法支撑全部重新训练,那还是老老实实用公开的PTM吧。
5.多语言
多语言也是在数据上的一些变更,把单一语言语料扩充到多种语言上面,对于跨语言 NLP 任务是很重要的。早期工作着力于学习来自同一语义环境下的多语言词嵌入,这一方法往往缺乏语言间的校准。近期有如下几个多语言 PTMs:
Multilingual-BERT: M-BERT,在 Wikipedia 上 104 种种语言的文本上进行 MLM 训练,每个训练样本都是单语言的,也没有专门设计跨语言目标,但即便如此,M-BERT 在跨语言任务上表现还是非常好。
XLM: 通过结合跨语言任务 TLM (translation language modeling),提升了 M-BERT 的性能。
Unicoder: 提出三个跨语言预训练任务:1) cross-lingual word recovery; 2) cross-lingual paraphrase classification; 3) cross-lingual masked language model。
6.特定语言
这个其实跟特定领域类似,就不多说了。比如BERT-wwm,ZEN,NEZHA,ERNIE (Baidu),BERTje,CamemBERT, FlauBERT ,RobBERT
一些开源的模型
word2vec:
https://github.com/tmikolov/word2vec
GloVe:
https://nlp.stanford.edu/projects/glove
FastText:
https://github.com/facebookresearch/fastText
Transformers:
https://github.com/huggingface/transformers
Fairseq:
https://github.com/pytorch/fairseq
Flair:
https://github.com/flairNLP/flair
AllenNLP:
https://github.com/allenai/allennlp
FastNLP:
https://github.com/fastnlp/fastNLP
Chinese-BERT:
https://github.com/ymcui/Chinese-BERT-wwm
BERT:
https://github.com/google-research/bert
RoBERTa:
https://github.com/pytorch/fairseq/tree/master/examples/roberta
XLNet:
https://github.com/zihangdai/xlnet/
ALBERT:
https://github.com/google-research/ALBERT
T5:
https://github.com/google-research/text-to-text-transfer-transformer
ERNIE (Baidu):