摘要
本报告将从以下几个方面梳理预训练模型,陈述预训练(特指nlp领域)的what和how,总结预训练加微调模式的好处和弊端。通过时间线的方式梳理最近两年来预训练模型的发展脉络,重点阐述几个典型的预训练模型的做法和创新点。
chap1:预训练模型
预训练模型一开始是在CV中流行起来的,在图像领域,由于有些任务可能面临这数据量匮乏这一难题,直接在此任务上进行神经网络的训练非常容易导致过拟合。因此人们通常是在一些大的图像数据集上进行通用神经网络的训练,因为在神经网络中,越靠前边的网络层学到的特征越抽象,对于不同的图像数据集来说,他们之间的一些抽象特征可能是相似或者相同的,因此,通过在大的数据集上进行预训练,然后在根据特定的任务进行微调,能够加速网络的训练,缓解过数据量不足而带来的过拟合问题,预训练微调模式可以看成迁移学习的一种特定手段。
而在NLP方面,预训练手段则发展的比较晚,但是预训练的思想其实早就有了,比如最早的word2vec,其实就可以看成特殊的预训练,只不过我们的下游任务直接把学得的词向量拿来作为自己任务的初始化了,而不是进行某种方式的微调。我认为预训练模型发展较晚的原因由以下几个方面构成。
第一,NLP没有像CV一样的大型通用的数据集,由于自然语言的复杂性,很难定义合适的通用的监督型任务供预训练模型进行学习。
第二,如上所述,没有合适的标注数据集,那么进行监督学习就是不太的可能的了,大家都没有意愿去摸索如何利用无监督数据的方法。
第三,在transformer之前,NLP最常用的特征提取模块都是rnn-based,这类的特征提取模块不太适合作为预训练模型的backbone。原因是,他们都是循环递归结构,预训练追求的在大规模数据上学习通用的语言特征,而rnn-based特征提取模块作为backbone训练时时间复杂度是非常高的。大多数研究人员和研究公司都不太愿意尝试。
chap2:各类预训练模型
2.1 语言模型
语言模型是指这样的一个映射函数:
\[f:S->R \]该映射可以建模一个句子的可能性,通常在机器翻译中应用较多。机器翻译中一般将其作为候选结果集的筛选器。
通常该函数是通过在给定预料上通过最大似然学得的。一般的,考虑单向的语言模型,通过链式法则以及最大化如下似然函数,来学习模型:
\[\theta = argmax\sum_{x\in Cor}logP_\theta(x) \\ = argmax \sum _{x \in Cor}\sum_{t} logP_\theta(x_t|x_{<t})\\=argmax\sum_{x\in Cor}\sum_{t=1}^Tlog\frac{exp(h_\theta(x_{1:t-1})^Te(x_t))}{\sum_{x^\prime}exp(h_\theta(x_{1:t-1})^Te(x^\prime))} \]上述建模方法是预训练模型中最常用的训练手段,称之为单向正向语言模型。与之相对的,下面是单向反向预训练模型:
\[\theta = argmax \sum_{x \in Cor}logP_\theta(x) \\ = argmax \sum _{x \in Cor}\sum _tlogP _\theta(x_t|x_{>t}) \]\(P_\theta\)一般用LSTM来建模,后来逐渐演变为Transformer模块,因为Transformer包含多层的Self-Attention运算,而语言模型恰恰就需要提取这种序列内部交互特征。
基于语言模型的预训练模型子18年以来层出不穷,俨然成了各大公司中的乱斗场,频繁的刷新着以NLU为核心的各类NLP任务。下表就是我根据所看的论文总结出比较典型的预训练模型的近两年的发展脉络。
模型名称 | 特征提取 模块 | 预训练任务 | 语言 模型 | 特点 |
---|---|---|---|---|
ELMO | BiLSTM | LM | 单向拼接 | 首次真正的将预训练的思想进行了实践 |
GPT | Transformer | LM | 单向 | 统一下游微调任务的形式,证明了transformer结构在预训练任务中的有效性 |
BERT | Transformer | MLM,NSP | 双向 | 创新性的提出MSM任务,首次事先了双向的语言模型 |
GPT2.0 | Transformer | LM | 单向 | 在生成任务中取的良好的结果 |
MASS | Transformer | LM,MLM | 单向,双向 | 将序列任务引入到预训练过程 |
UNILM | Transformer | LM,MLM,S2SLM | 单向,双向 | 灵活的运用mask矩阵,实现仅仅用Encoder来作序列任务 |
MTDNN | Transformer | MLM | 双向 | 在下游阶段引入了多任务学习 |
Transformer-XL | Transformer-XL | |||
XLNET | Transformer-XL | Perm-LM | 双向 | 排列语言模型,双注意流 |
ALBERT | Transformer | MLM | 双向 | 对BERT进行了针对性的模型压缩,保留了尽可能大的性能同时精简了模型 |
RoBERTa | Transformer | |||
DistillBERT | Transformer | 对BERT进行了模型蒸馏,从而达到模型压缩的目的 |
2.2 ELMo:Deep contextualized word representations
ELMo(Embeddings from Langauge Model)的思想非常简单,通过双向拼接的LSTM结构作为模型的特征提取表示模块,然后使用LM作为预训练第一个阶段的任务,为了将下游不同的任务融合进去,论文在上层融合了不同的NLP任务,需要注意的是,作者在融合不同任务的时候,并没有统一的使用最顶层的向量表示,而是针对不同的任务使用了不同层的向量表示。
elmo的优点在于初步解决了之前的词向量表示中所不能解决的一词多义的问题,因为每个词向量表示都是根据其周围的词在句子中动态获得的。
2.3 GPT:Improving Language Understandingby Generative Pre-Training
GPT是Open AI的工作,开创性的使用了Transformer来作为预训练模型的特征提取模块,在NLU相关的下游任务中取得了非常好的效果。模型也是十分简洁的,预训练部分使用单向的LM,微调阶段也是十分简洁,将一些非序列而任务融合到了一个框架中去,采用了分隔符标记拼接的方式来统一处理。
2.4 GPT2.0:Language Models are Unsupervised Multitask Learners
由于GPT2.0在GPT基础上做的,除了使用了多任务以及超大预训练数据集以及超大的模型之外,在思想上并没有很大的创新,这里就不详细展开了。
2.5 BERT: Pre-training of Deep Bidirectional Transformers for Lanuage Understanding
BERT这篇论文在组会上已经多次讨论了,其中模型结构以及预训练任务大家都早已非常熟悉,这里不再赘述。
这里稍微说下BERT用于预训练中的MLM任务,以及为什么可以称之为双向的语言模型。理想情况下,我们都希望一个词的语义特征表示是由其上下文共同编码决定的。显然上面基于链式法则的单向语言模型是不能够学习到双向语义表示的,因为在预测\(x_t\)时,无论是正向的语言模型还是反向的语言模型,都只由该时刻一侧的序列决定,所以模型自然不能将双向的信息编码到中心词中去。而BERT通过借鉴close-test这样的任务思想,借助Self-Attention Mask,巧妙的解决了上述问题。BERT可以形式化最大如下似然函数:
\[\theta = argmax \sum_{x \in Cor}P_\theta(x|\overline x) \\ = argmax\sum _{x \in Cor}\sum _t m(t)\cdot P_\theta(x_t|\overline x)\\=\sum_{t=1}^Tm_tlog\frac{exp(H_\theta(\hat x)_t^Te(x_t))}{\sum _{x\prime}exp(H_\theta(\hat x)_t^Te(x^\prime))} \]其中
\[m(t) = \begin{cases}1,x_t masked \\ 0,otherwise \end{cases} \]\(H_\theta(x) = [H_\theta(x)_1,H_\theta(x)_2,。。。,H_\theta(x)_T]\),这里的\(H_\theta\)是Transformer结构的编码器。
具体的\(\overline x\)是通过Transformer的Encoder部分来完成特征提取的,在预测当前单词t时刻单词时,通过Attention Mask保证\(x_t\)时刻的信息不泄露。由于Self-Attention计算是对整个句子进行query操作,所以就把双向的信息编码进去了。通过这样的任务转化,BERT就建模到了双向的语义表示信息,但是BERT也面临着如下的为解决问题:
- 如果在Transformer不加入Position Encoding这一操作,那么该特征提取模块实际上就是One-Hot表示而已,不能建模句子内部的相对位置信息。这也是为什么需要加入额外的位置嵌入信息这一操作。
- 可以看出在进行序列预测时,上述的建模实际上有默认被Mask掉的部分各自相互独立,显然这是不合理的。
- 同时,在单步预测被mask掉位置的单词时,将其他位置的mask信息信息也编码了进来,这样做有优点,也有弊端,优点是相当于人为的引进了噪声,可以增强模型的鲁棒性,缺点只能通过启发式的方法设置MASK的数量占比。无法确定究竟引入多少的MASK是合适的。
- MASS:Masked Sequence to Sequence Pre-training for Language Generation
要注意的是,包括BERT在内的预训练模型大多都在一些NLU任务上表现优异,这些任务的基本都是一些序列分类任务,当然,也有很多人在一些序列标注任务上做过一些尝试,但是像机器翻译,文本摘要或者其他的序列生成任务,这些预训练模型便显的力不从心了。根本的原因是:这些模型都只是由一个Encoder结构组成,对于标注任务单独一个Encoder还是可以解决的,但是像序列生成这样的任务便无能为力了。
MASS就是为了解决这一问题而提出的预训练模型。实际上MASS的思想很简单,既然一个单独的Encoder不能解决,那么再叠加一个Decoder作为解码部分不就可以了,因此MASS在预训练模型部分添加了Decoder结构,并将最优化目标设为如下形式:
\[\theta = argmaxL_\theta(\cal X)=\sum_{x\in \cal X}logP_\theta(x^{u:v}|x^{/u:v}) \\ =\sum_{x\in \cal X}\sum _{t=u}^vlogP_\theta(x_t^{u:v}|x_{<t}^{u:v},x^{/u:v}) \]建模这样的最大似然有两个好处,一个是BERT时各Mask位置相互独立这一假设消失了,另外一个就是不用再引入这么多Mask信息了。
2.6 UniLM:Unified Language Model Pre-training
UniLM的巧妙之处在于将上面提到的三种语言模型都集成到了一个模型中去,而且仅仅用了Encoder结构。
预训练采用了1/3的双向语言模型,1/3的序列到序列语言模型、各占1/6的从左到右的以及从右到左的单向语言模型。同时也像BERT一样集成了NSP任务。
具体的,UniLM采用了如下方式来统一的集成上述预训练过程:
引用:
Improving Language Understandingby Generative Pre-Training
GPT:Improving Language Understandingby Generative Pre-Training
BERT:Pre-training of Deep Bidirectional Transformers for Lanuage Understanding
MASS:Masked Sequence to Sequence Pre-training for Language Generation
Unified Language Model Pre-training for Natural Language Understanding and Generation
XLNet: Generalized Autoregressive Pretrainingfor Language Understanding