天天看点

详解nlp预训练词向量(上)——从word2vec到ELMO

长话短说

  • Bert具备广泛的通用性,就是说绝大部分NLP任务都可以采用类似的两阶段模式直接去提升效果。客观的说,把Bert当做最近两年NLP重大进展的集大成者更符合事实。
  • 串起来这个故事的脉络就是自然语言的预训练过程,但是落脚点还是在Bert身上。要讲自然语言的预训练,得先从图像领域的预训练说起。

图像领域的预训练

  • 预训练在图像领域的应用
    • 1.训练数据小,不足以训练复杂网络
    • 2.加快训练速度
    • 3.参数初始化,先找到好的初始点,有利于优化
    • 把A任务和B认为的的网络参数先保存下来,当遇到C任务时,两种做法:
      • “Frozen”:一种是浅层加载的参数在训练C任务过程中不动
      • “Fine-Tuning”:底层网络参数尽管被初始化了,在C任务训练过程中仍然随着训练的进程不断改变
  • 对于层级的CNN结构来说,不同层级的神经元学习到了不同类型的图像特征,由底向上特征形成层级结构;越往上层越和任务有关正因为此,所以预训练好的网络参数,尤其是底层的网络参数抽取出特征跟具体任务越无关,越具备任务的通用性,所以这是为何一般用底层预训练好的参数初始化新任务网络参数的原因。
    详解nlp预训练词向量(上)——从word2vec到ELMO
  • 一般我们喜欢用ImageNet来做网络的预训练,主要有两点:
    • 1.一方面ImageNet是图像领域里有超多事先标注好训练数据的数据集合,分量足是个很大的优势
    • 2.另外一方面因为ImageNet有1000类,类别多,算是通用的图像数据,跟领域没太大关系,通用性好
  • 在说Word Embedding之前,先更粗略地说下语言模型,因为一般NLP里面做预训练一般的选择是用语言模型任务来做。
    详解nlp预训练词向量(上)——从word2vec到ELMO
  • 什么是语言模型?为了能够量化地衡量哪个句子更像一句人话,可以设计如上图所示函数,核心函数P的思想是根据句子里面前面的一系列前导单词预测后面跟哪个单词的概率大小(理论上除了上文之外,也可以引入单词的下文联合起来预测单词出现概率)。句子里面每个单词都有个根据上文预测自己的过程,把所有这些单词的产生概率乘起来,数值越大代表这越像一句人话。
  • 它生于2003,火于2013;学习任务是输入某个句中单词  前面句子的t-1个单词,要求网络正确预测单词Bert,即最大化:
    详解nlp预训练词向量(上)——从word2vec到ELMO
    详解nlp预训练词向量(上)——从word2vec到ELMO
  • 前面任意单词  用Onehot编码(比如:0001000)作为原始单词输入,之后乘以矩阵Q后获得向量  ,每个单词的  拼接,上接隐层,然后接softmax去预测后面应该后续接哪个单词。这个  是什么?这其实就是单词对应的Word Embedding值,那个矩阵Q包含V行,V代表词典大小,每一行内容代表对应单词的Word embedding值。只不过Q的内容也是网络参数,需要学习获得,训练刚开始用随机值初始化矩阵Q,当这个网络训练好之后,矩阵Q的内容被正确赋值,每一行代表一个单词对应的Word embedding值。所以你看,通过这个网络学习语言模型任务,这个网络不仅自己能够根据上文预测后接单词是什么,同时获得一个副产品,就是那个矩阵Q,这就是单词的Word Embedding是被如何学会的
  • 2013年最火的用语言模型做Word Embedding的工具是Word2Vec,后来又出了Glove;Word2Vec是怎么工作的呢?看下图。
    详解nlp预训练词向量(上)——从word2vec到ELMO
  • Word2Vec有两种训练方法

    • 一种叫CBOW,核心思想是从一个句子里面把一个词抠掉,用这个词的上文和下文去预测被抠掉的这个词;
    • 第二种叫做Skip-gram,和CBOW正好反过来,输入某个单词,要求网络预测它的上下文单词。
    • 使用Word2Vec或者Glove,通过做语言模型任务,就可以获得每个单词的Word Embedding
    • 效果很不错呦,一个单词表达成Word Embedding后,很容易找出语义相近的其它词汇。
      详解nlp预训练词向量(上)——从word2vec到ELMO
  • eg:使用word2vec,完成QA任务

    • 假设如上图所示,我们有个NLP的下游任务,比如QA,就是问答问题,所谓问答问题,指的是给定一个问题X,给定另外一个句子Y,要判断句子Y是否是问题X的正确答案。
      详解nlp预训练词向量(上)——从word2vec到ELMO
    • 这乍看上去好像是个查表操作,不像是预训练的做法是吧?其实不然,那个Word Embedding矩阵Q其实就是网络Onehot层到embedding层映射的网络参数矩阵。所以你看到了,使用Word Embedding等价于什么?等价于把Onehot层到embedding层的网络用预训练好的参数矩阵Q初始化了
    • 下游NLP任务在使用Word Embedding的时候也类似图像有两种做法,一种是Frozen,就是Word Embedding那层网络参数固定不动;另外一种是Fine-Tuning,就是Word Embedding这层参数使用新的训练集合训练也需要跟着训练过程更新掉。
    • 上面这种做法就是18年之前NLP领域里面采用预训练的典型做法

