词向量:ELMo

2019-08-13  本文已影响0人  jerrychenly

ELMo(Embedding from Language Models),出自NAACL 2018的一篇论文"Deep contextualized word representations"。ELMo的精髓提现在以下三个方面:

前面我们介绍过Word2Vec和GloVe,他们都有一个共性:语言模型训练完成后,每个词的向量表示就定下来了。不管下游任务是什么场景,词向量都是这个。这种方式有一个很明显的缺陷,没办法根据具体的上下文场景区分多义词

ELMo较前两者最大的进步是能够根据上下文区分多义词。其思想是:先训练语言模型得到一个初步的词向量,这时的词向量也是混合多种词义的。在实际使用过程中,再根据具体的上下文来做调整,经过调整后的词向量更能表示当前上下文的含义,从而解决多义词的问题。所以现在看来,ELMo是根据当前上下文对词向量动态调整的策略

ELMo分两个阶段:第一阶段是通过语言模型进行预训练;第二阶段是在做下游任务时,从预训练的网络中提取对应词的网络各层词向量作为新特征补充到任务中。

下图展示了预训练的过程(网络“盗图”)。


1.png

预训练网络结构采用两层双向LSTM。上图左边的前向双层LSTM表示正向编码器,输入的是从左到右顺序的除预测词W_{i}外的上文;右边的后向双层LSTM表示反向编码器,输入的是从右到左逆序的除预测词W_{i}外的下文。

给定N个token(t_{1}, t_{2},...,t_{N}),前向计算通过给定前面的k-1个位置的token序列计算第k个token的出现概率:
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\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)
biLM训练目标就是最大化:
\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}, \overleftarrow \Theta_{L S T M}, \Theta_{s}\right)\right)
ELMo对于每个token通过一个L层的biLM计算出2L+1个表示:
R_{k}=\left\{x_{k}^{L M}, \vec{h}_{k, j}^{L M}, \overleftarrow h_{k, j}^{L M} | j=1, \ldots, L\right\}=\left\{h_{k, j}^{L M} | j=0, \ldots, L\right\}
其中x_{k}^{L M}是对token进行直接编码的结果(字符级CNN编码),\mathbf{h}_{k, 0}^{L M}代表x_{k}^{L M}h_{k, j}^{L M}=\left[\vec{h}_{k, j}^{L M} ; \begin{array}{l}{L M} \\ {k, j}\end{array}\right],是每个biLSTM层输出的结果。

实际应用中将ELMo中所有层的输出R压缩成单个向量,E L M o_{k}=E\left(R_{k} ; \Theta_{\epsilon}\right),最简单的压缩方法是取最上层的结果作为token的表示:
E\left(R_{k}\right)=h_{k, L}^{L M}
更通用的做法是通过一些参数来联合各层的信息:
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} h_{k, j}^{L M}
其中\mathbf{s}^{\operatorname{task}}是softmax的结果,\gamma是任务相关的scale参数。\gamma在不同任务中取不同的值效果会有较大差异,在SQuAD中设置为0.01取得的效果要好于设置为1时。

文中提到的预训练的语言模型用了两层biLM,对token进行上下文无关的CNN字符级编码,然后将三层的输出scale到1024维,最后对每个token输出3个1024维的向量表示。之所以将三层的输出都作为token的embedding表示是因为实验已经证实不同层的输出信息对于不同任务的作用是不同的,也就是不同层的输出捕捉到的token的信息是不同的。

网络结构确定好,利用大量语料做语言模型任务就能预训练好这个网络。在训练好的网络上输入一个新句子,句中每个词都能得到对应的三个Embedding:最低层是词的word embedding;上一层是第一层双向LSTM中对应词位置的Embedding,这层编码词的句法信息更多一些;再上一层是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些

前面说那么多都是预训练阶段,下面说一说ELMo在下游任务中的使用。拿QA问题举例,对于问句Q,先把Q作为前面预训练好的网络的输入,句中每个词能获得对应的三个embedding,然后根据权重(可以通过学习得到)来把它们合成一个embedding。然后把整合后的embedding作为句子Q在自己任务中对应词的输入即可。在QA问题中,对于回答句子A的处理也是类似。

因为ELMo给下游提供的是每个词的特征形式,所以这一类预训练的方法被称为"Feature-based Pre-Training"。

下图是ELMo在一些NLP任务中的表现:


2.png

可以看到在使用ELMo后,各个任务都有不同程度性能提升。上图中的NLP任务覆盖范围比较广,包含句子语义关系判断,分类任务,阅读理解等多个领域。这也说明ELMo的适用范围比较广,普适性强

参考:
https://allennlp.org/elmo
https://arxiv.org/pdf/1802.05365.pdf
https://www.jiqizhixin.com/articles/2018-12-10-8

上一篇下一篇

猜你喜欢

热点阅读