NLP之预训练

内容是结合:https://zhuanlan.zhihu.com/p/49271699 可以直接看原文

预训练一般要从图像处理领域说起:
可以先用某个训练集合比如训练集合A或者训练集合B对这个网络进行预先训练,在A任务上或者B任务上学会网络参数,然后存起来以备后用。假设我们面临第三个任务C,网络结构采取相同的网络结构,在比较浅的几层CNN结构,网络参数初始化的时候可以加载A任务或者B任务学习好的参数,其它CNN高层的参数仍然需要随机初始化。之后我们用C任务的训练数据来训练网络,此时有两种做法,一种是浅层加载的参数在训练C任务过程中不动,这种方法被称为“Frozen”;另外一种是底层网络参数尽管被初始化了,在C任务训练过程中仍然随着训练的进程不断改变,这种一般叫“Fine-Tuning”(微调),顾名思义,就是更好地把参数进行调整使得其更适应当前的C任务。一般图像或者视频领域要做预训练一般都这么做。
那么为什么这种预训练的思路是可行的?
就图像处理的人脸识别方面而言,目前我们已经知道,对于层级的CNN结构来说,不同层级的神经元学习到了不同类型的图像特征,由底向上特征形成层级结构,越是底层的特征越是所有不论什么领域的图像都会具备的比如边角线弧线等底层基础特征,越往上抽取出的特征越与手头任务相关。正因为此,所以预训练好的网络参数,尤其是底层的网络参数抽取出特征跟具体任务越无关,越具备任务的通用性,所以这是为何一般用底层预训练好的参数初始化新任务网络参数的原因。而高层特征跟任务关联较大,实际可以不用使用,或者采用Fine-tuning用新数据集合清洗掉高层无关的特征抽取器。
预训练的好处在哪?
由于底层特征的通用性,可以先用大型的图像数据集抽取底层的特征,数据量越大抽取的特征越好,随后对于具体的任务底层特征可以直接使用通过大型数据集训练出的特征(神经网络由于在反向传播中通过链式求导法则对参数进行优化,网络层数过多时梯度在回传过程中不断弥散,这一神经网络的先天不足导致神经网络存在训练难问题,接近底层的参数更新粒度很小,因此事先通过大型数据进行预训练,得到通用性较强的底层参数,然后直接应用到下游的具体任务中,可以使得模型效果很好),由于高层数据和具体任务的联系过大,因此可以结合任务的相关数据集对高层数据集进行微调,这样即使相关数据集过小也能取得很好的效果。

