参考一个很全的总结:
预训练语言模型的前世今生 - 从Word Embedding到BERT
ELMo也参考了这个:
【NLP-13】ELMo模型(Embeddings from Language Models)
这里提出的一个新的问题是:Word2Vec通过大规模语料对每个单词训练出固定词向量,但没有办法解决多义词的问题,ELMo就是为了这个任务而诞生的。它的核心是给予了每个token一个Word Embedding,即每个句子中样貌相同的词汇也会有不同的Embedding。
这里其实就用到了迁移学习的思想,使用了在大规模语料库上训练好的Word Embedding,输入ELMo模型中进行Fine-Tuning,这里ELMo模型的训练数据是去除标签的,可以根据上下文信息学习到当前语境下的Word Embedding。
ELMo模型
模型结构

使用了双向LSTM,根据上下文预测单词。
ELMo采用了两阶段过程:
第一个阶段是使用语言模型进行预训练
第二个阶段是在下游应用时,从预训练网络中提取对应单词网络歌城的Word Embedding作为新特征补充到下游任务中。
训练好这个网络之后,每输入一个新的句子都能得到三个Embedding:
- 单词的Word Embedding;
- 第一层双向LSTM,包含更多的句法信息;
- 第二层双向LSTM,包含更多的语义信息。
下游应用:

这样对于下游任务:
- 将句子 X X X 输入ELMo网络中,这样句子 X X X 中每个单词在ELMo网络中都能获得对应的三个Embedding;
- 之后赋予每个Embedding一个权重a,这个权重可以由学习得来,根据权重求和之后将三个Embedding整合为一个;
- 将整合后的Embedding作为相应的单词输入,作为新特征给下游任务使用;
这一类的训练方法也叫作“Feature-based Pre-Training”。
公式
前向表示:
p
(
t
1
,
t
2
,
…
,
t
N
)
=
∏
k
=
1
N
p
(
t
k
∣
t
1
,
t
2
,
…
,
t
k
−
1
)
p(t_1,t_2,…,t_N)=\prod_{k=1}^Np(t_k|t_1,t_2,…,t_{k-1})
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(t_1,t_2,…,t_N)=\prod_{k=1}^Np(t_k|t_{k+1},t_{k+2},…,t_{N})
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
k
+
2
,
…
,
t
N
,
Θ
x
,
Θ
←
L
S
T
M
,
Θ
s
)
)
\sum_{k=1}^N(\log p(t_k|t_1,…,t_{k-1},\Theta_x,\overrightarrow\Theta_{LSTM},\Theta_s)+\log p(t_k|t_{k+1},t_{k+2},…,t_{N},\Theta_x,\overleftarrow\Theta_{LSTM},\Theta_s))
k=1∑N(logp(tk∣t1,…,tk−1,Θx,ΘLSTM,Θs)+logp(tk∣tk+1,tk+2,…,tN,Θx,ΘLSTM,Θs))
由于ELMo模型使每一层的向量都使用,因此通过一个L层的网络会产生2L+1个表征(每一层双向两个向量,初始输入一个向量,共有3个)
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&=\{\mathbf x^{LM}_k,\overrightarrow h^{LM}_{k,j},\overleftarrow h^{LM}_{k,j} |j=1,…,L \}\\ &=\{\mathbf{h}^{LM}_{k,j} |j=0,…,L \} \end{aligned}
Rk={xkLM,hk,jLM,hk,jLM∣j=1,…,L}={hk,jLM∣j=0,…,L}
k表示单词位置,j表示所在层,j=0表示输入层,所以上式中的
x
k
L
M
=
h
k
,
j
L
M
\mathbf x^{LM}_k=\mathbf{h}^{LM}_{k,j}
xkLM=hk,jLM
下游任务会将
R
k
R_k
Rk 压缩为一个向量:
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
\begin{aligned} ELMo^{task}_k &=E(R_k;\Theta^{task})\\ &=\gamma^{task}\sum_{j=0}^Ls_j^{task}\mathbf{h}^{LM}_{k,j} \end{aligned}
ELMoktask=E(Rk;Θtask)=γtaskj=0∑Lsjtaskhk,jLM
其中
s
j
t
a
s
k
s_j^{task}
sjtask 是softmax标准化权重,
γ
t
a
s
k
\gamma^{task}
γtask 是缩放系数,允许任务模型缩放整个ELMo向量。
这样通过不同表征的权重分配,就可以实现通过上下文区分多义词了。