目录
2018年ELMo/GPT/BERT的相继提出,不断刷新了各大NLP任务排行榜,自此,NLP终于找到了一种方法,可以像计算机视觉那样进行迁移学习,被誉为NLP新时代的开端。
与计算机视觉领域预训练模型不同的是,其通过采用自监督学习的方法,将大量的无监督文本送入到模型中进行学习,即可得到通用的预训练模型,而NLP领域中无监督文本数据要多少有多少,2019年发布的后续研究工作(GPT2、Roberta、T5等)表明,采用更大的数据、更强大的炼丹炉可以不断提高模型性能表现,至少目前看来还没有达到上限。同时,如何缩减模型参数也成为了另一个研究热点,并有相应的论文在今年发表(ALBERT、ELECTRA)。这一类工作为NLP研发者趟通并指明了一条光明大道:就是通过自监督学习,把大量非监督的文本充分利用起来,并将其中的语言知识编码,对各种下游NLP任务产生巨大的积极作用。
为何预训练语言模型能够达到如此好的效果?主要有如下几点:
总的来说,预训练模型包括两大类:自回归语言模型与自编码语言模型
通过给定文本的上文,对当前字进行预测,训练过程要求对数似然函数最大化,即:
\[max_{\theta} \ logp_{\theta}(x) = \sum_{t=1}^{T}log \ p_{\theta}(x_t|x_{
代表模型:ELMo/GPT1.0/GPT2.0/XLNet
优点:该模型对文本序列联合概率的密度估计进行建模,使得该模型更适用于一些生成类的NLP任务,因为这些任务在生成内容的时候就是从左到右的,这和自回归的模式天然匹配。
缺点:联合概率是按照文本序列从左至右进行计算的,因此无法得到包含上下文信息的双向特征表征;
BERT系列的模型为自编码语言模型,其通过随机mask掉一些单词,在训练过程中根据上下文对这些单词进行预测,使预测概率最大化,即
\[max_{\theta} \ logp_{\theta}(\bar{x}|\hat{x}) \approx \sum_{t=1}^{T}log \ m_tp_{\theta}(x_t|\hat{x}) = \sum_{t=1}^{T}log \ m_tlog\frac{exp(H_{\theta}(\hat{x})_t^Te(x_t))}{\sum_{x'}exp(H_{\theta}(\hat{x})_t^Te(x'))}\]
其本质为去噪自编码模型,加入的 [MASK] 即为噪声,模型对 [MASK] 进行预测即为去噪。
优点:能够利用上下文信息得到双向特征表示
缺点:其引入了独立性假设,即每个 [MASK] 之间是相互独立的,这使得该模型是对语言模型的联合概率的有偏估计;另外,由于预训练中 [MASK] 的存在,使得模型预训练阶段的数据与微调阶段的不匹配,使其难以直接用于生成任务。
原文链接:Deep contextualized word representations
ELMo为一个典型的自回归预训练模型,其包括两个独立的单向LSTM实现的单向语言模型进行自回归预训练,不使用双向的LSTM进行编码的原因正是因为在预训练任务中,双向模型将提前看到上下文表征而对预测结果造成影响。因此,ELMo在本质上还是属于一个单向的语言模型,因为其只在一个方向上进行编码表征,只是将其拼接了而已
对于每一个字符,其每一层的ELMo表征均为输入词向量与该层的双向编码表征拼接而成,即:
\[R_k = \{x^{LM}_k, \overrightarrow{h}^{LM}_{k,j}, \overleftarrow{h}^{LM}_{k,j} | j = 1, ..., L\} = \{h^{LM}_{k,j}|j = 0, ..., L\}\]
对于下游任务而言,我们需要把所有层的ELMo表征整合为一个单独的向量,最简单的方式是只用最上层的表征,而更一般的,我们采用对所有层的ELMo表征采取加权和的方式进行处理,即:
\[ELMo^{task}_k = E(R_k; \theta ^{task}) = \gamma ^{task}\sum_{j=0}^L s^{task}h^{LM}_{k,j}\]
其中\(s^{task}\)可以作为学习参数,为一个归一化的权重因子,用于表示每一层的词向量在整体的重要性。\(\gamma ^{task}\)为缩放参数,允许具体的task模型去放缩 ELMo 的大小,因为ELMo的表征分布与具体任务的表征分布不一定是一样的,可以将其作为一个辅助特征参数。
GPT:Improving Language Understanding by Generative Pre-Training
GPT2:Language Models are Unsupervised Multitask Learners
GPT是“Generative Pre-Training”的简称,从名字上就可以看出其是一个生成式的预训练模型,即与ELMo类似,是一个自回归语言模型。与ELMo不同的是,其采用多层Transformer Decoder作为特征抽取器,多项研究也表明,Transformer的特征抽取能力是强于LSTM的。
对于带有标签\(y\)的监督数据\([x_1, ..., x_m]\),我们直接将其输入到已经完成预训练的模型中,然后利用最后一个位置的输出对标签进行预测,即
\[P(y|x^1, ..., x^m) = softmax(h_l^mW_y)\]
其中,\(W_y\)为分类器的参数,\(h_l^m\)为最后一层最后一个位置的输出。则最大化优化目标即为:
\[ L_2(C) = \sum_{(x, y)}^{T}log \ P(y|x^1, ..., x^m)\]
GPT2 与 GPT 的大致模型框架和预训练目标是一致的,而区别主要在于以下几个方面:
其他的就不深究了
原文链接:BERT: Pre-training of Deep Bidirectional Transformers forLanguage Understanding
BERT 的特征抽取结构为双向的 Transformer,简单来说,就直接套用了 Attention is all you need 中的 Transformer Encoder Block 结构,虽然相比于GPT,仅仅是从单向的变为双向的,但这也意味着 BERT 无法适用于自回归语言模型的预训练方式,因此,BERT提出了两种预训练任务来对其模型进行预训练。
由于BERT需要通过上下文信息,来预测中心词的信息,同时又不希望模型提前看见中心词的信息,因此提出了一种 Masked Language Model 的预训练方式,即随机从输入预料上 mask 掉一些单词,然后通过的上下文预测该单词,类似于一个完形填空任务。
在预训练任务中,15%的 Word Piece 会被mask,这15%的 Word Piece 中,80%的时候会直接替换为 [Mask] ,10%的时候将其替换为其它任意单词,10%的时候会保留原始Token
仅仅一个MLM任务是不足以让 BERT 解决阅读理解等句子关系判断任务的,因此添加了额外的一个预训练任务,即 Next Sequence Prediction。
具体任务即为一个句子关系判断任务,即判断句子B是否是句子A的下文,如果是的话输出’IsNext‘,否则输出’NotNext‘。
训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从预料中提取的,它们的关系是NotNext的。这个关系保存在图4中的[CLS]符号中
BERT的输入表征由三种Embedding求和而成:
对于不同的下游任务,我们仅需要对BERT不同位置的输出进行处理即可,或者直接将BERT不同位置的输出直接输入到下游模型当中。具体的如下所示:
ELMo/GPT/BERT 均为在2018年提出的三个模型,且性能是依次提高的,这里将其放在一起对比,来看看这三者之间的主要区别有哪些
原文链接:Pre-Training with Whole Word Masking for Chinese BERT
Github链接:Pre-Training with Whole Word Masking for Chinese BERT(中文BERT-wwm系列模型)
Whole Word Masking (wwm),暂翻译为全词Mask或整词Mask,是哈工大讯飞联合实验室提出的BERT中文预训练模型的升级版本,主要更改了原预训练阶段的训练样本生成策略。 简单来说,原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词,在生成训练样本时,这些被分开的子词会随机被mask。
在全词Mask中,如果一个完整的词的部分WordPiece子词被mask,则同属该词的其他部分也会被mask,即全词Mask。这样的做法强制模型预测整个的词,而不是词的一部分,即对同一个词不同字符的预测将使得其具有相同的上下文,这将加强同一个词不同字符之间的相关性,或者说引入了先验知识,使得BERT的独立性假设在同一个词的预测上被打破,但又保证了不同的词之间的独立性。
作者将全词Mask的方法应用在了中文中,使用了中文维基百科(包括简体和繁体)进行训练,并且使用了哈工大LTP作为分词工具,即对组成同一个词的汉字全部进行Mask。这样一个简单的改进,使得同样规模的模型,在中文数据上的表现获得了全方位的提升
从模型结构上看,RoBERTa基本没有什么太大创新,最主要的区别有如下几点:
动态改变mask策略,把数据复制10份,然后统一进行随机mask;
其他的区别就在于学习率/数据量/batch_size 等
作者认为BERT在中文文本中的MLM预训练模型很容易使得模型提取到字搭配这种低层次的语义信息,而对于短语以及实体层次的语义信息抽取能力是较弱的。因此将外部知识引入大规模预训练语言模型中,提高在知识驱动任务上的性能。具体有如下三个层次的预训练任务:
ERNIE 2.0相比于 1.0 来说,主要的改进在于采取 Multi-task learning(多任务同时学习,同时学习的任务数量逐渐增多)以及 Continue-Learning(不同任务组合轮番学习)的机制。其训练任务包括了三个级别的任务:
XLNet针对自回归语言模型单向编码以及BERT类自编码语言模型的有偏估计的缺点,提出了一种广义自回归语言预训练方法。
排列语言模型的思想就是在自回归和自编码的方式中间额外添加一个步骤,即可将两者完美统一起来,具体的就是希望语言模型从左往右预测下一个字符的时候,不仅要包含上文信息,同时也要能够提取到对应字符的下文信息,且不需要引入Mask符号。即在保证位置编码不变的情况下,将输入序列的顺序打乱,然后预测的顺序还是按照原始的位置编码顺序来预测的,但是相应的上下文就是按照打乱顺序的上下文来看了,这样以来,预测对象词的时候,可以随机的看到上文信息和下文信息。另外,假设序列长度为\(T\),则我们如果遍历\(T!\)种分解方法,并且模型参数是共享的,PLM就一定可以学习到预测词的所有上下文信息。但显然,遍历\(T!\)种上下文计算量是十分大的,XLNet采用的是一个部分预测的方法(Partial Prediction),为了减少计算量,作者只对随机排列后的末尾几个词进行预测,并使得如下期望最大化:
\[max_{\theta} \ E_{Z \sim Z_T}[\sum_{t = 1}^{T}logp_{\theta}(x_{z_t}|x_{z < t})]\]
直接用标准的Transformer来建模PLM,会出现没有目标(target)位置信息的问题。即在打乱顺序之后,我们并不知道下一个要预测的词是一个什么词,这将导致用相同上文预测不同目标的概率是相同的。
XLNet引入了双流自注意力机制(Two-Stream Self-Attention)来解决这个问题。Two-Stream Self-Attention表明了其有两个分离的Self-Attention信息流:
两个信息流的输出同样又作为对应的下一层的双信息流的输入。而随机排列机制实际上是在内部用Mask Attention的机制实现的。
Transformer-XL是 XLNet 的特征抽取结构,其相比于传统的Transformer能捕获更长距离的单词依赖关系。
原始的Transformer的主要缺点在于,其在语言建模中会受到固定长度上下文的限制,从而无法捕捉到更长远的信息。
Transformer-XL采用片段级递归机制(segment-level recurrence mechanism)和相对位置编码机制(relative positional encoding scheme)来对Transformer进行改进。
片段级递归机制:指的是当前时刻的隐藏信息在计算过程中,将通过循环递归的方式利用上一时刻较浅层的隐藏状态,这使得每次的计算将利用更大长度的上下文信息,大大增加了捕获长距离信息的能力。
相对位置编码:Transformer本身引入了三角函数向量作为位置编码向量。而Transformer-XL复用了上文的信息,这就导致位置编码出现重叠,因此采用了训练的方式得到相对位置编码向量。
未完待续...
参考链接
https://zhuanlan.zhihu.com/p/76912493
https://zhuanlan.zhihu.com/p/89894807
https://zhuanlan.zhihu.com/p/37684922
https://zhuanlan.zhihu.com/p/56865533
https://zhpmatrix.github.io/2019/02/16/transformer-multi-task/
https://zhuanlan.zhihu.com/p/57251615
https://zhuanlan.zhihu.com/p/68295881
https://www.zhihu.com/question/316140575