学习词嵌入(Learning Word Embeddings)

来源:Coursera吴恩达深度学习课程

我们将要学习一些具体的算法来学习词嵌入(learning word embeddings)。从稍微复杂一些的算法开始,因为Andrew觉得这样更容易对算法的运作方式有一个更直观的了解,之后我们会对这些算法进行简化,我们开始吧。

假如你在构建一个语言模型(language model),并且用神经网络(neural network)来实现这个模型。于是在训练过程中,你想要神经网络能够做到比如输入:“I want a glass of orange ___.”,然后预测这句话的下一个词。在每个单词下面,都写上了这些单词对应词汇表中的索引。实践证明,建立一个语言模型是学习词嵌入的好方法,Andrew提出的这些想法是源于这篇论文:A neural probabilistic language model

下面将介绍如何建立神经网络来预测序列中的下一个单词,首先为这些词列一个表格,每个词都用一个one-hot向量表示。然后生成一个参数矩阵E,用E乘以one-hot向量,得到嵌入向量。于是会得到许多300维的嵌入向量。我们能做的就是把它们全部放进神经网络中,经过神经网络以后再通过softmax层,这个softmax分类器会在10,000个可能的输出中预测结尾这个单词。假如说在训练集中有juice这个词,训练过程中softmax的目标就是预测出单词juice,就是结尾的这个单词。隐藏层有自己的参数,这里用W^[1]和b^[1]来表示,这个softmax层也有自己的参数W^[2]和b^[2]。如果它们用的是300维大小的嵌入向量,而这里有6个词,所以用6×300,所以这个输入(input)会是一个1800维的向量,这是通过将这6个嵌入向量堆在一起得到的。

如上图,实际上更常见的是有一个固定的历史窗口。举个例子,你总是想预测给定四个单词(上图紫色标记)后的下一个单词,注意这里的4是算法的超参数。这就是如何适应很长或者很短的句子,方法就是总是只看前4个单词,所以说我只用这4个单词(a,glass,of,orange)而不去看这几个词(上图红色标记)。如果你一直使用一个4个词的历史窗口,这就意味着你的神经网络会输入一个1200维的特征变量到这个层中,然后再通过softmax来预测输出,选择有很多种。所以这个模型的参数就是矩阵E,对所有的单词用的都是同一个矩阵E,而不是对应不同的位置上的不同单词用不同的矩阵。然后这些权重也都是算法的参数,你可以用反向传播来进行梯度下降来最大化训练集似然(maximize the likelihood of your training set),通过序列中给定的4个单词去重复地预测出语料库中下一个单词什么。

事实上通过这个算法能很好地学习词嵌入,原因是在这个算法下apple和orange会学到很相似的嵌入,这样做能够让算法更好地拟合训练集。如果你只用一个300维的特征向量来表示所有这些词,算法会发现要想最好地拟合训练集,就要使apple(苹果)、orange(橘子)、grape(葡萄)和pear(梨)等等,还有像durian(榴莲)这种很稀有的水果都拥有相似的特征向量

这就是早期最成功的学习词嵌入,学习这个矩阵E的算法之一。现在我们先概括一下这个算法,看看我们该怎样来推导出更加简单的算法。

如上图所示,Andrew用一个更复杂的句子作为例子来解释这些算法,假设在训练集中有这样一个更长的句子:“I want a glass of orange juice to go along with my cereal.”。我们在上个幻灯片看到的是算法预测出了某个单词juice,我们把它叫做目标词(target word)(上图蓝色标记所示),它是通过一些上下文,(1)在本例中也就是这前4个词(上图蓝色标记所示)推导出来的。如果你的目标是学习一个嵌入向量,研究人员已经尝试过很多不同类型的上下文。如果你要建立一个语言模型,那么一般选取目标词之前的几个词作为上下文。但如果你的目标不是学习语言模型本身的话,那么你可以选择其他的上下文。

(2)比如说,它的上下文是左边和右边的四个词(4 words on left & right),你可以把目标词左右各4个词作为上下文(上图紫色标记所示)。这就意味着我们提出了一个这样的问题,算法获得左边4个词,也就是a glass of orange,还有右边四个词to go along with,然后要求预测出中间这个词。提出这样一个问题,这个问题需要将左边的还有右边这4个词的嵌入向量提供给神经网络,就像我们之前做的那样来预测中间的单词是什么,来预测中间的目标词,这也可以用来学习词嵌入。

(3)或者你想用一个更简单的上下文,也许只提供目标词的前一个词(last 1 word),比如只给出orange这个词来预测orange后面是什么(上图绿色标记所示),这将会是不同的学习问题。只给出一个词orange来预测下一个词是什么,你可以构建一个神经网络,只把目标词的前一个词或者说前一个词的嵌入向量输入神经网络来预测该词的下一个词。

(4)还有一个效果非常好的做法就是上下文是附近一个单词(nearby 1 word),它可能会告诉你单词glass(上图红色标记所示)是一个邻近的单词。或者说我看见了单词glass,然后附近有一个词和glass位置相近,那么这个词会是什么?这就是用附近的一个单词作为上下文。我们将在下节视频中把它公式化,这用的是一种Skip-Gram模型的思想。这是一个简单算法的例子,因为上下文相当的简单,比起之前4个词,现在只有1个,但是这种算法依然能工作得很好。

研究者发现,(1)如果你真想建立一个语言模型,用目标词的前几个单词(last few words)作为上下文是常见做法(上图蓝色标记所示)。(2)但如果你的目标是学习词嵌入,那么你就可以用这些其他类型的上下文(后面三种类型),它们也能得到很好的词嵌入。

总结一下,在本篇文章中探讨了语言模型问题,模型提出了一个机器学习问题,即输入一些上下文,例如目标词的前4个词然后预测出目标词,学习了提出这些问题是怎样帮助学习词嵌入的。

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

猜你喜欢

转载自blog.csdn.net/csdn_xmj/article/details/118675655