0. 摘要
我们介绍了一种新的基于上下文的深度单词表示,这种表示既建模了复杂的单词使用特征,也建模了这些表示在不同的语境下的区别。我们的词向量是双向语言模型下内部状态的函数,这个双向语言模型是通过大量的语料预训练的。研究表明,这些表示可以比较容易的加入到先有的模型中,并且显著提升了6个NLP问题的SOA,包括问答、文本蕴含关系、情感分析。我们还给出了一个分析,该分析表明,暴露预训练网络深度内容是非常重要的,它允许下游模型将它混合半监督信号。
1. 引言
预训练在很多神经语言模型中是非常关键的组成部分,然而,学习高质量的表示是比较有挑战性的。这需要较好的建模两个方面:1. 单词表示的复杂特征(语义和语法)。2.根据上下文变化。本文中,介绍了一种新的“上下文相关的深度”表示,可以直接应对这两项挑战,还可以轻易的整合到其他的先有模型中。还能显著的提高一系列自然语言理解任务的SOA。
我们和传统的表示不同的地方在于:我们的表示中,每一个token对应的表示都是整个句子的函数。我们的向量表示,是从大量语料中,用双向LSTM训练得出的一对语言模型。所以,我们称之为Elmo(embedding from language model)表示。不像之前学习向量的方法,elmo表示是很深度的,因为它是双向LSTM所有中间层的线性组合。更特殊的是,对每一个特殊任务,都学一个特殊的线性组合,相比于仅适用最上层的表示,这样可以显著的提升表现。
把内部的状态用这种方式组合起来,可以组合出非常丰富的单词表示。进一步分析表明,较高层的LSTM状态捕捉了上下文相关的单词含义(可以用于监督训练的词义消歧任务),而较低层次的LSTM状态捕捉了语法相关的含义(可以用于词性标注)。同时暴露这些信号是很有好处的,这有助于学好的模型针对不同的下游任务选择不同的半监督类型。
进一步的试验表明,elmo向量在实践中非常有效。我们先是表明了它可以很容易的整合到6个不同的挑战性的自然语言理解任务的现有模型中。比如:上下文承接任务、问答任务、情感分析。仅仅是加入elmo向量,就可以显著的提升每一个任务的SOA,包括一项20%的提升。cove也是一项上下文相关的表示,它是用感知机translation编码器。但elmo比voce的表现更好。最后cove和elmo都表明深度表示都比仅用LSTM最高层的表示效果要好。我们训练好的模型和代码都是公开的,我们希望elmo可以为其他NLP任务取得类似的进展。
2. 相关工作
单词向量可以捕捉到句法和语义信息,并且可以通过无监督的文本来训练得到,使用预训练的单词向量是很多NLP问题的SOA解决方案架构的组成元素。比如问答、上下文承接判断和词性标注。然而,这些方法来学习词向量,每个单词只能得到一个上下文相关的向量表示。
之前尝试克服传统词向量表示缺点的方法,要么是利用词根来丰富词向量,要么是为单词的每一个含义单独学一个向量。我们的方法也借鉴了这两种策略,利用字符级别的卷积可以获得跟词根单元类似的收益。然后我们无缝融合了多含义的信息到下游任务,不需要显式训练,就可以预测预定义好的含义类别。
其他相关工作也关注于学习上下文相关的向量表示。context2vec使用一个双向的lstm来对一个锚点单词的上下文进行编码。其他使用编码器来学习上下文的编码方式(包括锚点词在内)要么使用监督学习的神经感知机翻译系统,要么是无监督的语言模型。这些方法都依赖于大规模的训练语料,尽管神经感知机的方法受限于语料的并行化规模。这篇论文中,我们利用大量单语言数据,训练数据包含了3000万个句子。我们还把这种方法推广到深度上下文表示上,而且我们证明了这可以在多项NLP任务中表现良好。
之前的工作还表明:深度双向RNN的不同层可以编码不同类型的信息。比如:在LSTM的低层表示中引入多任务句法分析监督训练任务,有助于提升高层表示任务的总体表现,比如依赖分析、CCG super 标注。在一个基于RNN的编码解码机器翻译系统中,一个双层LSTM编码器,使用第一层的表示来完成POS(词性标注)任务的效果比使用第二层要好。最终本文证明,LSTM的最高层用于编码上下文可以学到单词的含义表示。我们发现,我们修改过的elmo语言模型也可以捕捉到类似的信号,这对混合了这些不同类型的下游半监督任务学习模型很有帮助。
还有一些使用语言模型来预训练一个编码器解码器对,和一个序列自动编码器,然后对特定的任务进行精调(fine tune)。相比之下,使用双向lstm和无标注的数据来进行预训练,我们修改了权重,然后增加了针对任务的模型部分,这就使得我们可以利用大量丰富而通用的双向lstm表示来完成下游任务,这样下游任务就仅仅需要很少量的标注数据了。
3. Elmo:语言模型的嵌入表示
不像目前的大多数词向量,elmo词向量是整个输入语句的函数。他们是通过一个双向lstm +字符cnn模型计算得来的,是内部网络状态的线性组合。这一步骤,使得我们可以做大量语料的半监督学习来完成预训练,并且可以很容易的把它融合到其他现存的神经网络NLP架构中。
3.1 双向语言模型
给定N个token,(t1,t2,….tn),前向的语言模型计算了系列中给定t1~tk-1的情况下tk出现的概率:
在最近的SOA神经网络语言模型中,通过字符级的CNN计算了上下文无关的token表示:
然后把它传给前向LSTM的L层,在每一个位置k上,LSTM的每一层都输出一个上下文相关的表示:
其中:j= 1~L
最高层的LSTM输出:
,经过一个softmax之后被用于预测下一个token:tk+1出现的概率。
反向的LSTM跟正向的类似,仅仅是输入序列经过了一个反转,给定后面的token来预测上一个token出现的概率。
双向LSTM就是把前向和后向LSTM结合起来。我们的目标函数是让前向和后向的联合log似然概率最大:
和softmax层的参数
进行绑定(即两个LSTM共用一套参数),而LSTM的其他参数则各自独立。总的来说,这个方法跟另一篇文献的方法很像。区别仅在于我们把两个方向的LSTM的部分参数进行了绑定。在下一部分,我们介绍了有别于其他论文的创新点:我们的单词表示是双向LSTM各层的线性组合。
3.2 ELMO
elmo是一个根据任务而定的biLM的内部向量的线性组合。每一个token tk,一个L层的biLM会计算2L+1个表示(就是最初的1个x和2个L层每层一个的向量,总计2L+1):
为了融合到下游模型中,elmo吧R中所有的层打碎成一个向量
最简单的情况下,elmo只用最顶层:
这就是某些论文中的情况,可以看做是本文的一个特例。而更普遍的做法,我们可以把所有的biLM层做一个线性组合:
其中:stask是softmax正则化权重,rtask是缩放系数,允许根据任务来缩放所有的elmo向量。r在优化实践过程中有比较重要的作用。biLM的每一层都有不同的激活分布,某些情况下还可以在调整权重之前用于层的正则化。
3.3 在NLP任务中使用biLM模型
给定一个预训练的biLM和一个监督训练的NLP任务模型。使用biLM来提升模型效果是非常容易的。我们运行一下biLM,然后记录下每个单词每一层的表示。然后,我们让最后一层的任务来学习这些表示的线性组合。
首先,考虑一下,不使用biLM时模型的最底层。大部分的NLP架构在最底层都使用同样的结构(这里指词向量),这就让我们可以用一个统一的方式来整合elmo。给定一个序列:(t1,t2,….tn),标准情况就是做一个跟上下文无关的token表示tk,这个表示是来自于预训练好的词嵌入向量。然后模型做一个跟上下文有关的token hk, 典型的就是用双向RNN,CNN,或者普通的前向反馈神经网络
为了添加elmo,我们先是冻结biLM的权重,然后把elmo向量
和原始token向量xk concatenate起来,得到一个elmo加强版的输入向量:
把这个向量作为原任务RNN的输入即可。对于某些任务,我们观察到把elmo向量作为任务RNN的输出可以进一步提高表现:引入一组跟任务相关的线性组合的权重,并且把原来的hk替换为
监督训练模型的其他部分不变的情况下,这种整合的方式可以适用于更复杂的模型。比如第4章中SNLI试验的双向attention层后面接一个biLM。还有共指消解试验中,聚类模型可以基于biLM来做。
最后,我们发现给elmo加入适当的dropout,某些情况下加入L2正则可以提高表现。这可以让elmo的权重倾向于elmo的所有层级的平均值。
3.4 预训练双向语言模型架构
本文的架构跟另一篇论文相似,区别仅在于两个方向的LSTM共享了一部分参数。本文还借鉴了另一篇关注大数据量单向LSTM模型的论文思路。
为了在语言模型的perplexity、模型大小还有下游任务的算力需要之间保持平衡,并且保持纯字符级输入表示,我们使用了单模型表现最好的一个研究CNN-BIG-LSTM的所有向量和中间隐状态。最终模型使用L=2的biLM,有4096个单元,512维度和剩余的两层之间的连接。上下文无关的表示使用2048个字符的ngram卷积核,后面接2个“高速公路”层,还有一个512个表示的线性投影。结果就是biLM为每一个输入的token提供了3层表示。由于有一个字符级别的卷积,它还能为词库之外的词提供一个表示。相比之下,传统的词向量只能为词库中的词提供一层表示。
在10亿word benchmark上经过10个epoch训练,前向和后向的perplexity是39.7。而前向的CNN-BIG-LSTM的perplexity是30.0。我们发现前向和后向的perplexity差不多,后向的稍低。
一旦训练完成,biLM的表示就可以用于非常多的任务。在某些特定领域的数据集上进行精调,可以显著降低perplexity,并且提高下游任务的表现。这可以看做biLM的迁徙学习。所以大多数情况下,我们都对下游任务进行精调。
4. 评估
表1表明了6个不同的NLP任务中ELMO的表现。在每个任务中,仅仅是加入elmo就可以达到新的SOA,并且得到6~20%的错误率的降低。
问答:SQuAD(斯坦福问答数据集)包含了10万多个问答对,其中答案是维基百科中的一段话。我们的baseline是一个改进了的双向attention流模型。它在双向attention组件后面加入了一个self-attention层。简化了一些池化操作,把GRU替换成了LSTM。在baseline模型的基础上加入elmo之后,测试集的F1从81.1%提升到了85.8%,获得了4.7%的提升,也就是24.9%的相对错误率降低。并且把单模型的SOA提升了1.4%。11个模型的ensemble把F1提升至87.4,这是截至2017年11月17日的最新SOA了。给baseline模型加入ELMO带来的4.7%的提升也要高于Cove的1.7%的提升。
上下文承接:上下文承接是给出一个前提的情况下,判断另一个假设是否为真,SNLI(斯坦福自然语言推断)语料提供了大概55万的上下文对。我们的baseline,ESIM序列模型来编码前后文,后面接一个矩阵attention层,一个本地推断层,最后在输出层之前加一个池化层。总体来说,5个不同的随机种子,加入elmo可以平均提升0.7%的准确率。做一个ensemble模型的话,可以把准确率从88.9提升至89.3%。
语义标注:语义标注任务是“谁对谁做了什么”,有一篇论文把这个问题定义为BIO标注问题,用一个8层的深度biLM。前向和后向之间交叉(取值?共享参数?)。在此模型中加入elmo来重新实现该模型之后,单模型在测试集上的F1,从81.4% 上升至 84.6%,提高了3.2%。这是OntoNotes上的新纪录,比之前的ensemble模型top1还要高1.2%。
共指消解:共指消解是把一段文字中指代同一个实体的片段聚成簇。我们的baseline模型是一个端到端的神经网络模型,是标记span的那种。它使用一个biLM和attention机制先是计算span的表示,然后把向量放入softmax的片段排序模型来发现共指链。在我们的实验中,CONLL 2012分享的OntoNotes数据集上,加入elmo把模型效果从67.2%提至 70.4%,获得了新的SOA,把之前的集合模型的SOA的F1提升了1.6%。
实体抽取:CoNLL 2003实体识别任务包含路透社RCV1的标注文本,有四种标注(PER, LOC, ORG,MISC:人物、地点、组织、其他)。和最新的SOA一样,我们用字符级别的CNN预训练生成的词向量+双层的biLM+CRF的损失来做模型。elmo加强版的模型达到了92.22%的F1。跟原模型相比,最主要区别在于我们使用了biLM的每一层进行加权,而原文仅使用了最高一层。5.1节表明,这种做法在很多任务里面都可以提高模型效果。
情感分析:SST(斯坦福情感树)是一个包含5选1标记(从非常负面到非常正面)的数据集,数据内容是影评。这些影评包含多样的语言现象,比如成语之类非常难以学习到的否定描述。我们的baseline模型是一个双向attention分类网络(BCN),这是用Cove加强过的最新SOA,而把Cove换成elmo之后,可以获得1%的绝对准确率的提升。
5. 分析
本章的5.1主要探讨Elmo这种深度表示比仅使用最高层表示更有助于提升下游任务的表现。5.3主要表明了biLM的低层向量捕捉了句法信息,而高层向量捕捉了语义信息。MT编码器也是一样的,这也表明elmo比cove提供了更丰富的表示。5.2探讨了如何在模型中加入elmo更有效果。5.4探讨了数据集大小的影响。5.5对不同层级在不同任务上的权重进行了可视化。
5.1 层权重公式的其他可能
层权重的计算公式有很多可能,之前的工作大部分都仅仅使用了最高层(不管是biLM还是MT编码器)。正则化参数λ的选择也非常重要λ=1的话就是对所有层取平均,而λ=0.001的话就可以让每层的权重相差较大。
表2对不同的λ进行了对比(数据集为Squad,SNLI和SRL)
结果表明,用多层总比用顶层要好,而多层取不同权重的话效果更佳。
5.2 在哪里加入Elmo
本文中所有的模型都是把elmo向量作为底层输入,然而我们发现有些情况下把elmo作为输出会更好。具体情况如表3所示:
5.3 elmo捕捉了哪些信息?
因为elmo比词向量更有效,这说明elmo捕捉了更多的信息,具体是什么呢?直觉来说,使用了上下文的elmo应该可以去除一词多义。比如play这个词,含义非常丰富,表4列出了play这个词的最近邻。
可以看到,相比于glove,elmo可以给出更加准确的释义。它可以同时考虑到词性和词意。用另一篇论文中提到的分析方法可以证明这一点。使用elmo向量来做词意消歧和词性判断标注问题,这样就可以分离出biLM编码的具体信息。同时还能跟cove进行比较。
词义消歧:词义消歧就是给出目标词的最近邻词。首先把所有单词的向量表示用biLM计算出来(数据集为SemCor3.0)。然后对每一个含义进行平均。测试的时候,对测试集的单词进行计算,然后得到的目标词取训练集中最接近的单词。再从wordnet中取一个训练时没出现过的含义。(然后呢?怎么对比?这里没看懂)
这种方法跟其他模型相比,结果如下:
跟仅使用最顶层的模型相比,效果有所提升,而跟目前的SOA相比,也是很有竞争力的,并且效果总是比cove要好。
词性标注:为了判断elmo是否可以捕捉到词性信息,我们把elmo的词向量直接输入到线性模型中,做PTB 数据集的词性标注问题。因为线性模型的内容非常有限,所以这种方法可以直接检验elmo捕捉词性的能力。跟词义消歧类似,elmo也得到了跟精调的模型相比依然很有竞争力的效果。然而跟词义消歧不同的是,elmo用第一层向量比顶层效果更好。
总结:这些试验表明,biLM的不同层捕捉了不同的语言信息,这也是elmo含义更丰富,加入elmo对下游任务更有帮助的原因。并且elmo向量比cove迁移性更好。
5.4 样本利用率
使用elmo,可以让数据的利用率变高,就是说同样的数据量,训练所需的epoch更少。比如SRL模型达到最佳F1需要486个epoch,而加入elmo之后仅需要10个epoch。
另外,ELmo加强过的模型比原模型相比所需的数据量更小。下图是对比:
数据集越小,使用elmo的效果越明显。
5.5 各层权重的可视化
图2表明了各层在不同任务中的权重:
好像没什么规律。原文说在输入中加入elmo更倾向于第一层。
6 总结
1. 本文提供了一种通用的biLM的深度表示方法。使用这种方法可以普遍提高多项NLP任务的模型效果。
2. 本文还用试验验证了biLM不同层可以提取不同的语义或者句法信息,而把这些信息使用到下游任务中可以有效提高模型效果。