NLP《词汇表示方法(六)ELMO》

我们已经学习了多种词向量的表示方法,嵌入词向量,基本上都是通过学习语言模型LM学习来的副产品。

但是都有一个很大的缺点就是,每一个单词都假设只有一个特定的嵌入向量表示,这显然还是不太符合我们的语言习惯,因为显然有时候同一个词语会有不同的意思,也就是一词多义,不论是中文英文都有这现象。例如单独看一个词语 Apple,我们不能确定说它的含义是“苹果”还是“苹果公司”,单词表示固然重要,但是必须得结合上下文才能具体表达含义。也就是该词向量一旦训练完成,词向量都是不会变化了的,不论将来使用的上下文如何变化,词向量依然保持数值不变。这个数值不变,带来的影响就是词向量没有很好携带上下文的信息,是独立于上下文的存在。

我们希望在谈论水果的时候,词向量“Apple”和“watermelon”更加接近,谈论科技公司的时候,词向量“Apple”和“HUAWEI”更加接近,而不是二者之间取了个均和值,用一个值来代表这个多义词。

ELMo模型就用于解决上述问题。So, Let’s start…

一:整体介绍
在这里插入图片描述

这个模型就定义好了,训练的话就是根据预料库输入每个句子,进行语言模型的训练。

它是一个多层双向的LSTM的RNN模型,用于训练LM,论文中给的是双层双向的。

当前有一个句子s={t1, t2, t3, t4,…,tN},有N个token
前向LSTM,根据前K-1个token预测第K个token的条件概率。
在这里插入图片描述

后向LSTM,根据后(N-k)个token预测第K个token的条件概率。
在这里插入图片描述

嗯,很符合基于双向LSTM的LM的概念定义哈,如果这里不熟悉可以参考之前学习的基于RNN的语言模型文章NLP《语言模型(三)-- 基于循环神经网络的RNNLM语言模型》。

最后我们希望用极大似然估计出目标token的最大概率值,目标函数如下,此处是求最大,加上负号就是转换成了求最小。

在这里插入图片描述

我们需要注意的几个向量,假设模型是L层的,对于每一个token,t_k来说,有2L+1层个向量。
在这里插入图片描述

这些向量很有用,每一层越往上越能学习一些高级的特性,从单词,到句法,再到语法语义,都是逐渐学习更深层的含义,包含了上下文的信息。

如上,我们LM训练好了,我们得到一堆的向量,正如上式所描述那样。至此,ELMo的第一阶段,训练LM全部结束了。

使用的话,到底怎么用呢?简单一点的话,直接使用最上层(最后一层)的向量作为词向量不就好了么,但是更加普遍的做法是“我全都要”,因为每层lstm输出,或者每层lstm学到的东西是不一样的,针对每个任务每层的向量重要性也不一样。

值得注意的是,每一层有一个前向lstm的输出,一个后向lstm的输出,两者就是简单的拼接起来的。也就是如果分别都是m1维的列向量,拼完之后就是2m1的列向量,就这么简单。这样的话,从数量上,也就是将2L+1个向量转换为了L+1个向量。

如果是双层双向的LSTM模型,那么就会产生3个向量,
每次输入一个新的句子,它的输出是多个Embedding向量,除了原生的和word2vec一样的E1向量(这个是固定的),还多了一些根据上下文语义形成的其他Embedding向量,E2,E3,等等,这些更高层的向量是根据上下文动态生成的带有语义信息的向量,因此能解决多义词的问题,越往上的向量,携带的信息量就越多。

因此,如下图所示,每一层的向量我都要,通过加权来决定向量的重要程度,加权的参数是通过下游任务训练共同训练出来的。
在这里插入图片描述

例如上图展示了下游任务的使用过程,比如我们的下游任务仍然是 QA 问题,此时对于问句 X,我们可以先将句子 X 作为预训练好的 ELMO 网络的输入,这样句子 X 中每个单词在 ELMO 网络中都能获得对应的三个 Embedding,之后给予这三个 Embedding 中的每一个 Embedding 一个权重a,这个权重可以学习得来,根据各自权重累加求和,将三个 Embedding 整合成一个。

总结一下,不像传统的词向量,每一个词只对应一个词向量,ELMo利用预训练好的双向语言模型,然后根据具体输入从该语言模型中可以得到上下文依赖的当前词表示(对于不同上下文的同一个词的表示是不一样的),再当成特征加入到具体的NLP有监督模型里。其词向量是动态生成的。

它的缺点是: 1:不能并行化,因为是RNN模型,只能递归预算,无法并行。