Deep contextualized word representations

参考论文:Deep contextualized word representations

参考链接:https://www.jianshu.com/p/d93912d5280e

传统word embeding

在读这篇论文之前,首先我们要了解word embeding存在的问题。通常word embeding是通过大型语料库预训练得出的一个v*m的大表,v是词的个数,m是用维度为m的向量来表示词。

word embeding的好处就在于可比较词的相似度,相近的两个词,它们的embeding越相近。

但是word embeding是一个静态的词表,也就是说一旦预训练完成,这个词的embeding就是确定的,但是在实际应用中,往往是需要结合语境的,尤其是一词多义,如单词bank

 而在很长一段时间里,静态的word embeding都是非常重要的word表示方式,直到Elmo的出现,终于提供了一种deep contextualized word representation。

1. 可以表示句法和语法

2. 可以表示一词多义,对一词多义建模

不同于传统的word embeding, elmo representations are deep, in the sense that they are a function of all of the in- ternal layers of the biLM. More specifically, we learn a linear combination of the vectors stacked above each input word for each end task, which markedly improves performance over just using the top LSTM layer.

从paper中,我们可以了解到elmo结合了每层的表示,基于大规模语料训练后的双向语言模型内部隐状态特征的组合,并且在特定任务中可以微调。这篇论文还指出bilstm的high-level提取出了语境相关的含义,可以用于语义理解的任务,而low-level捕捉到了词性和句法,可以应用于一部分的语音标注中。

ELMO:Embeding from Language Models

在了解ELMO之前,首先需要了解下语言模型

给定一句话,这句话最终分词分为N个token,如s = (t1, t2, ..., tN ),则建立前向语言模型,s是一句话的概率可以表示为:

对tk, lstm的每层都会输出一个语境相关的表示,j=(1,····L),表示最高层的输出,可以利用最高层,经过softmax层表示预测下一个tk+1。

前向语言模型的流程如下图:

同理,后向语言模型,s是一句话的概率可以表示为:

和前向语言模型类似,这里就不再重复描述。

将前向语言模型和后向语言模型结合起来就形成biLM。

其中两个方向的LSTM的参数不是共享的,\Theta_x就是一开始输入的词向量,\Theta_s就是softmax层参数。因此,双向语言模型的结构图如下:

对于每一个词t_k,一个L层的biLM可以计算出2L + 1个表达如下,

R_k = \{x_k^{LM}, \overrightarrow{h}_{k,j}^{LM}, \overleftarrow{h}_{k,j}^{LM} | j = 1,...L\}

如果我们统一用h_{k,j}^{LM} = [\overrightarrow{h}_{k,j}^{LM};\overleftarrow{h}_{k,j}^{LM}]来表示biLM的每一层输出,h_{k,0}^{LM}来表示第一层向量,其实就是传统的word embeding,那么整个表达可以统一表示为

R_k = \{h_{k,j}^{LM} | j = 0,...L\}

而前面也说了,ELMO本质上就是一个任务导向的,双向语言模型(biLM)内部的隐状态层的组合。通用的表达式如下

其中,参数s,原论文说softmax-normalized weights,其实可以理解为L+1层的权值,类似于归一化处理。而\gamma是用来控制ELMO模型生成的向量大小,该系数对于后续的模型优化过程有好处(在附件中,作者强调了这个参数的重要性,因为biLM的内核表达,与任务需要表达,存在一定的差异性,所以需要这么一个参数去转换。并且,这个参数对于就是只取最后一层尤其重要。

biLM在有监督的NLP任务中的使用

给定一个预训练好的elmo和某个有监督的nlp任务的网络结构,利用elmo提高当前任务的效果是非常简单的,首先在当前比较小的语料库中跑elmo,记录每个token在每一层的表示,然后让具体下游任务学习这些token表示的线性表示方式,其实就是学习参数s和参数\gamma,然后再和原有的词向量层x拼接。以token = stick为例,正如下图所表示:

(To add ELMo to the supervised model, we first freeze the weights of the biLM and then concatenate the ELMo vector ELMo task with k xk and pass the ELMo enhanced representation[x ; ELMotask ] into the task RNN.)

在实验部分,作者实验了elmo的使用方式和使用位置

使用方式: 只用elmo的最后一层或者用多层的线性组合

使用位置:和传统的word embeding拼接在一起,作为输入,或者将放在和hk拼接作为下一层的输入。

ELMO中不同的层,能从不同的纬度表达一个词,作者经过实验发现,低层的输出能更好的从句法语法的层面表达一个词,而高层的输出能更好的从语意的层面表达一个词。