0. 背景
0-1. 摘要
本文介绍一类新的深层上下文的词表征(deep contextualized word representation)模型ELMo。该模型能够对(1)词汇的复杂特征(如句法和语法)(2)及其这些复杂特征在不同的语境中的不同用法(即对一词多义)进行建模。本文的词向量本质上是基于大规模语料训练后双向语言模型(biLM)内部隐状态特征的组合。实验表明,本文所提出的词向量模型能够很轻松地与现有主流模型相结合,并且在6大NLP任务(包括问答、文本蕴含和情感分析)上有巨大提升,并刷新记录。同时,通过实验和分析发现预训练网络的深层内部结构是重点,这能够让下游模型去融合半监督训练出的不同类型特征。
1. 介绍
本文提出的表征与传统的词嵌入不同,每个 token 的表征是整个输入句子的函数。本文的向量来自于双向 LSTM ,该 LSTM 是使用成对语言模型(LM)目标在大型文本语料库上训练得到的。因此,该表征叫作 ELMo(Embeddings from Language Models)表征。与之前学习语境化词向量的方法(Peters et al., 2017; McCann et al., 2017)不同,ELMo 表征是深层的,即它们是 biLM 中所有内部层的函数。具体来说,对于每个任务,学习堆叠在每个输入单词上的向量线性组合,其效果显著优于仅使用 LSTM 顶层的表征。
用这种方式组合内部状态可以获取丰富的词表征。使用内在评价进行评估,结果显示更高级别的LSTM状态可以到捕捉词义的语境依赖(如它们不经修改就可以执行监督式词义消歧任务,且表现良好),而较低级别的状态建模句法结构(如它们可用于词性标注任务)。同时揭示所有这些信号是非常有益的,可以帮助学得的模型选择对每个任务最有帮助的半监督信号。
大量实验证明 ELMo 表征在实践中效果优异。本文首先展示可在6个不同且有难度的语言理解问题上(包括文本蕴涵、问答和情感分析等),将 ELMo 表征轻松添加至现有模型。添加 ELMo 表征可以显著提高每个用例中的当前最优性能,包括将相对误差降低 20%。 对于可以直接对比的任务,ELMo 优于 CoVe(McCann et al., 2017),后者使用神经机器翻译编码器计算语境化表征。最后,对 ELMo 和 CoVe 进行分析,分析结果显示深层表征优于仅从 LSTM 顶层获取的表征。
2. 相关工作
基于大规模无标注语料的词向量预训练(Turian et al.,2010; Mikolov et al., 2013; Pennington et al.,2014)已经在实践中证明能够捕获词的句法和语义信息,此后,预训练的词向量便作为各项NLP任务(包括问答、文本蕴含和语义角色标注)中一项标配。但是,现有这些方法学习到的词向量对于每个词仅仅有一个上下文语境表征向量。
先贤们也提出了一些方法以克服传统词向量的不足,比如Wieting et al., 2016; Bojanowski et al.,2017提出的通过subword信息来丰富词向量的表征,再比如Neelakantan et al., 2014 提出分开学习每个单词意义的向量。本文的方法通过使用字符卷积(character convolutions)也能够达到使用subword的效果,同时本文能够无缝地在下游任务中使用多义信息,而无需在训练过程中确切地指明预定义的含义类别,即在训练过程中不用指明词到底是哪个含义。
3. ELMo:来自语言模型的嵌入
与广泛使用的词嵌入(Pennington et al., 2014)不同,ELMo 词表征是整个输入句子的函数。这些表征是在双层biLMs上使用字符卷积计算出来的(详见3-1节),以内部网络状态的线性函数表现出来(详见3-2节)。这种设定使得可以进行半监督学习,在学习中,biLM 进行大规模的预训练(详见3-4节)且能够轻易整合进大量现有神经 NLP 架构(详见3-3节)。
3-1. 双向语言模型
ELMo(Embeddings from Language Models)模型,本质是从语言模型来的。对于一个给定的句子 ( t 1 , t 2 , . . . t N ) (t_1,t_2,…t_N) (t1,t2,...tN),构建的语言模型就是通过一个词汇的上文去,预测一个词 t k t_k tk:
p ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t 1 , t 2 , … , t k − 1 ) p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{1}, t_{2}, \ldots, t_{k-1}\right) p(t1,t2,…,tN)=k=1∏Np(tk∣t1,t2,…,tk−1)
近期流行的神经语言模型(J´ ozefowicz et al., 2016; Melis et al., 2017; Merity et al., 2017)一般是通过token embedding或者在字符级上使用CNN获得带有上下文信息的token表征 x k L M \mathbf{x}_{k}^{L M} xkLM
,然后通过一个多层(比如L层)的前向LSTM网络。在LSTM的每一层都输出基于上下文的一个向量表达 h → k , j L M \overrightarrow{\mathbf{h}}_{k, j}^{L M} hk,jLM,其中j代表层数,k表示位置。其最后的一层的输出 h → k , L L M \overrightarrow{\mathbf{h}}_{k, L}^{L M} hk,LLM,经过一层softmax归一,就可以来预测词 t k + 1 t_{k+1} tk+1。
现在都流行双向语言模型,本质就是把句子再逆序输入一遍 p ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t k + 1 , t k + 2 , … , t N ) p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{k+1}, t_{k+2}, \ldots, t_{N}\right) p(t1,t2,…,tN)=∏k=1Np(tk∣tk+1,tk+2,…,tN),再把前向逆向的结果结合起来,就是最终的双向语言模型,而本文最终目的是使目标函数最大化:
∑ k = 1 N ( log p ( t k ∣ t 1 , … , t k − 1 ; Θ x , Θ ⃗ L S T M , Θ s ) + log p ( t k ∣ t k + 1 , … , t N ; Θ x , Θ ← L S T M , Θ s ) ) \begin{array}{l}{\sum_{k=1}^{N}\left(\log p\left(t_{k} | t_{1}, \ldots, t_{k-1} ; \Theta_{x}, \vec{\Theta}_{L S T M}, \Theta_{s}\right)\right.} \\ {\left.\quad+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \overleftarrow \Theta_{L S T M}, \Theta_{s}\right)\right)}\end{array} ∑k=1N(logp(tk∣t1,…,tk−1;Θx,ΘLSTM,Θs)+logp(tk∣tk+1,…,tN;Θx,ΘLSTM,Θs))
其中, Θ x \Theta_x Θx是token 表征,是一开始输入的词向量, Θ s \Theta_s Θs就是softmax层参数,两个方向的LSTM的参数不是共享的。总的来说,双向语言模型的结构图与Peters et al. (2017),即TagLM中的方法大致是相同的,所不同的是TagLM中不同方向共享部分参数,而不是完全参数独立。
3-2. ELMo
ELMo 是 biLM 中间层表征的任务特定组合。对于每个 token t k t_k tk,第L-layer biLM 计算一组表征(包含 2L + 1 个表征):
R k = { x k L M , h → k , j L M , h ← k , j L M ∣ j = 1 , … , L } = { h k , j L M ∣ j = 0 , … , L } \begin{aligned} R_{k} &=\left\{\mathbf{x}_{k}^{L M}, \overrightarrow{\mathbf{h}}_{k, j}^{L M}, \overleftarrow {\mathbf{h}}_{k, j}^{L M} | j=1, \ldots, L\right\} \\ &=\left\{\mathbf{h}_{k, j}^{L M} | j=0, \ldots, L\right\} \end{aligned} Rk={
xkLM,hk,jLM,hk,jLM∣j=1,…,L}={
hk,jLM∣j=0,…,L}
其中 h k , 0 L M \mathbf{h}_{k, 0}^{L M} hk,0LM是token层;对于每个 biLSTM 层,有 h k , j L M = [ h → k , j L M ; h ← k , j L M ] \mathbf{h}_{k, j}^{L M}=\left[\overrightarrow{\mathbf{h}}_{k, j}^{L M} ; \overleftarrow{\mathbf{h}}_{k, j}^{L M}\right] hk,jLM=[hk,jLM;hk,jLM]
为了在下游模型中能够包含ELMo,ELMo 将 R R R中的所有层折叠成单个向量 E L M o k = E ( R k ; Θ e ) \mathrm{ELMo}_{k}=E\left(R_{k} ; \mathbf{\Theta}_{e}\right) ELMok=E(Rk;Θe)。在最简单的情况下,ELMo 只选择顶层 E ( R k ) = h k , L L M E\left(R_{k}\right)=\mathbf{h}_{k, L}^{L M} E(Rk)=hk,LLM,如 TagLM(Peters et al., 2017)和 CoVe(McCann et al., 2017)一样。更一般地,针对特定任务计算所有 biLM 层的特定权重如下:
(1) E L M o k t a s k = E ( R k ; Θ t a s k ) = γ t a s k ∑ j = 0 L s j t a s k h k , j L M \mathbf{E L M o}_{k}^{t a s k}=E\left(R_{k} ; \Theta^{t a s k}\right)=\gamma^{t a s k} \sum_{j=0}^{L} s_{j}^{t a s k} \mathbf{h}_{k, j}^{L M} \tag{1} ELMoktask=E(Rk;Θtask)=γtaskj=0∑Lsjtaskhk,jLM(1)
公式(1)中,可以看出ELMo 不仅仅使用了neural language model 的最后一层输出,而是对所有层的输出做了加权来构造最后的向量。其中 s t a s k s^{task} stask 是 softmax 归一化权重,所以权重加权和为1。
标量参数 γ t a s k \gamma^{task} γtask 允许任务模型扩展至整个 ELMo 向量。在实践中, γ \gamma γ 对优化过程有益(详见补充材料), γ \gamma γ 是一个需要学习的变量, 加不加这个变量对performance 的影响是比较大。鉴于每个 biLM 层的激活函数都有不同的分布,在一些情况下, γ \gamma γ 有助于在加权之前对每个 biLM 层的归一化(Ba et al., 2016)。
3-3. 在无监督任务上使用biLMs
给定一个预训练的biLM,怎么将其与目标任务框架进行结合呢?
运行biLM,记录每个词在所有层的表征,再让末端的具体任务模型学习表征之间的线性组合。具体来说,对于给定的token序列 ( t 1 , … , t N ) \left(t_{1}, \ldots, t_{N}\right) (t1,…,tN),对每个token,通过常见的标准方式(预训练词嵌入,也可以加入基于字符的表征方式)得到带有上下文依赖的token表征 x k \mathbf{x}_{k} xk。再通过双向RNNs或者CNNs或者前馈神经网络得到具体上下文语境的表征 h k \mathbf{h}_{k} hk。
那如何将ELMo添加到下游有监督任务模型中?先固定biLM的权重,将ELMo向量 ELMo k task \text { ELMo }_{k}^{\text {task}} ELMo ktask和最初始词向量 x k \mathbf{x}_{k} xk(也就是通过字符卷积获得的向量)进行拼接: [ x k ; E L M o k t a s k ] \left[\mathbf{x}_{k} ; \mathbf{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{t a s k}\right] [xk;ELMoktask], 然后将这个向量输入到具体任务的RNN模型中,然后再训练权重因子。在有些任务中,如SNLI和SQuAD中,可以发现在output处添加另一个这样的ELMo向量,即以 [ h k ; E L M o k t a s k ] \left[\mathbf{h}_{k} ; \mathbf{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{t a s k}\right] [hk;ELMoktask]替代原来的 h k \mathbf{h}_{k} hk是可以提高性能指标的。不同是,这里应该采用与输入 ELMo k task \text { ELMo }_{k}^{\text {task}} ELMo ktask中不同的权重因子。需要注意的是,由于模型的其他部分是维持不变的,所以添加额外的向量操作可以发生在更复杂的神经模型的上下文中。比如,在SNLI实验中,biLSTMs之后紧跟的是bi-attention层;再比如在指代消解任务中,在biLSTMs之后紧跟的是一个聚类模型。
另外也可以在ELMo模型中加入适量的dropout, 以及采用 L2 loss的方法来提升模型。这对ELMo权重引入了一个归纳偏见,使其接近所有biLM层的平均值。并且, 这里的 L2 项的系数 λ \lambda λ越大, 越有取各层平均值的意思;越小, 越可以发挥各个层之间的不同带来的效果,但是并不是说, 越小越好。
3-4. 预训练双向语言模型
4. 评估
5. 分析
通过消融研究(即控制变量法)以确定本文模型贡献,并阐明ELMo表示一些有趣的方面。5-1节的实验表明在下游任务中采用深层的语境表征比仅仅使用顶层表征(biLM或者MT encoder所产生的)能取得更好的结果。5-3节的实验结果表明biLMs能够捕获到不同类型的上下文信息,底层网络捕获到的是句法信息,高层网络捕获到的是语义信息。这与MT系统的encoders是不谋而合的。此外,biLM能够提供比CoVe更丰富的表征。在5-2节分析了ELMo包含在具体下游任务模型中的位置敏感度;5-4节介绍训练集的一些基本信息,5-5节对ELMo在不同任务中学习到的权重参数进行可视化。
5-1. 交替层加权方案
从方程1中可以看出,biLMs各层的组合是有多种方案的,只是此前的工作仅仅使用最后一层来作为上下文的表征,要么如(Peters et al., 2017)中介绍的biLM,要么如(CoVe; McCann et al., 2017)中的MT encoder。L2 loss的系数 λ \lambda λ给模型带来的影响其实很大, 其值越大,如值为1, 那么最后的 ELMo k task \text { ELMo }_{k}^{\text {task}} ELMo ktask越趋近于各层之间的平均值,而值越小如0.001,则层与层之间的权重差异越大。Table 2是在SQuAD、SNIL和SRL数据集上应用4个不同组合的比较结果:
- 第一列是baseline模型(使用普通的词向量, 例如 CoVe)
- 第二列是只使用了 BiLSTMs 最后一层输出的结果
- 第三列是使用了各层次状态值平均的结果(倾向于平均, 并非完全平均, λ \lambda λ=1)
- 第四列是使用了各层次状态值加权和的结果( λ \lambda λ=0.001)
5-2. 在哪里加入ELMo
5-3. biLM的表征捕获到哪些信息
由于添加ELMo能够比单纯的词向量获取更好的效果,那么biLM的上下文表征应该是能够编码出对多个NLP任务都有效的更加泛化的通用信息,而这是词向量所无法捕捉到的。直观上,biLM应该是能够克服词的歧义性。以常见多歧义单词”play”为例,Table 4的上部分列出了在Glove向量中与其最相近的单词,它们分布在演讲的几个部分例如:“play”,“playing”作动词,“player”作动词,“game”作为名词),但集中在与运动有关的“play”的意义上。下面的两行显示来自SemCor数据集的最近邻语句,在各自句子中使用biLM后的“play”的上下文表示。在这种情况下,biLM能够对原句中的词性和词义进行分离。
word sense disambiguation(一词多义的消歧):
在词义消歧方面可以使用目标词在biLM表征中最近邻的单词来预测目标词的含义,这与Melamud et al. (2016)的方法很类似。实验过程中,使用了 SemCor3.0 这个语料库(PS:这是一个标注了多义的语料库), 该语料库中的每个词汇都对应着 wordnet 的一个位置。具体方法是,在训练语料上,先利用biLMs 计算出语料库中所有词汇的向量表示,然后对每个含义取表征的均值。因为每个词对应着wordnet,所以在wordnet相同位置的,即表示相同含义,进而可以将位于wordnet相同位置的词汇的向量取平均。在测试的时候, 对于一个给出的目标词(即target word)利用 BiLM计算得到其词表征后, 再选用与训练时获得的每个wordnet位置中词汇向量最近的作为其含义。换句话说,就是利用1近邻法在训练后的词向量中查找(从上述可知,此时每个含义都是均值后的结果),其结果就是这个词可能的位置。虽然只用到了1-近邻,没有真的用一个合理的wsd(word sense disambiguation)模型, 只是用了最简单的模型来验证ELMo vector 的质量,但是结果显示, 有很高的F1值。结果如Table 5所示:

期中,CoVe 是由machine translation 训练出的带上下文信息的vector。通过这个表也可以知道, 第二层的语义信息在语义消歧方面要优于第一层。
POS tagging:
上面的结果测试了 ELMo 表达语义的效果, 接下来利用 POS tagging 检测其对语法的表达效果。直接在 LM 后面接了一个feed-forward 的nn来进行pos-tagging 的训练, 模型的效果如下Table 6所示。类似的, 因为这个结果是没有用额外的crf / lstm 而直接得到的, 所以这个分数其实挺好的了。

5-4. 样本效率
5-5. 学习到的权重可视化
6. 结论
本文介绍了一种biLMs方法,该方法能够学习到高质量深层上下文相关表示的通用方法,并证明了该方法在多个任务上显著有效。通过消融研究和控制变量法,证实了biLM层能够有效地编码单词上下文相关的不同类型的语法和语义信息,使用所有层特征组合可以提高所有任务的性能。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217902.html原文链接:https://javaforall.net
