当前位置:   article > 正文

ELMo原理介绍

elmo原理

1. 引言

在2018年之前,词向量表示的方法主要还是采用CBOW、skip-gram、GloVe等方法,这些方法都是采用一个固定维度的向量来表征每一个词汇或字符,虽然方法简单,但是会存在两个问题,一方面是没有考虑词汇在不同语境的信息,比如”apple"在一些场景下可以表示水果,在另一些场景下可能表示苹果公司,另一方面,采用一个固定的向量表示词汇,没有考虑到语法和语义的信息。因此,在2018年,Matthew等人提出了一种新的方法——ELMo(Embeddings from Language Models),ELMo训练的不再只是一个词向量,而是一个包含多层BiLstm的模型,然后对于每一个句子,都需要传入该模型,分别拿到每个时间步在每个层的输出,最后在具体的NLP任务中,再单独训练每一层的权重向量,对每一层的向量进行线性加权作为每个词汇的最终向量表示。这样一来,每个词汇在不同的上下文语境中,都可以得到不同的向量表示,因此,在一定意义上可以解决一词多义的问题。

2. ELMo原理介绍b

2.1 双向语言模型(Bidirectionbbal language models, biLM)

首先介绍一下什么是双向语言模型,即biLM,因为作者预训练词向量模型就是通过biLM。给定一个长度为N的词汇序列 t 1 , t 2 , … , t N t_{1}, t_{2}, \ldots, t_{N} t1,t2,,tN,我们知道,在每个时间步,前向语言模型会根据前面的b词汇预测当前词汇的概率,最终对每个时间步的输出概率进行累积来作为整个序列的预测概率,并期望该概率越大越好,即:
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=1Np(tkt1,t2,,tk1)
这里前向语言模型可能会包含多层单向LSTM,但是最后对概率进行预测是利用最后一层LSTM每个时间步的隐藏状态向量进行预测。

而后向语言模型则与前向语言模型相反,后向语言模型将词汇序列进行逆排序,因此,对于每一个时间步都是基于后面词汇信息计算预测概率,具体如下:
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(tktk+1,tk+2,,tN)
biLM模型则将前向语言模型和后向语言模型进行结合,直接最大化前向和后向语言模型的对数概率,即:

其中, Θ x \Theta_{x} Θx Θ s \Theta_{s} Θs分别表示词向量矩阵和softmat层的参数,在前向和后向LSTM中都是共享的。具体的模型结构如下图所示:
在这里插入图片描述

2.2 ELMo向量的计算

在训练完biLM后,假设biLM有 L L L层,则对于每一个词汇 t k t_{k} tk,总共会有 2 L + 1 2 L+1 2L+1个输出向量,因为每一层LSTM都会有前向和后向两个向量输出,而每个词汇自己有embedding层的向量,因此总共是 2 L + 1 2 L+1 2L+1个,表示如下:
在这里插入图片描述
其中, h k , 0 L M \mathbf{h}_{k, 0}^{L M} hk,0LM表示词汇embedding层对应的向量, 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=[h k,jLM;h k,jLM]

对于具体的NLP任务,ELMo会训练一个权重向量对每一个词汇的输出向量进行线性加权,
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} \mathbf{L} \mathbf{M} \mathbf{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} ELMoktask=E(Rk;Θtask)=γtaskj=0Lsjtaskhk,jLM
其中, s t a s k \mathbf{s}^{t a s k} stask是经过softmax规范化后的权重向量, γ task \gamma^{\text {task}} γtask是一个放缩参数。由于biLM每一层的向量输出分布可能不同,因此,在进行线性加权之前,也可以考虑对每个向量进行Layer Normalization,作者发现在一些任务加上Layer Normalization确实是有效的。

作者发现采用ELMo得到的词汇向量,确实可以解决一词多义的情况,如下图所示。
在这里插入图片描述

2.3 ELMo向量与具体NLP任务的结合

那么,在具体的NLP任务中,通过上面所介绍的线性加权的方式得到每个词汇的ELMo向量后,我们怎么将这部分向量加入到具体的NLP任务的模型中去呢?我们知道,对于具体的NLP任务,模型自身也会为每个词汇或字符初始化一个词向量 x k \mathbf{x}_{k} xk,因此,作者直接将ELMo向量与该向量进行拼接得到 [ 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],然后再传入后续的层。

另一方面,作者发现引入另一组权重向量,计算得到另一组 E L M o k t a s k \mathbf{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{t a s k} ELMoktask,然后在模型最后的输出时将这部分向量也一起拼接得到 [ h k ; E L M o k  task  ] \left[\mathbf{h}_{k} ; \mathbf{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{\text { task }}\right] [hk;ELMok task ],然后再计算最后的输出概率,这样的方式也可以进一步提高模型的效果。

另外,作者发现对ELMo的权重向量进行正则化 λ ∥ w ∥ 2 2 \lambda\|\mathbf{w}\|_{2}^{2} λw22也可以有效提高模型的精度,笔者认为这里的 w \mathbf{w} w应该就是对应2.2节中的 s t a s k s^{task} stask。作者在实验中发现 λ \lambda λ的取值也非常重要,当 λ = 1 \lambda=1 λ=1时,此时所有层的权重基本都取一样大小,相当于对biLM的每一层向量直接平均,当 λ = 0.001 \lambda=0.001 λ=0.001时,此时各层的权重才会变得不一致,并且使得模型的效果更好。

3. 总结

最后总结一下:

  • ELMo使得词汇的向量表示可以同时考虑语境和语法,解决了一词多义的情况。
  • 不过ELMo本质是一个模型,在不同的任务、不同的上下文中,同一个词得到的词向量都是不一样的,因此,计算词汇的相似度时就会变得比较麻烦。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/382627?site
推荐阅读
相关标签
  

闽ICP备14008679号