小言_互联网的博客

[深度学习]自然语言处理---ELMo

274人阅读  评论(0)

原文链接:Deep contextualized word representations

ELMO,是Embedding from Language Model的缩写( Peters等人,2018年),通过无监督预训练多层双向LSTM模型来学习带上下文信息的(Contextualized)单词表示。

1. Motivation

词向量在目前NLP技术发展和应用中具有重要作用,高质量的词向量对下游任务的效果至关重要。
传统word2vec等模型对一个词的表示是固定的,一成不变的,但现实场景中,同样的词在不同语境中往往表达不同的含义,为此,ELMo应运而生。ELMo(Embeddings from Language Models)是一种动态的,语境化的词向量表示方法,可以根据上下文语境来生成相应词的向量表示。

2014年的GloVe的工作中,每个词对应一个vector,对于多义词无能为力。ELMo的工作对于此,提出了一个较好的解决方案。不同于以往的一个词对应一个向量,是固定的。在ELMo世界里,预训练好的模型不再只是向量对应关系,而是一个训练好的模型。使用时,将一句话或一段话输入模型,模型会根据上线文来推断每个词对应的词向量。这样做之后明显的好处之一就是对于多义词,可以结合前后语境对多义词进行理解。比如appele,可以根据前后文语境理解为公司或水果。

ELMo通过深度双向语言模型(biLM)进行训练,主要解决了两个问题:
(1) 学习词汇用法的复杂特性,如语法和语义;
(2) 学习词汇不同语境下的一词多义性;

 

一个简单的例子就是 “苹果”的词向量:

句子1:“我 买了 1斤 苹果”

句子2:“我 新 买了 1个 苹果 X”

在word2vec算法中,“苹果”的词向量固定,无法区分这两句话的区别,而ELMo可以解决语言中的二义性问题,可以带来性能的显著提升。

上面两个文本序列中都出现了“苹果”这个词汇,但是在不同的句子中,它们我的含义显示是不同的,一个属于水果领域,一个属于电子产品呢领域,如果针对“苹果”这个词汇同时训练两个词向量来分别刻画不同领域的信息呢?答案就是使用ELMo。

PS:

ELMo在中文上确实会比word2vec好很多, 使用中文语料测试成功了, 使用200m新闻语料训练语言模型, 然后在对该新闻语料进行分类(10类)。最终测试结果使用ELMO比word2vector高近2个百分点, 而且这还是没有对ELMO优化的情况下。

2. Introduction

2.1 ELMo词向量表示理念

与传统词向量用固定向量的表示不同,ELMo是一种动态词向量表示方法,其最终训练得到一个语言模型。当需要文本s中某个词w的词向量表示时,ELMo通过将s作为输入,得到文本的向量表示,继而获得词w在文本s语境下的词向量表示。
ELMo模型从大规模语料上训练得到的深度双向语言模型(deep biLM)的内部状态学习得到,因此,ELMo的词向量表示是深度的,是biLM内部各层状态的线性组合,而非仅仅取LSTM的最后一层。

2.2 ELMo理念的物理意义

ELMo认为,通过联合biLM的各层内部状态来表示词向量可以表达词语更为丰富的信息,模型底层隐状态表达词语的语法信息(eg:适用于词性标注任务),而上层隐状态则捕捉了词语的语义信息(eg:适用于词义消歧任务)。
大量实验证明,ELMo在多种NLP任务中都获得极好的效果;另外,前人的工作以及论文最后对ELMo与GoVe的分析则证明,词向量的深度表示比仅利用LSTM的最后一层的效果更好。

 

3. ELMo原理介绍

前面也说过ELMo最重要的一点是就是训练语言模型,语言模型的结构如下:

 

他们使用的是一个双向的LSTM语言模型,由一个前向和一个后向语言模型构成,目标函数就是取这两个方向语言模型的最大似然。

前向LSTM结构:

  双向语言模型( bi-LM )是ELMO的基础。模型的输入是由n个token构成的序列,( x1,…,xn),语言模型根据历史的序列预测(x1.....xi-1)下一个token xi的概率。在正向计算(forwar pass)过程中,根据历史之前的序列(x1.....xi-1)预测第i个token xi的概率

 

反向LSTM结构:

在反向计算(backward pass)过程中,根据历史之后的序列(xi+1......xn)预测第i个token xi的概率,

两个方向上的预测过程都是由多层LSTMs建模的,给定输入token xi得到隐状态为h→i,ℓ和h←i,ℓ。最后一层的输出的隐状态为hi,L=[h→i,L;h←i,L]作为输出层的输入,用于得到最终的输出yi。模型共享embedding层和softmax层,分别由θe和θs参数化表示。
 

 

最大似然函数:

该模型的目标函数(loss function)是最小化两个方向的负对数似然( =最大化真实单词的对数似然) :

 

ELMo通过以某种方式将隐藏状态(和初始嵌入)组合在一起来提出情境化嵌入(连接后加权求和)。

 

ELMo中最后的向量是将词的embedding和两个LSTM的输出向量做线性叠加。

ELMo是双向语言模型biLM的多层表示的组合,对于某一个词语 t,一个L层的双向语言模型biLM能够由2L+1个向量表示:

