赞
踩
目录
本人是小白一枚,目前还在学习当中,文章内容仅供大家参考(部分内容和图片摘自其他文章,侵删!),若有问题欢迎大家指出!文章末尾说明参考文章和论文的出处。
想要了解自然语言的预训练,得先从图像领域的预训练说起。
上图中就是图像领域预处理的过程,我们先设计好网络结构,可以先用训练集合A或者训练集合B对这个网络进行预先训练,在A任务上或者B任务上学会网络参数,然后存起来以备后用。假设我们面临第三个任务C,网络结构采取相同的网络结构,在比较浅的几层CNN结构,网络参数初始化的时候可以加载A任务或者B任务学习好的参数,其它CNN高层参数仍然随机初始化。之后我们用C任务的训练数据来训练网络,此时有两种做法,一种是浅层加载的参数在训练C任务过程中不动,这种方法被称为“Frozen”;另外一种是底层网络参数尽管被初始化了,在C任务训练过程中仍然随着训练的进程不断改变,这种一般叫“Fine-Tuning”,顾名思义,就是更好地把参数进行调整使得更适应当前的C任务。一般图像或者视频领域要做预训练一般都这么做。
这么做的好处:1.模型复杂,但训练数据少;2.更快收敛
为什么能这么做?
神经网络提取特征时,一般都是由底向上特征形成层级结构。越是底层的特征越是所有不论什么领域的图像都会具备的比如边角线弧线等底层基础特征,越往上抽取出的特征越与手头任务相关。所以这是为何一般用底层预训练好的参数初始化新任务网络参数的原因。而高层特征跟任务关联较大,实际可以不用使用,或者采用Fine-tuning用新数据集合清洗掉高层无关的特征抽取器。
word embedding其实就是NLP里的早期预训练技术。我们先通过大量数据集去获取每个单词的word embedding,再将它应用到具体的下游任务中。NLP里面做预训练一般的选择是用语言模型任务来做,所以我们先来了解一下什么是语言模型。
语言模型可以被认为是自然语言处理各下游任务的基石,其本质就是在回答一个问题:对于一个给定的文本序列,是否具有合理性并对其合理性进行量化.对语言模型的研究经历了文法规则语言模型至概率语言模型,再发展为神经概率语言模型的过程.伴随新式网络结构的出现,以及半监督学习、预训练思想的提出,预训练语言模型成为了当前语言模型研究的新热点.
N元语法模型
神经网络语言模型
上图右侧的矩阵就是每个单词的word embedding值。
预训练语言模型
目前,预训练语言模型主要基于以下 4 种建模思想:(1) 双向语言模型;(2) 隐蔽语言模型;(3) 排序语言模型;(4) 编码器-解码器(encoder-decoder)框架.
2013年最火的用语言模型做Word Embedding的工具是Word2Vec,后来又出了Glove,Word2Vec是怎么工作的呢?看下图。
Word2Vec有两种训练方法,一种叫CBOW,核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词;第二种叫做Skip-gram,和CBOW正好反过来,输入某个单词,要求网络预测它的上下文单词。Word2Vec和NNLM其实是亲兄弟,NNLM是怎么训练的?是输入一个单词的上文,去预测这个单词。这是有显著差异的。为什么Word2Vec这么处理?原因很简单,因为Word2Vec和NNLM不一样,NNLM的主要任务是要学习一个解决语言模型任务的网络结构,语言模型就是要看到上文预测下文,而word embedding只是无心插柳的一个副产品。但是Word2Vec目标不一样,它单纯就是要word embedding的,这是主产品,所以它完全可以随性地这么去训练网络。
有个了word embedding矩阵,我们该如何使用呢?
word embedding有什么缺点呢?这时的word embedding还是静态的word embedding,它无法解决多义词问题。例如,bank这个词,有两个常用的意思,在用语言模型训练的时候,不论什么上下文的句子经过word2vec,都是预测相同的单词bank,而同一个单词占的是同一行的参数空间,这导致两种不同的上下文信息都会编码到相同的word embedding空间里去。所以word embedding无法区分多义词的不同语义,这就是它的一个比较严重的问题。
对于word embedding无法解决多义词问题,在很长的时间里都没有真正地被解决。直到ELMo的出现,它提供了一种简洁优雅的解决方案。
ELMo的本质思想是:事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分,不过这没关系。在实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。所以ELMO本身是个根据当前上下文对Word Embedding动态调整的思路。
ELMO采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练;第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。上图展示的是其预训练过程,它的网络结构采用了双层双向LSTM,目前语言模型训练的任务目标是根据上下文去正确预测目标单词,目标单词之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。图中左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外的上文Context-before;右端的逆向双层LSTM代表反方向编码器,输入的是从右到左的逆序的句子下文Context-after;每个编码器的深度都是两层LSTM叠加。这个网络结构其实在NLP中是很常用的。使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子,句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。也就是说,ELMO的预训练过程不仅仅学会单词的Word Embedding,还学会了一个双层双向的LSTM网络结构。
上面介绍的是ELMO的第一阶段:预训练阶段。那么预训练好网络结构后,如何给下游任务使用呢?上图展示了下游任务的使用过程,比如我们的下游任务仍然是QA问题,此时对于问句X,我们可以先将句子X作为预训练好的ELMO网络的输入,这样句子X中每个单词在ELMO网络中都能获得对应的三个Embedding,之后给予这三个Embedding中的每一个Embedding一个权重a,这个权重可以学习得来,根据各自权重累加求和,将三个Embedding整合成一个。然后将整合后的这个Embedding作为X句在自己任务的那个网络结构中对应单词的输入,以此作为补充的新特征给下游任务使用。对于上图所示下游任务QA中的回答句子Y来说也是如此处理。因为ELMO给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。
ELMo有什么缺点呢?(与GPT和Bert比较)
1.没有采用当时最新的特征提取器transformer
2.拼接方式双向融合特征融合能力弱
我们如果把ELMO这种预训练方法和图像领域的预训练方法对比,发现两者模式看上去还是有很大差异的。除了以ELMO为代表的这种基于特征融合的预训练方法外,NLP里还有一种典型做法,这种做法和图像领域的方式就是看上去一致的了,一般将这种方法称为“基于Fine-tuning的模式”,而GPT就是这一模式的典型开创者。
GPT是“Generative Pre-Training”的简称,从名字看其含义是指的生成式的预训练。GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。上图展示了GPT的预训练过程,其实和ELMO是类似的,主要不同在于两点:首先,特征抽取器不是用的LSTM,而是用的Transformer,上面提到过它的特征抽取能力要强于LSTM,这个选择很明显是很明智的;其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,所谓“单向”的含义是指:语言模型训练的任务目标是根据目标单词的上下文去正确预测单词,目标单词之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。ELMO在做语言模型预训练的时候,预测单词同时使用了上文和下文,而GPT则只采用Context-before这个单词的上文来进行预测,而抛开了下文。这个选择现在看不是个太好的选择,原因很简单,它没有把单词的下文融合进来,这限制了其在更多应用场景的效果,比如阅读理解这种任务,在做任务的时候是可以允许同时看到上文和下文一起做决策的。如果预训练时候不把单词的下文嵌入到Word Embedding中,是很吃亏的,白白丢掉了很多信息。
上面讲的是GPT如何进行第一阶段的预训练,那么假设预训练好了网络模型,后面下游任务怎么用?它有自己的个性,和ELMO的方式大有不同。
上图展示了GPT在第二阶段如何使用。首先,对于不同的下游任务来说,本来你可以任意设计自己的网络结构,现在不行了,你要向GPT的网络结构看齐,把任务的网络结构改造成和GPT的网络结构是一样的。然后,在做下游任务的时候,利用第一步预训练好的参数初始化GPT的网络结构,这样通过预训练学到的语言学知识就被引入到你手头的任务里来了,这是个非常好的事情。再次,你可以用手头的任务去训练这个网络,对网络参数进行Fine-tuning,使得这个网络更适合解决手头的问题。
GPT有什么缺点呢?(与Bert比较)
最主要的缺点就是它是单向语言模型
Bert采用和GPT完全相同的两阶段模型,首先是语言模型预训练;其次是使用Fine-Tuning模式解决下游任务。和GPT的最主要不同在于在预训练阶段采用了类似ELMO的双向语言模型,当然另外一点是语言模型的数据规模要比GPT大。所以这里Bert的预训练过程不必多讲了。第二阶段,Fine-Tuning阶段,这个阶段的做法和GPT是一样的。需要对下游任务进行改造去符合Bert的网络结构。
Bert最关键两点,一点是特征抽取器采用Transformer;第二点是预训练的时候采用双向语言模型。
现在思考一个问题:对于Transformer来说,怎么才能在这个结构上做双向语言模型任务呢?
其实有一种很直观的思路,看看ELMO的网络结构图,只需要把两个LSTM替换成两个Transformer,一个负责正向,一个负责反向特征提取,其实应该就可以。但是Bert没这么做。那么Bert是怎么做的呢?
我们前面提过Word2Vec,它里面有个CBOW训练方法,它的核心思想是:在做语言模型任务的时候,我把要预测的单词抠掉,然后根据它的上文Context-Before和下文Context-after去预测单词。Bert就是这么做的。
Bert的创新点:使用隐蔽语言模型和下一句预测(next sentence prediction,简称 NSP)两个预训练目标,其中隐蔽语言模型本质思想是CBOW;NSP 任务本质上来自于Word2Vec 的负采样技术.(Word2Vec的负采样(Negative Sampling)技术是一种优化算法,用于训练Word2Vec模型时的负样本采样。在传统的Skip-gram模型中,每个正样本都要与所有其他单词作为负样本进行比较,这会导致计算量非常大。负采样技术通过每次随机选择少量(通常几十个到几百个)负样本来代替全部负样本,从而大大减少了计算量。同时,为了保证采样的效果,负采样需要根据每个单词出现的频率来计算其被选中的概率,出现频率越高的单词被选中的概率越大)
隐蔽语言模型:选取输入序列中 15%的元素作为待隐蔽的位置,待隐蔽位置中 80%的位置被[MASK]替换,10%的位置使用其他元素替换,10%的位置不作改变.这一模型引入了降噪自编码器的思想,迫使模型从人为加入的噪声中恢复原始的输入,从而学习共现信息.
NSP指的是做语言模型预训练的时候,分两种情况选择两个句子,一种是选择语料中真正顺序相连的两个句子;另外一种是第二个句子从语料库中抛色子,随机选择一个拼到第一个句子后面。我们要求模型除了做上述的Masked语言模型任务外,附带再做个句子关系预测,判断第二个句子是不是真的是第一个句子的后续句子。之所以这么做,是考虑到很多NLP任务是句子关系判断任务,单词预测粒度的训练到不了句子关系这个层级,增加这个任务有助于下游句子关系判断任务。所以可以看到,它的预训练是个多任务过程。这也是Bert的一个创新。
本节将对 BERT 提出后,研究人员对预训练模型所作的改进进行阐述和分析.目前,对预训练语言模型的改进主要集中在两个方向:一方面是针对原 BERT 模型中的 MLM 以及 NSP 任务进行扩展或者替换;另一方面则是对模型的网络结构进行改进,以使模型学习到更丰富的表示.
目前,主流预训练语言模型都采用预训练-微调两阶段的思路进行应用,因而在预训练阶段需要大规模的无监督数据对模型进行预训练.在英文领域,由于国外对预训练语言模型的研究起步较早,因此
在英文领域,预训练阶段主要采用以下 4 个数据集.
BooksCorpus[97]:图书语料库最初是研究人员为研究句子相似度而从网络上爬取收集形成的数据集.该数据集中共包含有 16 个种类的 11 038 本图书,总单词数达到了 9.8 亿个,词汇表数目为 131 余万个,该语料库与英文维基百科(English Wikipedia)语料是当前主流方法中最为常用的语料数据.
English Wikipedia:英文维基百科数据是由维基百科官方定期更新和发布的,其格式为 Web 文本原始数据,需进行预处理.目前多数模型采用的是共计 25 亿个单词的版本.
Giga5[98]:全称为 English Gigaword Fifth Edition,这一数据集由语言数据联合会(Linguistic Data Consortium,简称 LDC)所提出,共包含有来自法新社、美联社、纽约时报和新华社的 400 万篇新闻文章.
ClueWeb 2012-B[99]:该语料数据是在ClueWeb09的基础上扩展而来的,由7.33亿个英文网页构成,主要来源于对 Web 网页、推特链接和维基旅行的爬取.
在英文领域,对预训练语言模型的基准测试已经形成了规模,目前来看,主要由 3 种基准测试组成:GLUE、SQuAD 和 RACE.
在中文领域,由于提出的方法还较少,所采用的训练数据集种类还不统一。在中文的基准测试任务中,同样由于研究起步较晚的原因,并未形成类似于英文中 GLUE 等成型的测试数据集,对基准测试数据的选择还存在一定分歧。
自 GPT、BERT 等一系列使用 Transformer 作为特征抽取器的语言模型出现后,其巨大的模型规模使得语言模型的训练和预测都面临着计算资源和时间上的高度消耗,导致语言模型在边缘设备和低计算资源设备上的部署和应用难以实现,限制了预训练技术在实际应用中的作用.目前,预训练语言模型规模压缩主要有 3 种方法:(1) 知识蒸馏;(2) 参数量化;(3) 网络剪枝.
预训练模型没有直接获得外部知识,如实际经验或先前知识,而是通过对巨大数据集的分析和模式识别来推断语言知识。因此,在某些场景下,预训练语言模型可能无法理解特定领域的专业术语或概念,需要额外的专业知识和上下文支持。
多模态目前而言主要涉及视觉和文本两种模态的融合.就目前多模态学习在预训练语言模型中的研究进展而言,在网络结构上可大致分为两类:一类直接将视觉和文本流进行跨模态预训练;另一类则是先对两个模态编码,然后再使用编码后的表示进行跨模态融合.
对于当前NLP的发展方向有两点非常重要,一个是需要更强的特征抽取器,目前看Transformer会逐渐担当大任,但是肯定还是不够强的,需要发展更强的特征抽取器;第二个就是如何简单高效地引入大量无监督数据中包含的语言学知识。
主要参考:
从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 - 张俊林的文章 - 知乎 https://zhuanlan.zhihu.com/p/49271699
《基于深度学习的语言模型研究进展》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。