原文出自彼得攀的小站
Deep contextualized word representations 获得了NAACL 2018的outstanding paper award,其方法有很大的启发意义,本文则是对其做了一个简要梳理。
Motivation
- 预训练的word representation在NLP任务中表现出了很好的性能,已经是很多NLP任务不可或缺的一部分,论文作者认为一个好的word representation需要能建模以下两部分信息:
- 单词的特征,如语义,语法
- 单词在不同语境下的变化,即一词多义
- 之前很多工作的word representation是固定的,如word2vec/glove等word representation对于一个词,其向量是固定的,无法很好的处理一词多义的情况
Introduction
基于上述原因,论文作者提出了Deep contextualized word representation来解决这个问题,算法大致过程如下:
- 在大规模语料中利用bidirectional LSTM模型训练语言模型(language model),ELMo(Embedding from language model)也由此得名
- 为了应用到下游任务,利用下游任务的语料库(无需label)对预训练的语言模型进行微调,然后再利用下游任务有标注的数据进行supervised learning
简单来说,ELMo模型是从深层的双向语言模型(deep bidirectional language model)中的内部状态(internal state)学习而来的
相较于之前的工作,ELMo的特点有:
- Embedding是“deep"的,这体现在ELMo是biLM(bi-Language model)内部所有层的综合,这样可以有充分的信息来建模word representation:
- Higher-level LSTM states可以捕获上下文相关的语义信息,不用修改就可以用来做词义消歧
- Lower-level LSTMstates 可以捕获语法相关的信息,可以用作词性标注任务
ELMo综合了上述信息,而之前的工作只利用了top LSTM layer的信息
- 其词向量是动态的,即根据当前上下文环境来产生当前词向量,而不是一个固定的外部词向量
Bidirectional language model
语言模型的双向体现在对句子的建模:给定一个 N N N个token的句子, ( t 1 , t 2 , … , t N ) \left(t_{1}, t_{2}, \ldots, t_{N}\right) (t1,t2,…,tN)
- 前向语言模型:从历史信息预测下一个词,即从给定的历史信息
(
t
1
,
…
,
t
k
−
1
)
\left(t_{1}, \ldots, t_{k-1}\right)
(t1,…,tk−1)建模下一个token
t
k
t_k
tk的概率
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)
对于一个L层的LSTM,设其输入是 x k L M x_k^{LM} xkLM (token embedding),每一层都会输出一个context-dependent representation h → k , j L M \overrightarrow \mathbf{h}_{k, j}^{L M} hk,jLM,LSTM的最后一层输出为 h → k , L L M \overrightarrow \mathbf{h}_{k, L}^{L M} hk,LLM,该输出会在Softmax layer被用来预测下一个token t k + 1 t_{k+1} tk+1 - 后向语言模型:从未来信息预测上一个词,即从给定的未来
(
t
k
+
1
,
…
,
t
N
)
\left(t_{k+1}, \ldots, t_{N}\right)
(tk+1,…,tN)建模上一个token
t
k
t_k
tk的概率
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)
同样地,对于一个L层的LSTM,设其输入是 x k L M x_k^{LM} xkLM (token embedding),每一层都会输出一个context-dependent representation h ← k , j L M \overleftarrow \mathbf{h}_{k, j}^{L M} hk,jLM,LSTM的最后一层输出为 h ← k , L L M \overleftarrow \mathbf{h}_{k, L}^{L M} hk,LLM,该输出会在Softmax layer被用来预测上一个token t k − 1 t_{k-1} tk−1
双向语言模型是前向、后向的一个综合,通过两个方向的对数极大似然估计来完成:
∑
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{array}{l}{\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)\right.} \\ {\left.\quad+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \overleftarrow \Theta_{L S T M}, \Theta_{s}\right)\right)}\end{array}
∑k=1N(logp(tk∣t1,…,tk−1;Θx,ΘLSTM,Θs)+logp(tk∣tk+1,…,tN;Θx,ΘLSTM,Θs))
其中:
- Θ x \Theta_{x} Θx是token embedding
- Θ s \Theta_{s} Θs代表softmax layer的参数
biLM利用了biLSTM,biLSTM在前向和后向两个方向上共享了部分权重
ELMo
对于一个token,ELMo会计算
2
L
+
1
2L+1
2L+1个representation(输入的一个token embedding和前向、后向的2L个representation):
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} | j=1, \ldots, L\right\} \\ &=\left\{\mathbf{h}_{k, j}^{L M} | j=0, \ldots, L\right\} \end{aligned}
Rk={xkLM,hk,jLM,hk,jLM∣j=1,…,L}={hk,jLM∣j=0,…,L}
其中:
- h k , 0 L M \mathbf{h}_{k, 0}^{L M} hk,0LM是token layer
- h k , j L M = [ h → k , j L M ; h ← k , j L M ] , \mathbf{h}_{k, j}^{L M}=\left[\overrightarrow{\mathbf{h}}_{k, j}^{L M} ; \overleftarrow{\mathbf{h}}_{k, j}^{L M}\right], hk,jLM=[hk,jLM;hk,jLM], 代表biLSTM layer
在下游任务中,ELMo将
R
R
R的所有层压缩成一个向量
E
L
M
o
k
=
E
(
R
k
;
Θ
e
)
\mathbf{E L M o k}=E\left(R_{k} ; \Theta_{e}\right)
ELMok=E(Rk;Θe)(在最简单的情况下,也可以只使用最后一层
E
(
R
k
)
=
h
k
,
L
L
M
E\left(R_{k}\right)=\mathbf{h}_{k, L}^{L M}
E(Rk)=hk,LLM:
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
\mathbf{E L M o}_{k}^{t a s k}=E\left(R_{k} ; \Theta^{t a s k}\right)=\gamma^{t a s k} \sum_{j=0}^{L} s_{j}^{t a s k} \mathbf{h}_{k, j}^{L M}
ELMoktask=E(Rk;Θtask)=γtaskj=0∑Lsjtaskhk,jLM
其中:
- s t a s k s_{task} stask是softmax正则化权重参数
- γ task \gamma^{\text {task}} γtask是一个标量,可以让下游任务来放缩ELMo向量
从上述计算过程可以看出,ELMo是biLM多层输出的线性组合
在supervised NLP tasks中使用ELMo
给定一个 N N N个token的句子, ( t 1 , t 2 , … , t N ) \left(t_{1}, t_{2}, \ldots, t_{N}\right) (t1,t2,…,tN),supervised NLP model处理的标准过程的输入是context-independent token词向量 x k x_k xk,加入ElMo有两种方式:
- 直接将ELMo词向量 E L M o k ELMo_k ELMok和普通词向量 x k x_k xk拼接得到 [ x k ; E L M o k t a s k ] \left[\mathbf{x}_{k} ; \mathbf{E L M o}_{k}^{t a s k}\right] [xk;ELMoktask]作为model输入
- 将ELMo词向量 E L M o k ELMo_k ELMok和隐藏层输出 h k h_k hk进行拼接得到 [ h k ; E L M o k t a s k ] \left[\mathbf{h}_{k} ; \mathbf{E} \mathbf{L} \mathbf{M} \mathbf{o}_{k}^{t a s k}\right] [hk;ELMoktask]
Evaluation
- Textual entailment:
stanford natural language inference (SNLI)数据集上提升了1.4%。 - Question answering:
在stanford question answering dataset (SQuAD)数据集上提升了4.2%,将ELMo加入到之前的state-of-the-art的ensemble模型中,提升了10%。 - Semantic role labeling:
比之前的state-of-the-art模型提高了3.2%,将ELMo加入到之前的state-of-the-art的单模型中,提升了1.2%。 - Coreference resolution:
比之前的state-of-the-art模型提高了3.2%,将ELMo加入到之前的state-of-the-art的ensemble模型中,提升了1.6%。 - Named entity extraction:
在CoNLL 2003 NER task数据机上提高了2.06% - Sentiment analysis:
比之前的state-of-the-art模型提高了3.3%,将ELMo加入到之前的state-of-the-art模型中,提升了1%。
如何在代码中使用ELMo
使用ELMo预训练模型
pip install allennlp
参考官方主页AllenNLP
自己训练ELMo
TensorFlow:
Pytorch:

ELMo是NAACL 2018的优秀论文提出的深度上下文化词向量,解决了词向量的一词多义问题。通过在大规模语料中训练双向LSTM语言模型,ELMo的词向量会根据上下文动态生成,既包含高层的语义信息,也保留了底层的语法特性。在多项NLP任务中,如文本蕴含、问答、语义角色标注等,ELMo都取得了显著的性能提升。
2万+

被折叠的 条评论
为什么被折叠?



