之前2013年的word2vec及2014年的GloVe的工作中,每个词对应一个vector,对于多义词无能为力。ELMo的工作对于此,提出了一个较好的解决方案。不同于以往的一个词对应一个向量,是固定的。在ELMo世界里,预训练好的模型不再只是向量对应关系,而是一个训练好的模型。使用时,将一句话或一段话输入模型,模型会根据上下文来推断每个词对应的词向量。这样做之后明显的好处之一就是对于多义词,可以结合前后语境对多义词进行理解。比如appele,可以根据前后文语境理解为公司或水果。
1. 前向LSTM语言模型基础 & ELMo的双向LSTM语言模型(只是铺垫!)
1.1 前向LSTM语言模型基础
给定一串长度为N的词条
(
t
1
,
t
2
,
…
,
t
N
)
(t_1,t_2,…,t_N)
(t1,t2,…,tN),前向语言模型通过对给定历史
(
t
1
,
…
t
k
−
1
)
(t_1,…t_{k−1})
(t1,…tk−1)预测
t
k
t_k
tk进行建模,如下图6(值得注意的是,图6只是解释LSTM语言模型的图),对应的公式如下图7。
这个前向LSTM网络的输入输出是什么?具体的流程是什么?
以“The cat sat on the mat”这句话为例,在某一个时刻 k k k(对应于图6)时,输入为The,输出cat的概率。过程是这里面包含了几步:
- 将 The 转换成word embedding:所谓word embedding就是一个n * 1维的列向量,这个很好理解。那单词怎么转成word embedding的呢?如果大家用过word2vec,glove就知道,就是简单的查表。在ELMo中,用的不是word2vec,glove,毕竟2018年了。作者用的是cnn-big-lstm生成的word embedding,其实跟word2vec等也差不多,就是提前单独训练好的模型,模型喂入单词就能得到单词的word embedding。总之,在这第一步里,就是简单将单词转换成了n * 1的列向量,而这个列向量,对应于我们普通LSTM中的输入
x
t
x_t
xt,如下图所示。
- 将上一时刻的隐状态 h k − 1 h_{k−1} hk−1及第一步中的word embedding一并输入进LSTM中,并得到输出及隐状态 h k h_k hk。其中,隐状态 h k − 1 h_{k−1} hk−1是一个m * 1的列向量。在这一步里,LSTM的输出及隐状态都是一个m * 1维的列向量。请大家务必注意 h k h_k hk,这个 h k h_k hk与我们后文提到ELMo向量有着直接的关系。
- 将LSTM的输出 h k h_k hk与上下文矩阵 W ′ W' W′相乘,即 W ′ ∗ h k W'*h_k W′∗hk得到一个列向量,再将该列向量经过softmax归一化。 其中,假定数据集有 V V V个单词, W ′ W' W′是 ∣ V ∣ ∗ m |V|*m ∣V∣∗m的矩阵, h k h_k hk是 m ∗ 1 m * 1 m∗1的列向量,于是最终结果是 ∣ V ∣ ∗ 1 |V|*1 ∣V∣∗1的归一化后向量,即从输入单词得到的针对每个单词的概率。
从上面三步,就可以明白这个前向LSTM语言模型的工作流程了。其实很多神经网络语言模型都很类似,除了LSTM,还可以用RNN及前馈神经网络,差不多的。
1.2 ELMo的双向LSTM语言模型(知道向量表示含义即可)
有了前面的基础,ELMo的双向LSTM语言模型就很好解释了。ELMo的整体图如下图8。相对于上面的图6,有两个改进,第一个是使用了多层LSTM,第二个是增加了后向语言模型(backward LM)。
对于多层LSTM,每层的输出都是隐向量 h t h_t ht,在ELMo里,为了区分,前向lstm语言模型的第 j j j层第 k k k时刻的输出向量命名为 h k , j L M → \overrightarrow{h^{LM}_{k,j}} hk,jLM。
对于后向语言模型,跟前向语言模型类似,除了它是给定后文来预测前文。后向lstm语言模型的公式如下图9所示,可以对照着前向语言lstm语言模型的公式(图7所示)来看。还是非常好理解的。类似的,我们设定后向lstm的第
j
j
j层的第
k
k
k时刻的输出向量命名为
h
k
,
j
L
M
←
\overleftarrow{h^{LM}_{k,j}}
hk,jLM。
图7 和 图9 分别是前向、后向LSTM语言模型所要学习的目标函数(注意此处是追求概率最大化的,跟通常的目标函数追求最小化有所不同,要是追求最小化,前面加负号即可)。ELMo使用的双向lstm语言模型,论文中简称biLM。作者将 图7 和 图9的公式结合起来,得到所要优化的目标:最大化对数前向和后向的似然概率,如下图10所示。
图10中的参数说明:
Θ
→
L
S
T
M
\overrightarrow{Θ}_{LSTM}
ΘLSTM表示前向lstm的网络参数,反向的lstm的网络参数同理。两个网络里都出现了
Θ
x
Θ_x
Θx和
Θ
s
Θ_s
Θs,表示两个网络共享的参数。其中
Θ
x
Θ_x
Θx表示映射层的共享,即将单词映射为word embedding(1.1的第一步)。
Θ
s
Θ_s
Θs表示1.1节中提到的第三步中的上下文矩阵的参数,这个参数在前向和后向lstm中也是相同的。
2. ELMo(这才是重点)
所谓ELMo不过是一些网络层的组合。都有哪些网络层呢?对于每个单词(token)
t
k
t_k
tk,对于L层的双向lstm语言模型,一共有2L+1个表征(representations)(加的1是指初始化时的词向量),放一个集合里用
R
k
R_k
Rk表示,如下图11所示:
其中,
h
k
,
j
L
M
h^{LM}_{k,j}
hk,jLM 当
j
=
0
j=0
j=0时,表示前文提到的word embedding即
X
k
L
M
X^{LM}_k
XkLM,也就是LSTM的输入。对于每一层的双向LSTM语言模型,
h
k
,
j
L
M
=
[
h
→
k
,
j
L
M
;
h
k
,
j
L
M
←
]
h^{LM}_{k,j}=[\overrightarrow{h}^{LM}_{k,j};\overleftarrow{h^{LM}_{k,j}}]
hk,jLM=[hk,jLM;hk,jLM]。值得注意的是,每一层有一个前向lstm的输出,一个后向lstm的输出,两者就是简单的拼接起来的。也就是如果分别都是
m
∗
1
m*1
m∗1维的列向量,拼完之后就是
2
m
∗
1
2m*1
2m∗1的列向量,就这么简单。
既然ELMo有这么多向量了,那怎么使用呢?最简单的方法就是使用最顶层的LSTM输出,但是我们有更好的方法使用这些向量。
即如下图图12的方法,我们对于每层向量,我们加一个权重
s
j
t
a
s
k
s^{task}_j
sjtask(一个实数),将每层的向量与权重相乘,最后再乘以一个权重
γ
t
a
s
k
γ^{task}
γtask。每层LSTM学到的东西是不一样的,针对每个任务,每层的向量重要性也不一样,所以对于L层LSTM,有L+1个权重(初始化词向量也有权重,所以+1),加上前面的
γ
t
a
s
k
γ^{task}
γtask,一共有L+2个权重。注意下此处的权重个数,后面会用到。
γ
t
a
s
k
γ^{task}
γtask的作用等会说。
这些权重怎么来的?针对具体的nlp任务,我们用的时候,需要再次训练去得到的这个权重。最简单的方法,就是权重都设为一样。
在生成了ELMo向量(图12所示)之后,使用方法依然是拼接。
将单词/词条的表征
x
k
x_k
xk与
E
L
M
o
k
t
a
s
k
ELMo^{task}_k
ELMoktask拼接起来就可以了,即一个单词的最终向量是这样的 [
x
k
x_k
xk;
E
L
M
o
k
t
a
s
k
ELMo^{task}_k
ELMoktask]。 这就是最终的使用方法。而我们将
E
L
M
o
k
t
a
s
k
ELMo^{task}_k
ELMoktask与
x
k
x_k
xk要进行拼接,所以
E
L
M
o
k
t
a
s
k
ELMo^{task}_k
ELMoktask会事先有一个
γ
t
a
s
k
γ^{task}
γtask缩放系数。
而 s j t a s k s^{task}_j sjtask可以直接取各层平均得到,也可以让模型自己去学习得到。
3. 预训练的双向语言模型架构(了解)
论文的作者有预训练好的ELMo模型,映射层(单词到word embedding)使用的Jozefowicz的CNN-BIG-LSTM,即输入为512维的列向量。
同时LSTM的层数L,最终使用的是2,即L=2。每层的LSTM的单元数是4096(unit_num)。每个LSTM的输出也是512维列向量。每层LSTM(含前、向后向两个)的单元个数是4096个。也就是每层的单个lstm的输入是512维,输出也是512维。
一旦模型预训练完成,便可以用于nlp其他任务。在一些领域,可以对biLM(双向lstm语言模型)进行微调,对任务的表现会有所提高,这种可以认为是一种迁移学习(transfer learning)。
4. ELMo使用方法(重点)
对于预训练好的ELMo,我们可以送入一段话,然后模型会得到模型内部各层的小向量表示(包括输入的向量表示 x k x_k xk),然后我们加上一定的权重(可训练)组合即可得到最终的ELMo向量。
5. ELMo学到了什么(了解)
6. ELMo的缺点
那么站在现在这个时间节点(Bert已有)看,ELMO 有什么值得改进的缺点呢?
- 首先,一个非常明显的缺点在特征抽取器选择方面,ELMO 使用了 LSTM 而不是新贵 Transformer,Transformer 是谷歌在 17 年做机器翻译任务的“Attention is all you need”的论文中提出的,引起了相当大的反响,很多研究已经证明了 Transformer 提取特征的能力是要远强于 LSTM 的。如果 ELMO 采取 Transformer 作为特征提取器,那么估计 Bert 的反响远不如现在的这种火爆场面。
- 另外一点,ELMO 采取双向拼接这种融合特征的能力可能比 Bert 一体化的融合特征方式弱,但是,这只是一种从道理推断产生的怀疑,目前并没有具体实验说明这一点。
7. 为什么ELMo用两个单向的LSTM代替一个双向的LSTM呢
用双向的模型结构去训练语言模型会导致“看到自己”或“看到答案”的问题。后来的预训练语言模型也都在避免或解决这个问题,解决的程度也影响着模型效果。