赞
踩
在2018年之前,词向量表示的方法主要还是采用CBOW、skip-gram、GloVe等方法,这些方法都是采用一个固定维度的向量来表征每一个词汇或字符,虽然方法简单,但是会存在两个问题,一方面是没有考虑词汇在不同语境的信息,比如”apple"在一些场景下可以表示水果,在另一些场景下可能表示苹果公司,另一方面,采用一个固定的向量表示词汇,没有考虑到语法和语义的信息。因此,在2018年,Matthew等人提出了一种新的方法——ELMo(Embeddings from Language Models),ELMo训练的不再只是一个词向量,而是一个包含多层BiLstm的模型,然后对于每一个句子,都需要传入该模型,分别拿到每个时间步在每个层的输出,最后在具体的NLP任务中,再单独训练每一层的权重向量,对每一层的向量进行线性加权作为每个词汇的最终向量表示。这样一来,每个词汇在不同的上下文语境中,都可以得到不同的向量表示,因此,在一定意义上可以解决一词多义的问题。
首先介绍一下什么是双向语言模型,即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=1∏Np(tk∣t1,t2,…,tk−1)
这里前向语言模型可能会包含多层单向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=1∏Np(tk∣tk+1,tk+2,…,tN)
biLM模型则将前向语言模型和后向语言模型进行结合,直接最大化前向和后向语言模型的对数概率,即:
其中,
Θ
x
\Theta_{x}
Θx和
Θ
s
\Theta_{s}
Θs分别表示词向量矩阵和softmat层的参数,在前向和后向LSTM中都是共享的。具体的模型结构如下图所示:
在训练完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=0∑Lsjtaskhk,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得到的词汇向量,确实可以解决一词多义的情况,如下图所示。
那么,在具体的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} λ∥w∥22也可以有效提高模型的精度,笔者认为这里的 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时,此时各层的权重才会变得不一致,并且使得模型的效果更好。
最后总结一下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。