基本原理
ELMO是“Embedding from Language Models”的简称,提出ELMO的论文题目:“Deep contextualized word representation”中deep contextualized这个短语,体现了其精髓所在。在此之前的Word Embedding本质上是个静态的方式,所谓静态指的是训练好之后每个单词的Embedding就固定住了,Word Embedding不会跟着上下文场景的变化而改变。
ELMO本身是个根据当前上下文对Word Embedding动态调整的思路。
两阶段过程:
- 利用语言模型进行预训练, 语言模型就是给定一个词的上下文去预测下一个词
- 做downstream任务时从预训练网络中提取对应单词的来自网络各层的word embedding 作为新的补充特征
第一阶段:利用语言模型进行预训练
模型概览
预训练网络使用双层双向LSTM,其中E1表示单词特征的embedding的来源根据论文原文可以是:via token embeddings or a CNN over characters
语言模型训练的任务目标是根据单词的上下文预测 W i W_i Wi, W i W_i Wi之前的单词序列为上文,之后的序列为下文
上图左半部分的LSTm为正向编码器,输入从左到右顺序的 W i W_i Wi的上文;右半部分则为反向编码器,输入从右到左的逆序的 W i W_i Wi的下文;每个编码器由两层LSTM网络构成。
预训练结束后,每当downstream任务中的token需要embedding时,可以从中得到三个embedding:
- E1 word embedding (如word2vec 或Glove等预训练词向量)
- E2 包含句法特征的 embedding
- E3 包含语义特征的 embedding
通过加深网络层数,可以得到具备更多全局信息的embedding
总结:预训练的产物(1)三个word embedding (2)双层BiLSTM网络
第二阶段:下游任务利用预训练好的embedding
模型概览
假如我们的下游任务是QA(问答),我们将下游任务的输入句子X输入到预训练好的ELMO中,于是X中的每个单词可以得到3个embedding,由上图红色框内可以看出,三个word embedding通过三个不同的权重组合成每个token的新的embedding,权重可以通过学习得来。然后将整合后的这个Embedding作为X句在下游任务中对应单词的输入,该组合后新的embedding作为补充特征给下游任务使用。
因为ELMO给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为"Feature-based Pre-Training"。
第一阶段预训练过程
第一阶段实际上就是在训练一个双向语言模型,假设给定一个序列,该序列含有 N N N 个token ( w 1 , w 2 , … , w N ) (w_1, w_2, \dots, w_N) (w1,w2,…,wN) ,那么:
- 前向语言模型通过在给定上文 (Context-before)
(
w
1
,
w
2
,
…
,
w
k
−
1
)
(w_1, w_2, \dots, w_{k-1})
(w1,w2,…,wk−1)的情况下对token
W
k
W_k
Wk的概率建模来计算序列出现的概率:
p ( w 1 , w 2 , … , w N ) = ∏ k = 1 N p ( w k ∣ w 1 , w 2 , … , w k − 1 ) p\left(w_{1}, w_{2}, \ldots, w_{N}\right)=\prod_{k=1}^{N} p\left(w_{k} \mid w_{1}, w_{2}, \ldots, w_{k-1}\right) p(w1,w2,…,wN)=k=1∏Np(wk∣w1,w2,…,wk−1)
主流的神经语言模型会先给序列中每个token计算一个上下文无关的embedding表示
x
k
L
M
\mathbf{x}_{k}^{L M}
xkLM,然后将其传递给L层LSTM。
在前向LSTM的每个位置k,每层会输出一个上下文相关的
h
→
k
,
j
L
M
\overrightarrow{\mathbf{h}}_{k, j}^{L M}
hk,jLM,
j
=
1
,
…
,
L
j=1,\dots,L
j=1,…,L,在ELMo中
L
L
L取2。
- 后向语言模型与前向类似,但是它是“从后往前建模的”,通过在给定下文 (Context-after)
(
w
k
+
1
…
,
w
N
)
(w_{k+1}\dots, w_{N})
(wk+1…,wN)的情况下对token
W
k
W_k
Wk的概率建模来计算序列出现的概率:
p ( w 1 , w 2 , … , w N ) = ∏ k = 1 N p ( w k ∣ w k + 1 , w k + 2 , … , w N ) p\left(w_{1}, w_{2}, \ldots, w_{N}\right)=\prod_{k=1}^{N} p\left(w_{k} \mid w_{k+1}, w_{k+2}, \ldots, w_{N}\right) p(w1,w2,…,wN)=k=1∏Np(wk∣wk+1,wk+2,…,wN)
类似于前向语言模型,输入上下文无关的embedding表示 x k L M \mathbf{x}_{k}^{L M} xkLM后,每层后向LSTM会输出一个上下文相关的 h ← k , j L M \overleftarrow{\mathbf{h}}_{k, j}^{L M} hk,jLM, j = 1 , … , L j=1,\dots,L j=1,…,L。
输入上下文无关的embedding表示 x k L M \mathbf{x}_{k}^{L M} xkLM是前后向语言模型共享的。
因此,ELMo结合了前后向语言模型,目标是同时最大化前后向语言模型的对数似然:
∑
k
=
1
N
(
log
p
(
w
k
∣
w
1
,
…
,
w
k
−
1
;
Θ
x
,
Θ
⃗
L
S
T
M
,
Θ
s
)
+
log
p
(
w
k
∣
w
k
+
1
,
…
,
w
N
;
Θ
x
,
Θ
←
L
S
T
M
,
Θ
s
)
)
\begin{aligned} \sum_{k=1}^{N}\left(\log p\left(w_{k} \mid w_{1}, \ldots, w_{k-1} ; \Theta_{x}, \vec{\Theta}_{L S T M}, \Theta_{s}\right)\right.\\ &\left.+\log p\left(w_{k} \mid w_{k+1}, \ldots, w_{N} ; \Theta_{x}, \overleftarrow{\Theta}_{L S T M}, \Theta_{s}\right)\right) \end{aligned}
k=1∑N(logp(wk∣w1,…,wk−1;Θx,ΘLSTM,Θs)+logp(wk∣wk+1,…,wN;Θx,ΘLSTM,Θs))
Θ x , Θ s \Theta_{x} ,\Theta_{s} Θx,Θs分别为token表示,softmax分类的参数,为前后向语言模型共享。
Θ ⃗ L S T M , Θ ← L S T M \vec{\Theta}_{L S T M}, \overleftarrow{\Theta}_{L S T M} ΘLSTM,ΘLSTM分别为前后向语言模型LSTM层的参数
第二阶段 应用到下游任务
ELMo训练好的embedding的公式化表示如下所示:
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
}
\begin{aligned} R_{k} &=\left\{\mathbf{x}_{k}^{L M}, \overrightarrow{\mathbf{h}}_{k, j}^{L M}, \overleftarrow{\mathbf{h}}_{k, j}^{L M} \mid j=1, \ldots, L\right\} \\ &=\left\{\mathbf{h}_{k, j}^{L M} \mid j=0, \ldots, L\right\} \end{aligned}
Rk={xkLM,hk,jLM,hk,jLM∣j=1,…,L}={hk,jLM∣j=0,…,L}
其中L为LSTM层数。
h
k
,
0
L
M
为token的 embedding表示(即
h
k
,
0
L
M
=
x
k
L
M
)
\left.\mathbf{h}_{k, 0}^{L M} \text { 为token的 embedding表示(即 } \mathbf{h}_{k, 0}^{L M}=\mathbf{x}_{k}^{L M}\right)
hk,0LM 为token的 embedding表示(即 hk,0LM=xkLM)
h
k
,
j
L
M
=
[
h
→
k
,
j
L
M
;
h
k
,
j
]
\mathbf{h}_{k, j}^{L M}=\left[\overrightarrow{\mathbf{h}}_{k, j}^{L M} ; \mathbf{h}_{k, j}\right]
hk,jLM=[hk,jLM;hk,j]为每个双向LSTM层得到的表示。
具体到下游任务应用表示即简单地进行分配权重然后加权
E
L
M
o
k
task
=
E
(
R
k
;
Θ
task
)
=
γ
task
∑
j
=
0
L
s
j
task
h
k
,
j
L
M
,
s
j
task
=
e
s
j
/
∑
i
N
e
s
i
\mathbf{E L M o}_{k}^{\text {task }}=E\left(R_{k} ; \Theta^{\text {task }}\right)=\gamma^{\text {task }} \sum_{j=0}^{L} s_{j}^{\text {task }} \mathbf{h}_{k, j}^{L M}, \quad s_{j}^{\text {task }}=e^{s_{j}} / \sum_{i}^{N} e^{s_{i}}
ELMoktask =E(Rk;Θtask )=γtask j=0∑Lsjtask hk,jLM,sjtask =esj/i∑Nesi
s task \quad s^{\text {task }} stask 是经过softmax归一化之后的权重,标量参数 γ task \gamma^{\text {task }} γtask 是一个超参数,允许任务模型缩放整个ELMo向量,一定程度上能够增强模型的灵活性。
整个为下游任务获取embedding的过程:
ELMo的优势和为什么work
优点:
- 集成了两个单向的语言模型组成双向的语言模型
- 通过预训练可以得到2层的LSTM网络,可以提取训练好的embedding应用于下游任务
- 由于引入了上下文双向语言模型,ELMo可以区分多义词,每个token不再由一个全局唯一,上下文无关的embedding表示
为什么有效?
ELMo生成的3个embedding既包含原始的全局唯一的token embedding(E1)又包含了通过特定上下文传递而生成的两个embedding(E2和E3),根据不同的下游任务可以动态调整三个embedding的权重,从而可以根据上下文进行多义词的区分。