为何预训练语言模型能够达到如此好的效果?主要有如下几点:
- word2vec等词向量模型训练出来的都是静态的词向量,即同一个词,在任何的上下文当中,其向量表征是相同的,显然,这样的一种词向量是无法体现一个词在不同语境中的不同含义的。
- 我们采用预训练模型来代替词向量的关键在于,其能够更具上下文的不同,对上下文中的词提取符合其语境的词表征,该词表征向量为一个动态向量,即不同上下文输入预训练模型后,同一个词的词表征向量在两个上下文中的词表征是不同的。
预训练任务简介
总的来说,预训练模型包括两大类:自回归语言模型与自编码语言模型
自回归语言模型
通过给定文本的上文,对当前字进行预测,训练过程要求对数似然函数最大化,即:
代表模型:ELMo/GPT1.0/GPT2.0/XLNet
优点:该模型对文本序列联合概率的密度估计进行建模,使得该模型更适用于一些生成类的NLP任务,因为这些任务在生成内容的时候就是从左到右的,这和自回归的模式天然匹配。
缺点:联合概率是按照文本序列从左至右进行计算的,因此无法得到包含上下文信息的双向特征表征;
ELMO
ELMo为一个典型的自回归预训练模型,其包括两个独立的单向LSTM实现的单向语言模型进行自回归预训练,不使用双向的LSTM进行编码的原因正是因为在预训练任务中,双向模型将提前看到上下文表征而对预测结果造成影响。因此,ELMo在本质上还是属于一个单向的语言模型,因为其只在一个方向上进行编码表征,只是将其拼接了而已
细节
- 引入双向语言模型,其实是2个单向语言模型(前向和后向)的集成,这样做的原因在上一节已经解释过了,用共享词向量来进行预训练;
- 通过保存预训练好的2层biLSTM,提取每层的词表征用于下游任务;
ELMO的训练过程
ELMO训练好了之后如何使用
对于下游任务而言,我们需要把所有层的ELMo表征整合为一个单独的向量,最简单的方式是只用最上层的表征,而更一般的,我们采用对所有层的ELMo表征采取加权和的方式进行处理,即:
得到ELMo表征之后,则需要将其用于下游任务中去,注意,ELMo的微调过程中,并不是严格意义上的微调,预训练模型部分通常是固定的,不参与到后续训练当中。具体的,有以下几种操作方法:
方法一:直接将ELMo表征与词向量拼接,输入到下游任务当中去;
方法二:直接将ELMo表征与下游模型的输出层拼接
另外,还可以在ELMo模型中加入dropout, 以及采用 L2 loss的方法来提升模型。
ELMO为什么可以区分多义词
在ELMo第一阶段训练完成之后,将句子输入模型中在线提取各层embedding的时候,每个单词(token)对应两边LSTM网络的对应节点,那两个节点得到的embedding是动态改变的,会受到上下文单词的影响,周围单词的上下文不同应该会强化某种语义,弱化其它语义,这样就达到区分多义词的效果
ELMo把三种不同的向量叠加的意义是什么?这样做能达到什么样的效果?
- 一是之前很多方法都只用了最顶层LSTM的hidden state,但是通过实验验证,在很多任务中,将每一层hidden state融合在一起会取得更好的效果;
- 二是在上述实验中得到结论,每一层LSTM得到单词的embedding所蕴含的信息是不一样的,因此将所有信息融合起来,会让单词embedding的表达更丰富。
来源
https://ac.nowcoder.com/discuss/260001?type=2
https://www.cnblogs.com/sandwichnlp/p/11947627.html
GPT
生成式的预训练模型,与ELMo不同的是,其采用多层Transformer Decoder作为特征抽取器,并且GPT则只采用Context-before这个单词的上文来进行预测,而抛开了下文。