从Word Embedding到ELMO(Embedding from Language Models)

  • ELMO提供了一种简洁优雅的解决方案。
  • 这片在Word Embedding头上笼罩了好几年的乌云是什么?是多义词问题。我们知道,多义词是自然语言中经常出现的现象,也是语言灵活性和高效性的一种体现。多义词对Word Embedding来说有什么负面影响?如上图所示,比如多义词Bank,有两个常用含义,但是Word Embedding在对bank这个单词进行编码的时候,是区分不开这两个含义的,因为它们尽管上下文环境中出现的单词不同,但是在用语言模型训练的时候,不论什么上下文的句子经过word2vec,都是预测相同的单词bank,而同一个单词占的是同一行的参数空间,这导致两种不同的上下文信息都会编码到相同的word embedding空间里去。所以word embedding无法区分多义词的不同语义,这就是它的一个比较严重的问题。
    详解nlp预训练词向量(上)——从word2vec到ELMO
  • 在此之前的Word Embedding本质上是个静态的方式,所谓静态指的是训练好之后每个单词的表达就固定住了,以后使用的时候,不论新句子上下文单词是什么,这个单词的Word Embedding不会跟着上下文场景的变化而改变
  • 这是为何说它是静态的,这也是问题所在。ELMO的本质思想是:我事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分,不过这没关系。在我实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。
  • 所以ELMO本身是个根据当前上下文对Word Embedding动态调整的思路。
    详解nlp预训练词向量(上)——从word2vec到ELMO
  • 原理;

    • ELMO采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练;第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。
    • ELMO的第一阶段:预训练阶段。
      • 下图展示的是其预训练过程,它的网络结构采用了双层双向LSTM,目前语言模型训练的任务目标是根据单词  的上下文去正确预测单词  ,  之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。图中左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词外  的上文Context-before;右端的逆向双层LSTM代表反方向编码器,输入的是从右到左的逆序的句子下文Context-after;每个编码器的深度都是两层LSTM叠加。这个网络结构其实在NLP中是很常用的。
        详解nlp预训练词向量(上)——从word2vec到ELMO
      • 使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子  ,句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。也就是说,ELMO的预训练过程不仅仅学会单词的Word Embedding,还学会了一个双层双向的LSTM网络结构,而这两者后面都有用。
    • 第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。
      • 那么预训练好网络结构后,如何给下游任务使用呢?上图展示了下游任务的使用过程,比如我们的下游任务仍然是QA问题,此时对于问句X,我们可以先将句子X作为预训练好的ELMO网络的输入,这样句子X中每个单词在ELMO网络中都能获得对应的三个Embedding,之后给予这三个Embedding中的每一个Embedding一个权重a,这个权重可以学习得来,根据各自权重累加求和,将三个Embedding整合成一个。然后将整合后的这个Embedding作为X句在自己任务的那个网络结构中对应单词的输入,以此作为补充的新特征给下游任务使用。对于上图所示下游任务QA中的回答句子Y来说也是如此处理。因为ELMO给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”
        详解nlp预训练词向量(上)——从word2vec到ELMO
    • 这个图是TagLM采用类似ELMO的思路做命名实体识别任务的过程,其步骤基本如上述ELMO的思路。TagLM的论文发表在2017年的ACL会议上,作者就是AllenAI里做ELMO的那些人,所以可以将TagLM看做ELMO的一个前导工作。
      详解nlp预训练词向量(上)——从word2vec到ELMO
    • 另外ULMFiT使用的是三阶段模式,在通用语言模型训练之后,加入了一个领域语言模型预训练过程
    • 第一层LSTM编码了很多句法信息,这在这里起到了重要作用。
      详解nlp预训练词向量(上)——从word2vec到ELMO
    • 效果很好但是也存在很大局限性
      详解nlp预训练词向量(上)——从word2vec到ELMO
    • ELMO有什么值得改进的缺点呢?首先,一个非常明显的缺点在特征抽取器选择方面,ELMO使用了LSTM而不是新贵Transformer,Transformer是谷歌在17年做机器翻译任务的“Attention is all you need”的论文中提出的,引起了相当大的反响,很多研究已经证明了Transformer提取特征的能力是要远强于LSTM的。另外一点,ELMO采取双向拼接这种融合特征的能力可能比Bert一体化的融合特征方式弱
    • 我们如果把ELMO这种预训练方法和图像领域的预训练方法对比,发现两者模式看上去还是有很大差异的。除了以ELMO为代表的这种基于特征融合的预训练方法外,NLP里还有一种典型做法,这种做法和图像领域的方式就是看上去一致的了,一般将这种方法称为“基于Fine-tuning的模式”,而GPT就是这一模式的典型开创者。

GPT和BERT在下篇文章再分享;

继续阅读