LMo使用双层BiLSTM来训练语言模型,创新是线性组合不同层的word vectors, 作为最终的word representation. 核心公式:

  • 第一层是普通的word embedding 可以用wrod2vec或者glove来得到,或者使用character level得到token embedding, 这部分是general embedding,上下文无关。文中使用的character level的CNN+Highway.
  • 后面连接两个biLSTM 去encode 输入(同时也有残差连接), 每一层LSTM得到的输出(隐状态) 作为每个词的上下文相关的word vectors.
  • 这样每个词就会有(L+1)个词向量,L为biLSTM的层数.
  • 词向量的线性组合,针对不同的任务,不同层的向量做不同的权重加和。 其中权重s是一个维度为L的vector,参与训练。

因此ELMo的基本输入单元为句子,每个词没有固定的词向量,是根据词的上下文环境来动态产生当前词的词向量,常见的场景可以较好解决一词多义的问题,这一点跟word2vec与glove等通用词向量模型是不同的。

 

4. ELMo实际使用

将BiLMs应用到有监督NLP任务

给定一个预训练好的biLM模型和一个有监督的NLP任务,可以很简单的使用biLM来提升任务效果,我们只需要用biLM预测每句话中的词在biLM各层下的表示。然后,用端任务模型学习这些表示的线性组合,具体如下:

首先对于大多数NLP任务最底层(靠近输入层)的结构基本都一样,这让我们可以使用统一的方式将ELMo加进去。给定一个词序列 (t1,....,tN),常规操作是使用预训练好的词嵌入(以及可选的字表示)将这个序列转化为一个上下文无关的词表示 (x1,..., xk) ,然后模型下一步输出一个上下文相关的表示 hk,这一步可以用RNNs, CNNs,或者前馈神经网络。

要将ELMo加入到这个模型,我们首先固定住biLM的权重然后拼接ELMo向量 ELMo-k和 xk ,得到 [xk; ELMo-k] ,将其传入任务模型,比如RNN模型。对于一些任务我们发现将RNN模型的RNN输出hk替换为 [hk; ELMo-k]能带来进一步提升。模型其他部分不做改变,我们甚至可以应用到更加复杂的神经网络中,比如第四部分的SNLI实验,其biLSTMs后面接了一个双向注意力层,又比如指代解析实验中在biLSTMs上面有一个聚类模型作为一层。

最后,我们发现可以对ELMo添加适当的dropout,某些望情况下loss上加L2的正则化会带来好处,通过对ELMo的权重添加归纳偏置让其和biLM层的均值保持接近。

 

ELMO 的本质思想是:我事先用语言模型学好一个单词的 Word Embedding,此时多义词无法区分,不过这没关系。在我实际使用 Word Embedding 的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的 Word Embedding 表示,这样经过调整后的 Word Embedding 更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。所以 ELMO 本身是个根据当前上下文对 Word Embedding 动态调整的思路。

 

ELMO 采用了典型的两阶段过程,第一个阶段是利用语言模型进行预训练;第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的 Word Embedding 作为新特征补充到下游任务中。

上图展示的是其预训练过程,它的网络结构采用了双层双向 LSTM,目前语言模型训练的任务目标是根据单词Wi 的上下文去正确预测单词 Wi , 之前的单词序列 Context-before 称为上文,之后的单词序列 Context-after 称为下文。图中左端的前向双层LSTM代表正方向编码器,输入的是从左到右顺序的除了预测单词Wi外 的上文 Context-before;右端的逆向双层 LSTM 代表反方向编码器,输入的是从右到左的逆序的句子下文 Context-after;每个编码器的深度都是两层 LSTM 叠加。这个网络结构其实在 NLP 中是很常用的

使用这个网络结构利用大量语料做语言模型任务就能预先训练好这个网络,如果训练好这个网络后,输入一个新句子Snew,句子中每个单词都能得到对应的三个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”。至于为何这么做能够达到区分多义词的效果,你可以想一想,其实比较容易想明白原因。

 

5. ELMo缺点

ELMO仍然存在两个比较明显的不足:

    1、使用Bi-LSTM模型构建语言模型,捕捉语义、长距离依赖和task-specific特征抽取、并行计算的能力弱于基于Self-Attention的Transformer模型。论文《Why Self-Attention? A Targeted Evaluation of Neural Machine Translation Architectures》,已经证明Transformer已经在捕捉长距离特征依赖、语义特征、任务相关特征和并行计算的能力,优于LSTM和CNN。关于CNN、LSTM和Transformer的详细对比,可以参考张俊林老师的文章:《放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较》。

 2、通过拼接(word embedding,Forward hidden state,backward hidden state)方式融合特征的方式,削弱了语言模型特征抽取的能力。

因此,GPT、BERT、MT-DNN和GPT-2基于Transformer构建LM,解决了问题一;对各种NLP任务进行改造,以适应pre-trained模型,即预训练的模型结构不变,只是改变输入的组织方式,很好的避免了问题2;具体的任务改造基本类似。

 

参考:

NAACL2018:高级词向量(ELMo)详解(超详细) 经典

 

 

 

 

 


转载:https://blog.csdn.net/zwqjoy/article/details/101296941
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场