一、为什么需要预训练模型
复旦大学邱锡鹏教授发表了一篇NLP预训练模型综述,“Pre-trained Models for Natural Language Processing: A Survey”,从多个角度分析了当前预训练语言模型。本文基于这篇文章来分析。邱老师认为预训练模型有三大优势:
- 预训练模型从大规模语料中学习知识,对下游任务帮助很大
- 预训练提供了一种更好的参数初始化方式,使得在目标任务上泛化能力更好,收敛速度更快
- 预训练可以认为是一种正则化手段,可以防止模型在小数据集上过拟合。
二、预训练简史
预训练语言模型到目前分为两个阶段
- 预训练word embeddings。这个阶段只训练词向量,而且是静态的,是一种feature-base方式。典型例子为word2vec, glove。利用词向量进行token embedding,然后送入模型中。模型设计百花齐放,但主要以LSTM为主。
- 预训练上下文编码器。这个阶段基于上下文动态学习embedding和encoding。典型例子为ELMO、GPT、BERT。
三、预训练任务
目前大部分都是基于自监督学习来构建的,又分为基于上下文学习和对比学习两类。
1、上下文学习
1.1 语言模型LM
语言模型一般指的是自回归语言模型,由上文利用最大似然估计,来预测下文。典型代表就是GPT
1.2 掩码语言模型 MLM
类似于完形填空,先在原始语句中mask一部分token,然后predict他们。BERT中采用的就是这种方式。这种方法有两个比较大的问题
- pretrain阶段人为引入了mask,但fine-tune阶段不存在mask,导致两阶段不一致。为了减缓这个影响,BERT提出了三种mask方式,替换为[mask]、替换为其他token、保持不变,三者比例为80%、10%、10%。
- 不同于LM,MLM每次只能对mask位置的token进行predict,大大降低了训练效率和模型收敛速度,使得训练更耗时。
在seq2seq结构中,也有人尝试使用了MLM,也就是Seq2Seq MLM。在该结构中,encoder中的语句加入了mask,而在decoder中则需要生成这些mask。Seq2Seq MLM特别适合在生成任务中使用,比如摘要、翻译、问答等。MASS和T5中就是用了这种方法。
针对MLM预训练任务,很多文章进行了不同角度的优化,主要包括:
- SpanBERT以span masking的方式,对连续token进行mask。从而可以学到span级别的信息。
- Roberta采用了dynamic masking动态掩码,将语料复制为10份,每一份一种随机mask,从而加入了一定的信息增益。
- ERNIE(baidu)对实体和短语进行mask,从而使模型学到了实体和短语知识,也可以认为是一种引入外部知识的方式。
- StructBERT在span内打乱了token顺序,然后进行重构。提升了任务难度,并整合了语言结构。
- XLM构建了两个不同语言的基于机器翻译语料的sequence,在它的基础上进行MLM,从而提升了模型多语言理解能力。
1.3 排列语言模型 PLM
针对于BERT预训练和精调两阶段不一致的问题,XLNet提出了排列语言模型,从而将auto-encoder转变为了auto-regression。利用attention-mask和双流自注意力来实现。
1.4 去噪自编码器 Denoising Autoencoder (DAE)
MLM就是一种DAE。向原始语料中添加噪声,利用这些包含噪声的语料,来重构不含噪声的输入。添加噪声的方法主要有:mask token、删除token、填充文本、句子排列、文本换位。
2、对比学习 Contrastive Learning (CTL)
CTL的思想是 “learning by comparison”, 它假定观测文本比随机采样的文本,语义更加相似。一般CTL任务比MLM简单一些,需要的算力也更少。
2.1 Replaced Token Detection (RTD)
ELECTRA提出了这个任务,判断sequence中每个token是否和原始token一致。它是一个二分类任务,label为replaced和original。通过这种方式,使得每个token都可以参与到prediction中,大大加快了模型收敛速度。
2.2 Next Sentence Prediction (NSP)
BERT提出了这个任务,正样本为来自同一文档的两个连续语句,负样本为不同文档的两个语句。NSP的初衷是让模型学习到sentence level的信息,对NLI等句子关系判断的任务有帮助。但目前基本认为NSP反而会有副作用,主要原因为:
- NSP的负样本来自不同文档,差异过大,任务过于简单,导致模型参数训练不充分。
- NSP将两句话构成一个pair,会减小单个语句的长度。而越长的语句,信息量越大,可以提升模型效果
- NSP的负样本来自不同文档,利用不同文档的语句来预测MLM,容易给MLM带来较大的噪声。
2.3 Sentence Order Prediction (SOP)
ALBERT提出了这个任务,语句顺序预测。一个pair的两个文本,不论正负样本,都来自同一文档。正样本为AB,负样本为BA。模型需要预测语句顺序。这个方法克服了MLM噪声引入问题,也使得模型从基于NSP的主题预测变为了基于SOP的语句关系预测,大大增加了任务难度,从而使模型参数训练更充分。
四、预训练模型分类
根据是否基于上下文、模型架构、预训练任务、扩展方法分为四大类。如上所示。
- 是否基于上下文:第一代不基于上下文,是静态的word embedding。如word2vec、glove。第二代之后的基本就都是基于上下文的了
- 模型架构:分为LSTM、Transformer encoder、Transformer decoder、Transformer。
- 预训练任务:上文详细分析了
- 扩展方法。比如知识增强、多语言、特定语言、多模态、特定领域、模型轻量化等。
比较有代表性的一些模型如下表
1、GPT
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
openai-gpt | 12 | 768 | 12 | 110M | 英文语料 |
- openai-gpt: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 由OpenAI在英文语料上进行训练而得到.
2、GPT-2
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
gpt2 | 12 | 768 | 12 | 117M | GPT-2英文语料 |
gpt2-xl | 48 | 1600 | 25 | 1558M | GPT-2英文语料 |
- gpt2: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共117M参数量, 在OpenAI GPT-2英文语料上进行训练而得到.
- gpt2-xl: 编码器具有48个隐层, 输出1600维张量, 25个自注意力头, 共1558M参数量, 在大型的OpenAI GPT-2英文语料上进行训练而得到.
3、BERT
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
bert-base-uncased | 12 | 768 | 12 | 110M | 小写英文文本 |
bert-large-uncased | 24 | 1024 | 16 | 340M | 小写英文文本 |
bert-base-cased | 12 | 768 | 12 | 110M | 不区分大小写的英文文本 |
bert-large-cased | 24 | 1024 | 16 | 340M | 不区分大小写的英文文本 |
bert-base-multilingual-uncased | 12 | 768 | 12 | 110M | 小写的102种语言文本 |
bert-large-multilingual-uncased | 24 | 1024 | 16 | 340M | 小写的102种语言文本 |
bert-base-chinese | 12 | 768 | 12 | 110M | 简体和繁体中文文本 |
- bert-base-uncased: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在小写的英文文本上进行训练而得到.
- bert-large-uncased: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共340M参数量, 在小写的英文文本上进行训练而得到.
- bert-base-cased: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在不区分大小写的英文文本上进行训练而得到.
- bert-large-cased: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共340M参数量, 在不区分大小写的英文文本上进行训练而得到.
- bert-base-multilingual-uncased: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在小写的102种语言文本上进行训练而得到.
- bert-large-multilingual-uncased: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共340M参数量, 在小写的102种语言文本上进行训练而得到.
- bert-base-chinese: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在简体和繁体中文文本上进行训练而得到.
4、DistilBERT
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
distilbert-base-uncased6 | 6 | 768 | 12 | 66M | / |
distilbert-base-multilingual-cased | 6 | 768 | 12 | 66M | / |
- distilbert-base-uncased: 基于bert-base-uncased的蒸馏(压缩)模型, 编码器具有6个隐层, 输出768维张量, 12个自注意力头, 共66M参数量.
- distilbert-base-multilingual-cased: 基于bert-base-multilingual-uncased的蒸馏(压缩)模型, 编码器具有6个隐层, 输出768维张量, 12个自注意力头, 共66M参数量.
5、ALBERT
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
albert-base-v1 | 12 | 768 | 12 | 125M | 英文文本 |
albert-base-v2 | 12 | 768 | 12 | 125M | 英文文本 |
6、RoBERTa
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
roberta-base | 12 | 768 | 12 | 125M | 英文文本 |
roberta-large | 24 | 1024 | 16 | 355M | 英文文本 |
- roberta-base: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共125M参数量, 在英文文本上进行训练而得到.
- roberta-large: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共355M参数量, 在英文文本上进行训练而得到.
7、Transformer-XL
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
transfo-xl-wt103 | 18 | 1024 | 16 | 257M | wikitext-103英文语料 |
- transfo-xl-wt103: 编码器具有18个隐层, 输出1024维张量, 16个自注意力头, 共257M参数量, 在wikitext-103英文语料进行训练而得到.
8、XLNet
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
xlnet-base-cased | 12 | 768 | 12 | 110M | 英文语料 |
xlnet-large-cased | 24 | 1024 | 16 | 240M | 英文语料 |
- xlnet-base-cased: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共110M参数量, 在英文语料上进行训练而得到.
- xlnet-large-cased: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共240参数量, 在英文语料上进行训练而得到.
9、XLM
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
xlm-mlm-en-2048 | 12 | 2048 | 16 | / | 英文语料 |
- xlm-mlm-en-2048: 编码器具有12个隐层, 输出2048维张量, 16个自注意力头, 在英文文本上进行训练而得到.
10、XLM-RoBERTa
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
xlm-roberta-base | 12 | 768 | 8 | 125M | 2.5TB的100种语言文本 |
xlm-roberta-large | 24 | 1027 | 16 | 355M | 2.5TB的100种语言文本 |
11、T5
模型名称 | 隐层数 | 张量维度 | 自注意力头数 | 参数量 | 训练语料 |
---|---|---|---|---|---|
t5-small | 6 | 512 | 8 | 60M | C4语料 |
t5-base | 12 | 768 | 12 | 220M | C4语料 |
t5-large | 24 | 1024 | 16 | 770M | C4语料 |
- t5-small: 编码器具有6个隐层, 输出512维张量, 8个自注意力头, 共60M参数量, 在C4语料上进行训练而得到.
- t5-base: 编码器具有12个隐层, 输出768维张量, 12个自注意力头, 共220M参数量, 在C4语料上进行训练而得到.
- t5-large: 编码器具有24个隐层, 输出1024维张量, 16个自注意力头, 共770M参数量, 在C4语料上进行训练而得到.
五、总结
所有上述预训练模型及其变体都是以transformer为基础,只是在模型结构如神经元连接方式,编码器隐层数,多头注意力的头数等发生改变,这些改变方式的大部分依据都是由在标准数据集上的表现而定,因此,对于我们使用者而言,不需要从理论上深度探究这些预训练模型的结构设计的优劣,只需要在自己处理的目标数据上,尽量遍历所有可用的模型对比得到最优效果即可.
- BERT:是最重要的一个预训练模型,没有之一。BERT也是我们理解其他模型的重中之重,其他基本都是围绕它来进行优化的。
- ERNIE、SpanBERT【预训练任务的优化】:预训练任务的优化可以带来模型效果的极大提升。
- RoBERTa、T5【训练方法优化】:增加数据语料,优化模型超参,也能带来较大的效果提升。这一块的玩家基本都是不缺钱的大金主,因为要做很多对比实验,都是需要极大算力支持的。RoBERTa和T5也是两个大力出奇迹的模型。
- XLNet、ALBERT、ELECTRA【模型结构优化】:优化模型结构相对来说比较fancy和有创新性,也比较容易发文章,也能带来极大的performance提升和算力需求降低。XLNet、ALBERT、ELECTRA是三个创造力十足的模型。
- ALBERT、Q8BERT、DistillBERT、TinyBERT【模型轻量化】:模型压缩和加速,始终是工业界落地中的关键话题。从结构优化、量化、剪枝、蒸馏四个角度来对BERT进行轻量化。
参考资料:
NLP之常用预训练模型详解
NLP预训练模型1 – 综述