NLP入门(5)— NLP经典预训练模型

前言

上一期介绍了近年来大火的Transformer,因为其强大的功能,到现在为止各大热门的预训练模型都是以它为基础结构的。本篇博客就来介绍一些NLP领域使用的经典预训练模型

预训练模型

首先了解一下预训练模型的概念。我们知道,在深度学习领域,尤其是在自然语言处理领域,神经网络的深度通常无法想象。深度学习庞大的参数量对运行设备的性能也提出了很高的要求,有时即使有着最*性能的设备,一个深度模型也需要跑上数天。而每一次模型运行完后,下一次再使用时又需要重新训练,但最终参数变化也许并不大,整个过程耗时耗力

因此大家就想,能不能有一个训练的还不错的模型,不要每次都从头开始训练,只需要在这个模型参数上进行小小的修整就能满足自己的任务需求,这样就可以节省大量的运算时间了。这就是预训练模型提出设想的初衷。

预训练模型可以看做是一个泛化性能很不错的模型,自带了已经训练好的参数,这些参数并不是随机生成的,而是通过已有的大量数据集训练得到的。相当于大部分费时间的工作已经提前做好了,我们使用时,只需要根据自己具体的下游任务对模型进行微调就可以了。

ELMo

我们在NLP入门(1)中就提到过了Word2Vec,虽然相比于one-hot来说进步不小,但是也有一些问题影响着训练的效果:

  1. 遇到一词多义的问题时,一个word的embedding表示往往只有固定个数,无法动态进行调整
  2. 由于Word2Vec网络结构的特点,其输入上下文的长度是固定的,因此其根据上下文语境理解的语义是有限的

针对上述问题,ELMo(Embedding from Language Models)被提出。ELMo的网络结构其实就是一个两层的双向LSTM结构(Bi-LSTM),输入输出就是RNN的过程。
NLP入门(5)— NLP经典预训练模型
从上面图可以看出,ELMo会将每个输入分别交给两个方向的LSTM,通过这种方式,使得其能够将所有输入的上下文都关联起来,做到对词向量的动态语义调整
NLP入门(5)— NLP经典预训练模型
有人说,这不就是个简单的双向LSTM嘛,有什么特别的吗?既然提到了它是预训练模型,那就得好好说下它的预训练方式了。

  1. 通过一堆不需要标注的语句就可以对ELMo进行训练了,运算过程中可以得到每一层LSTM的中间输出。第一层的双向LSTM层的输出,这一层能学习到更多句法特征;第二层的双向LSTM的输出,这一层能学习到更多词义特征。
  2. 将得到的每一层中间输出按照一定权重相加,权重大小由下游任务学习得到,不同的任务各层的权重会有区别。这样,词向量的分布是动态的,不再是固定不变的。
    NLP入门(5)— NLP经典预训练模型
    权重是通过模型的训练学习得来的,上面的图片直观展示了不同下游任务所训练出来的权重。

最后来说一下ELMo的缺点:

  1. 尽管使用双向RNN可以一定程度上考虑到前后文,但是目标函数以线性相加的方式实现,在各自方向上仍然只能处理单向序列
  2. 即使使用LSTM结构,仍然无法有效照顾到根据所有输入进行语义推测
  3. RNN只有等待上一个输入运算结束才能进行下一轮运算

这些缺点其实也是因为ELMo本身结构特点而决定的。

BERT

接下来介绍的就是开启NLP领域新时代的预训练模型:BERT(Bidirectional Encoder Representations from Transformers)。它是由谷歌基于Transformer提出的预训练模型,以它训练得到的模型在各项NLP任务中均得到了远超以往的分数,可谓是显著的提升,因此震惊业界。

其实在BERT之前,OpenAI已经基于Transformer发布了一个预训练模型GPT。不过GPT是Transformer的decoder部分,而BERT是Transformer的encoder部分,关于这两部分的区别其实在上一期已经讲得很清楚了,如果不明白大家可以去看看。总的来说其实就是,GPT只能对前文输入进行attention计算,无法参照后文,具体的结构如下图所示。
NLP入门(5)— NLP经典预训练模型
和ELMo一样的是,训练时不需要对训练样本进行任何标注,直接搜集大量语句输入即可。

对比ELMo,虽然都是“双向”,但目标函数其实是不同的。ELMo是分别以前文联合概率后文联合概率作为目标函数,独立训练两个representation然后拼接,而BERT则是以全文联合概率作为目标函数训练LM。

BERT主要实现的功能即为输入语句输出语句中每一个word对应的embedding。但是如果是中文,建议以字为单位输入更好,因为中文的常见字只有4K个,词语却有无数,这样维度不致于太大。

BERT预训练时使用的方法有两种。

Masked LM

在训练过程中随机mask 15%的token,而不是把像CBOW一样把每个词都预测一遍。最终的损失函数只计算被mask掉那个token。

如果一直用标记[MASK]代替(在实际预测时是碰不到这个标记的)会影响模型,所以随机mask的时候10%的时间会被替代成其他单词,10%的时间不替换,剩下80%的时间才被替换为[MASK]

[MASK]的输出会接入一个线性多分类器,让多分类器来预测token所代表的的词汇。因为线性多分类器的分类性能并不强,因此只有学习到一个好的embedding表示,那么才能被线性分类器正确分类,正是基于这样一个思想使得这个模型能够work。

Masked LM预训练阶段模型是不知道真正被mask的是哪个词,所以模型每个词都要关注。基于这个思想,BERT能够做到照顾全文来进行语义理解。
NLP入门(5)— NLP经典预训练模型

Next Sentence Prediction

训练的输入是句子A和B,B有一半的几率是A的下一句,输入这两个句子,模型预测B是不是A的下一句

在输入前添加一个[CLS]的token表示模型要做分类任务。对应的embedding输入线性二分类器输出是否应该将两个句子接在一起。在两个句子中间添加一个[SEP]作为间隔指示。
NLP入门(5)— NLP经典预训练模型

BERT可以被用作抽取词向量的工具,更可以将其和下游的任务进行结合。关于BERT的应用不做展开,之后有机会的话会详细介绍其中一种任务的预训练模型应用。

ERNIE

ERNIE(Enhanced Representation through Knowledge Integration)是百度基于BERT针对中文预训练策略进行改良的模型。

ERNIE和BERT是相同的结构,ERNIE1.0在预训练阶段的策略与BERT稍有不同。ERNIE的隐码语言模型盖住的不是一个字而是词或短语、命名实体,这样去预测整体。这样能够更好地让模型学习到正确的语义。可以说是专为中文定制的预训练模型。
NLP入门(5)— NLP经典预训练模型
ERNIE现在基于百度开发的深度学习框架飞桨,同时也有免费的AI学习开放平台,因此可以免费在上面进行学习和尝试。

总结

关于之前BERT的mask策略,如果看过李宏毅视频或者其他介绍资料时应该都会觉得和我说的有所出入,但是其实论文的原意就是80%的时间是使用mask的,而并不是说80%的token会被mask掉,这是一种误解,希望大家知道。

至此,可以说NLP入门的内容已经结束了,之后有时间会分享自己在做实验时的实操步骤,本人也在学习当中,因此希望分享出来与大家共同进步!

参考资料

  1. 李宏毅 深度学习19(完整版)国语
  2. BERT论文解读