文章目录
ELMo 通过两个单向的LSTM对原始词向量进行训练,训练是用上下文来预测当前词,两个LSTM不共享参数,最后的softmax共享参数。训练完成后,结合原始词向量,L层的LSTM输出,对一共(L + 1)层向量进行权重加权和,得到最终的ELMo向量。
1. 从Word Embedding到ELMo
Word Embedding:词嵌入。最简单粗劣的理解就是:将词进行向量化表示。在ELMo之前做Word Embedding比较流行的是Word2Vec和Glove。通过语言模型任务,可以获得每个单词的Word Embedding,但是无法解决多义词的问题,用一个词在不同的上下文表示不用的意思。但是在这类语言模型中,会映射到用一个 word embedding空间里去。如何根据句子上下进行单词的word embedding表示,ELMo提供了解决方案。
一次多义通过双向语言模型来解决。
2. ELMo
2.1 ELMo原理
ELMo的本质思想是:我事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分,不过这没关系。在我实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。所以ELMo本身是个根据当前上下文对Word Embedding动态调整的思路。
2.2 双向语言模型(Bidirectionbbal language models, BiLM)
首先介绍一下什么是双向语言模型,即BiLM。
前向:
给定一个长度为N的词汇序列
t
1
,
t
2
,
.
.
.
,
t
N
t_1, t_2,...,t_N
t1,t2,...,tN,我们知道,在每个时间步,前向语言模型会根据前面的词汇预测当前词汇的概率。最终对每个时间步的输出概率进行累积来作为整个序列的预测概率,并期望盖概率越大越好,即:
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} \mid 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} \mid t_{k+1}, t_{k+2}, \ldots, t_{N}\right)
p(t1,t2,…,tN)=k=1∏Np(tk∣tk+1,tk+2,…,tN)
结合:
biLM模型则将前向语言模型和后向语言模型进行结合,直接最大化前向和后向语言模型的对数概率进行训练,即:
用两个单向的LSTM,结合上下文信息,对当前词进行预测。
∑ 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{aligned} &\sum_{k=1}^{N}\left(\log p\left(t_{k} \mid 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} \mid t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \overleftarrow{\Theta}_{L S T M}, \Theta_{s}\right)\right) \end{aligned} k=1∑N(logp(tk∣t1,…,tk−1;Θx,ΘLSTM,Θs)+logp(tk∣tk+1,…,tN;Θx,ΘLSTM,Θs))
LSTM 参数不共享,softmax 参数共享
其中,
Θ
x
\Theta_{x}
Θx和
Θ
s
\Theta_{s}
Θs分别表示词向量矩阵和softmax层的参数,从左向右方向的LSTM
Θ
⃗
L
S
T
M
\vec{\Theta}_{L S T M}
ΘLSTM 和从右向左的
Θ
←
L
S
T
M
\overleftarrow{\Theta}_{L S T M}
ΘLSTM是两套参数,不共享。而
Θ
s
\Theta_{s}
Θs 是共享的。具体的模型结构如下图所示:
ELMo向量的计算
在训练完BiLM后,每一层有一个前向LSTM的输出,一个后向LSTM的输出,有这么多层的输出,我们怎么使用呢?
第一层是普通的 word embedding ,可以用word2vec或者glova来得到
后面链接两个不同方向的LSTM做encoder输入,每一层的LSTM得到的输出作为每个词的上下文相关的word vectors
这样每个词就会有(L + 1)个词向量,不同的词向量做不同的权重加和。其中权重s是一个维度为L的vector,参与训练。
ELMo向量与具体NLP任务结合
那么,在具体的NLP任务中,通过上面所介绍的线性加权的方式得到每个词汇的ELMo向量后,我们怎么将这部分向量加入到具体的NLP任务的模型中去呢?
我们知道,对于具体的NLP任务,模型自身也会为每个词汇或字符初始化一个词向量 x k x_k xk,因此,作者直接将ELMo向量与该向量进行拼接得到 [ x k , E L M o k t a s k ] [x_k, ELMo^{task}_{k}] [xk,ELMoktask],然后再传入后续的层。
另一方面,作者发现引入另一组权重向量,计算得到另一组 E L M o k t a s k ] ELMo^{task}_{k}] ELMoktask],然后在模型最后的输出时将这部分向量也一起拼接得到 [ h k ; E L M o k t a s k ] [h_k;ELMo^{task}_{k}] [hk;ELMoktask],然后再计算最后的输出概率,这样的凡是也可以进一步提高模型的效果。
另外,作者发现对ELMo的权重向量进行 L2 正则化 λ ∣ ∣ w ∣ ∣ 2 2 λ||w||^2_2 λ∣∣w∣∣22,也可以有效提高模型的精度。
总结
优点:
- ELMo使得词汇的向量表示可以同时考虑语境和语法,多义词方面的极大改善。
- 效果提升
缺点:
- 在特征抽取器选择方面,ELMo使用了LSTM而不是Transformer;
- 训练时间长,这是RNN的本质导致的,和上面的特征提取缺点差不多;
- ELMo采取双向拼接这种融合特征的能力可能比BERT一体化的融合特征方式弱,但是,这知识一种从到立推断产生的怀疑,目前并没有具体实验说明这一点。
常见问题
ELMo的模型结构是怎样的?
ELMO 由一层input层 和 两层双向LSTM 组合而成的。
ELMO 基于语言模型的,确切的来说是一个 Bidirectional language models,也是一个 Bidirectional LSTM结构。我们要做的是给定一个含有N个tokens的序列。分为以下三步:
第一步:得到word embedding,即上图的E。所谓word embedding就是一个n*1维的列向量
第二步:送入双向LSTM模型中;
第三步:将lstm的输出 h k h_k hk,与上下文矩阵W′相乘,再将该列向量经过softmax归一化。其中,假定数据集有V个单词,W′是|V|m的矩阵, h k h_k hk 是m1的列向量,于是最终结果是|V|*1的归一化后向量,即从输入单词得到的针对每个单词的概率。
ELMo解决了一个什么样的问题?
ELMo解决了大部分问题,其中最重要的一个是:它解决了一词多义的问题。
拿word2vector来说,字与vector是一一对应的,输入句子,然后输出句子中每个字对应vector,可以看成查表的过程。
如:输入 画画 ,word2vector就会输出两个一样的vector,但是第一个画是动词、第二个画是名词,他们的vector应该是不一样的,但word2vector并不能区分。即使在训练过程中对embedding矩阵进行更新,它依旧还是一一对应的关系。
向ELMO输入 画画 ,输出的两个向量是经过2层LSTM后的结果,它们是不同的。这是ELMO根据输入句子的语境得到的结果。
ELMo是怎么进行预训练的?如何使用它?
预训练
论文这么说到:
The top layer LSTM output, is used to predict the next token with a Softmax layer.
即,将ELMO输出的向量映射到 vocab_size 的长度,softmax后,取出概率最大的元素对应的下标,作为对下一个字的预测。根据当前词的上下文堆当前此进行预测,相当于做一个分类,类别数量是词表大小,类似自回归。
从左到右LSTM 的 label相对于input错位一个字(从右到左则相反),如:
使用
第一层是普通的 word embedding,后面有L层的两个方向的LSTM。一共是(L + 1)层向量,对这(L + 1)层向量进行权重的加和,得到最终的ELMo向量。其中权重s是哟个维度为L的向量,参与训练。
为什么ELMo用两个单向的LSTM代替一个双向的LSTM?
双向的模型结构共享的是同一套参数,两个单向的用的两套独立的参数。
用双向的模型结构去训练语言模型会导致“看到自己”或“看到答案”的问题。后来的预训练语言模型都在避免这个问题,解决的程度也影响着模型效果。
如:
- ELMO:使用两个单向LSTM代替一个双向LSTM
- GPT :通过mask得分矩阵避免当前字看到之后所要预测的字,所以GPT是只有正向的,缺失了反向信息
- BERT:将所要预测的字用[MASK]字符代替,无论你是正向的还是反向的,你都不知道[MASK]这个字符原来的字是什么,只有结合[MASK]左右两边的词语信息来预测。这就达到了用双向模型训练的目的,但也引入了 预训练-微调 不一致的问题
- XLnet:不用[MASK]字符,结合GPT和BERT的思想,即:用mask得分矩阵的方法来替代[MASK]这个字符
参考:
Peters M E, Neumann M, Iyyer M, et al. Deep contextualized word representations. NAACL 2018[J].
词嵌入:ELMo原理
ELMo原理解析及简单上手使用
ELMo 原理解析
ELMo原理介绍
[NLP]高级词向量表达之ELMo详解