Heloowird

NLP论文阅读- ELMo

论文题目

Deep Contextualized Word Representations (ELMo)

背景介绍

预训练词向量是神经网络语言理解的基础模块。然而,如何得到高质量的词向量仍是一项挑战。获取高质量的词向量需要解决两个问题:

  1. 词语本身复杂的特性,如语法和语义
  2. 语境变化引发词语用法的改变,如一词多义

特别是第二点,传统词向量基本无能为力,如Word2vec。Word2vec 一般只看周围几个词,仅是语言模型训练过程中的副产物,词向量相对单薄。而ELMo 根据整个句子来决定词的表示,ELMo 是整个双向语言模型中间层表示的融合产物,除了语义语法信息,还可缓解一词多义问题。

ELMo 全称是Embeddings from Language Models。其实Word2vec 也是来源于语言模型,只不过和ELMo 相比,没有尽可能多地利用语言模型的各中间部分的信息。下面具体看看ELMo 是如何利用双向语言模型各层结果的。

模型结构

ELMo预训练双向语言模型架构

如图所示,预训练双向语言模型自底而上分别是句子原始输入(input tokens);输入表示层(token representation layer $L_{o}$);双向LSTM 层(context-sensitive representation layer $L_{1}$);双向LSTM 层(context-sensitive representation layer $L_{2}$)。

原始输入为句子的切分片段$t_{k}$,如词、词片段(word piece)。输入表示层一般直接使用embedding 或者使用字符级CNN 进行编码,得到$\textbf{x}_{k}^{LM}$。这部分是上下文无关的,仅与$t_{k}$有关。

接下来是双向LSTM层。对于任意词$t_{k}$,在已知前面词和后面词的情况下,分别从两个方向预测词${t}_{k}$的概率,并输出该词的前向表示$\overrightarrow{\textbf{h}}_{k,j}^{LM}$ 和后向表示$\overleftarrow{\textbf{h}}_{k,j}^{LM}$。文章使用双向LSTM 层不同方向的参数是共享的。图中仅使用了2 层BiLSTM,理论上是可以使用任意个。

有了各层表示之后,对于每个token $t_{k}$,有2L+1个表示集合:
\begin{equation}
\begin{aligned}
R_{k} &= \left \{ \textbf{x}_{k}^{LM}, \overrightarrow{\textbf{h}}_{k,j}^{LM}, \overleftarrow{\textbf{h}}_{k,j}^{LM} | j= 1, …, L \right \} \\
&= \left \{ \textbf{h}_{k,j}^{LM}|j=1, …, L \right \}
\end{aligned}
\end{equation}
其中$\textbf{h}_{k,0}^{LM}$ 为输入表示层。对于每个biLSTM层$\left(j>0\right)$,$\textbf{h}_{k,j}^{LM} = \left[\overrightarrow{\textbf{h}}_{k,j}^{LM}, \overleftarrow{\textbf{h}}_{k,j}^{LM}\right]$。

对于下游任务来说,ELMo 将每个token的表示集合$R_{k}$ 转换成一个向量,即$\textbf{ELMo}_{k} = E\left(R_{k};\Theta ^{task}\right)$。

最简单地,当仅选择ELMo 最后一个biLSTM 层的输出: $\textbf{ELMo}_{k} = \textbf{h}_{k,j}^{LM}$。

普遍来说$E$是一个根据不同任务对双向语言模型不同层进行加权的函数。
\begin{equation}
\textbf{ELMo}_{k}^{task} = E\left(R_{k};\Theta ^{task}\right) = \gamma^{task} \sum_{j=0}^{L}s_{j}^{task}\textbf{h}_{k,j}^{LM}
\end{equation}

模型训练

文章对Char n-gram进行CNN编码,然后接两层Highway层和一个投影层,将其映射成定长512维向量,然后经过两层隐藏单元为4196、输出维度为512的BiLSTM层,从第一个BiLSTM到第二个biLSTM加一个残差连接。相比固定词表的模式,Char CNN 可以很好解决oov 问题。

将双向语言模型在大规模语料中训练好后,把每个单词对应模型中的各层表示记录下来,然后让下游监督任务学习这些表示的线性组合。一般可以将$\textbf{x}_{k}$ 和$\textbf{ELMo}_{k}$ 拼接起来作为接下来监督任务的输入,监督任务一般采用RNN、CNN 或者全连接层进行训练。在某些任务中,再次把$\textbf{ELMo}_{k}$ 和监督任务监督任务的输出层拼接起来可以提升监督任务的效果。

另外, 文章发现对ELMo加入Dropout 正则或者权重L2 正则,效果更佳。 同时,在多数下游任务中,进一步Finetune 双向语言模型,效果也有提升。

模型分析

ELMo 认为语言模型不同层可以捕获不同级别的语言特性。高级别表示层可以获得语境相关的语义,而低级别表示层能够学习语法层面的信息。结合起来,可以很好的表示词。ELMo 相比ULMFiT,训练过程操作性更好。同时为使用复杂语言模型来获得词向量提供了新思路。

参考资料:

  1. Deep Contextualized Word Representations