NLP领域预训练的发展(从Word EmbeddingBERT

Word Embedding->Word2Vec->ELMO->GPT->BERT

既然预训练在图像处理领域效果这么好,那么NLP领域为什么没有相应的预训练,其实也有,最早的预训练是Word Embedding,只不过提升的效果不是特别多。同时需要注意的是:NLP里面做预训练一般的选择是用语言模型任务来做(具体见文档中NLP的语言模型)。

Word Embedding最早是由神经网络语言模型作为副产品产出的,它所创建的语言模型的主要任务是根据窗口大小内的上文预测下一个词。最火的Word Embedding的工具是Word2Vec,它的主任务就是获得词向量。

预训练的本质是什么?或者说在NLP领域预训练的重要性在哪?

本质上预训练是通过设计好一个网络结构来做语言模型任务,然后把大量甚至是无穷尽的无标注的自然语言文本利用起来,预训练任务把大量语言学知识抽取出来编码到网络结构中,当某一具体任务带有标注信息的数据有限时,这些先验的语言学特征当然会对当前任务有极大的特征补充作用,因为当数据有限的时候,很多语言学现象是覆盖不到的,泛化能力就弱,集成尽量通用的语言学知识自然会加强模型的泛化能力。如何引入先验的语言学知识其实一直是NLP尤其是深度学习场景下的NLP的主要目标之一,不过一直没有太好的解决办法,而ELMO/GPT/Bert的这种两阶段模式看起来无疑是解决这个问题自然又简洁的方法,这也是这些方法的主要价值所在。

注意:NLP里面做预训练一般的选择是用语言模型(可以结合前面的博文语言模型篇)任务来做。NLP领域最早的预训练是Word Embedding,它就是大名鼎鼎的神经网络语言模型,它所建立的语言模型的任务是通过输入前面的t-1个词来预测第t个词(类似于N-gram文法模型的思想),在这个语言模型任务中词向量只是作为副产物产出。随后谷歌基于此推出了Word2vec,有两种训练方法,CBOW和skip-gram,其对应的语言模型任务不同,前者是根据窗口大小内的上下文来预测中心词,后者是根据中心词来预测窗口大小内上下文词。为什么说它是一个预训练,这要从它的使用来看,在NLP任务中会先通过tf.nn.embedding_lookup完成id向词向量的映射,它的内部机理是把预先训练好的词向量跟一个one_hot形式的矩阵相乘进而得到词向量,看这样就把网络的初始输入通过预先训练好的词向量初始化了,从而说明其是预训练。Word2vec最大的问题是他没有解决多义词的问题,同一词汇在不同语境中所代表的意思不同,但是通过Word2vec得到的词向量不管词所处的语境如何,都会用相同的词向量进行表示,词向量训练好了就不变了。

为了克服Word2vec的缺点,可以使用ELMO,它可以融入语境特征,因为代表每个单词的向量不是相同的,会根据具体语境变换。它所建立的语言模型的任务是根据单词的上文去正确预测单词,以及根据单词的下文去正确预测单词。它的网络结构一般采用双层双向LSTM(这个可以自己设定),句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。也就是说,ELMO的预训练过程不仅仅学会单词的Word Embedding,还学会了一个双层双向的LSTM网络结构,而这两者后面都有用。

具体它该如何使用?先通过语料pre-train一个语言模型,训练完之后把三层的Embedding通过一定的权重相乘相加,再和下游任务中的Word2vec获得的词向量进行拼接作为网络的输入。句子X中每个单词在ELMO网络中都能获得对应的三个Embedding,之后给予这三个Embedding中的每一个Embedding一个权重(这个权重是结合训练语料训练得来的),根据各自权重加权求和,将三个Embedding整合成一个。然后将整合后的这个Embedding作为X句在自己任务的那个网络结构中对应单词的输入,以此作为补充的新特征给下游任务使用。

那么ELMO(Embedding from Language Models),它是在Deep contextualized word representation(深度语境化词语表达)论文中提出的,论文的题目更能表现其特性。又有什么不足呐,只是事后和GPT(Generative Pre-Training生成性预训练)以及BERT(Bidirectional Encoder Representations from Transformers)比在特征抽取器方面它选用的不是Transformer,同时它采用拼接的方式融合双向的特征,相对而言融合能力较弱。

GPT采用了Transformer作为特征提取器,但是它所建立的语言模型是根据单词的上文预测单词,没有使用双向的信息。对于如何使用需要根据不同任务进行具体的网络构造。首先,对于不同的下游任务来说,本来你可以任意设计自己的网络结构,现在不行了,你要向GPT的网络结构看齐,把任务的网络结构改造成和GPT的网络结构是一样的。然后,在做下游任务的时候,利用第一步预训练好的参数初始化GPT的网络结构,这样通过预训练学到的语言学知识就被引入到你手头的任务里来了,这是个非常好的事情。再次,你可以用手头的任务去训练这个网络,对网络参数进行Fine-tuning,使得这个网络更适合解决手头的问题。

BERT(Bidirectional Encoder Representations from Transformers)采用了Transformer作为特征提取器,同时它所建立的语言模型是根据单词的上下文预测单词,引入了masked language model对上下文信息进行了更加充分的应用。

 

 

原文地址:https://www.cnblogs.com/dyl222/p/11041853.html