概述
为了解决一词多义的问题,同时表达单词使用的语法和语义以及在上下文语境中的变化。词向量是一个深层双向语言模型(biLM)的内部状态的学习函数,它是在一个大型文本语料库上预先训练的,这些表示可以很容易地添加到现有的模型中。
ELMO的思想是:先用语言模型学习单词的Word Embedding,此时没有区分多义词,但是在实际使用Word Embedding时,单词已经具备特定的上下文了,这时可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义。因此ELMO实际上是根据当前上下文对Word Embedding进行动态调整的一种思路。
ELMo,word2vec,glove之间的联系和区别
word2vec是局部语料库训练的,其特征提取是基于滑窗的,而glove的滑窗是为了构建共生矩阵,是基于全局语料的,需要事先统计共现概率;因此,word2vec可以进行在线学习,glove需要统计固定语料信息。
word2vec是无监督学习,同样不需要人工标注;glove通常认为是无监督学习,但实际上glove还是有label的,即共现次数
l
o
g
(
X
i
j
)
log(X_{ij})
log(Xij)。
word2vec的损失函数实质上是带权重的交叉熵,权重固定;glove的损失函数是最小平方损失函数,权重可以做映射变换。
glove可以看作是更换了目标函数和权重函数的全局word2vec。
ELMO相对于word2vec、glove等,捕捉了上下文语境信息而不仅仅是字词的单独信息。word2vec中,单词在不同语境下向量表示完全一致,而ELMo针对这一点做了优化。
ELMo模型
ELMo用到了双向语言模型,给定N个tokens
(
t
1
,
t
2
,
⋯
 
,
t
n
)
(t_1,t_2,\cdots,t_n)
(t1,t2,⋯,tn),语言模型通过给定前面的k-1个位置的token序列计算第k个token出现的概率:
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)
后向的计算方法与前向相似:
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训练过程中目标函数最大化:
∑
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
)
)
\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)+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \stackrel{\leftarrow}{\Theta}_{L S T M}, \Theta_{s}\right)\right)
k=1∑N(logp(tk∣t1,…,tk−1;Θx,ΘLSTM,Θs)+logp(tk∣tk+1,…,tN;Θx,Θ←LSTM,Θs))
ELMo对于每个token
t
k
t_k
tk,通过一个L层的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
}
R_{k}=\left\{x_{k}^{L M}, \overrightarrow{h}_{k, j}^{L M}, \overleftarrow{h_{k, j}^{LM}} | j=1, \ldots, L\right\}=\left\{h_{k, j}^{L M} | j=0, \ldots, L\right\}
Rk={xkLM,hk,jLM,hk,jLM∣j=1,…,L}={hk,jLM∣j=0,…,L}
其中
h
k
,
0
L
M
h_{k, 0}^{L M}
hk,0LM是对token进行直接编码的结果(这里是字符通过CNN编码),
h
k
,
j
L
M
=
[
h
→
k
,
j
L
M
;
h
←
k
,
j
L
M
]
h_{k, j}^{L M}=\left[\overrightarrow{h}_{k, j}^{L M}; \overleftarrow{h}_{k,j}^{LM}\right]
hk,jLM=[hk,jLM;hk,jLM]是每个biLSTM层输出的结果,在实验中还发现不同层的biLM输出的token表示对于不同任务效果不同。
ELMo采用典型的两阶段过程,第一个阶段是利用语言模型进行预训练,第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。