内容是结合: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 Embedding到BERT)学习
Word Embedding->Word2Vec->ELMO->GPT->BERT优化
既然预训练在图像处理领域效果这么好,那么NLP领域为何没有相应的预训练,其实也有,最先的预训练是Word Embedding,只不过提高的效果不是特别多。同时须要注意的是:NLP里面作预训练通常的选择是用语言模型任务来作(具体见文档中NLP的语言模型)。编码
Word Embedding最先是由神经网络语言模型做为副产品产出的,它所建立的语言模型的主要任务是根据窗口大小内的上文预测下一个词。最火的Word Embedding的工具是Word2Vec,它的主任务就是得到词向量。spa
预训练的本质是什么?或者说在NLP领域预训练的重要性在哪?设计
本质上预训练是经过设计好一个网络结构来作语言模型任务,而后把大量甚至是无穷尽的无标注的天然语言文本利用起来,预训练任务把大量语言学知识抽取出来编码到网络结构中,当某一具体任务带有标注信息的数据有限时,这些先验的语言学特征固然会对当前任务有极大的特征补充做用,由于当数据有限的时候,不少语言学现象是覆盖不到的,泛化能力就弱,集成尽可能通用的语言学知识天然会增强模型的泛化能力。如何引入先验的语言学知识其实一直是NLP尤为是深度学习场景下的NLP的主要目标之一,不过一直没有太好的解决办法,而ELMO/GPT/Bert的这种两阶段模式看起来无疑是解决这个问题天然又简洁的方法,这也是这些方法的主要价值所在。code
注意:NLP里面作预训练通常的选择是用语言模型(能够结合前面的博文语言模型篇)任务来作。NLP领域最先的预训练是Word Embedding,它就是大名鼎鼎的神经网络语言模型,它所创建的语言模型的任务是经过输入前面的t-1个词来预测第t个词(相似于N-gram文法模型的思想),在这个语言模型任务中词向量只是做为副产物产出。随后谷歌基于此推出了Word2vec,有两种训练方法,CBOW和skip-gram,其对应的语言模型任务不一样,前者是根据窗口大小内的上下文来预测中心词,后者是根据中心词来预测窗口大小内上下文词。为何说它是一个预训练,这要从它的使用来看,在NLP任务中会先经过tf.nn.embedding_lookup完成id向词向量的映射,它的内部机理是把预先训练好的词向量跟一个one_hot形式的矩阵相乘进而获得词向量,看这样就把网络的初始输入经过预先训练好的词向量初始化了,从而说明其是预训练。Word2vec最大的问题是他没有解决多义词的问题,同一词汇在不一样语境中所表明的意思不一样,可是经过Word2vec获得的词向量无论词所处的语境如何,都会用相同的词向量进行表示,词向量训练好了就不变了。orm
为了克服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对上下文信息进行了更加充分的应用。