吴恩达深度学习笔记(123)

学习词嵌入(Learning Word Embeddings)

在本节笔记中,你将要学习一些具体的算法来学习词嵌入。

在深度学习应用于学习词嵌入的历史上,人们一开始使用的算法比较复杂,但随着时间推移,研究者们不断发现他们能用更加简单的算法来达到一样好的效果,特别是在数据集很大的情况下。但有一件事情就是,现在很多最流行的算法都十分简单,如果我一开始就介绍这些简单的算法,你可能会觉得这有点神奇,这么简单的算法究竟是怎么起作用的?

从稍微复杂一些的算法开始,因为我觉得这样更容易对算法的运作方式有一个更直观的了解,之后我们会对这些算法进行简化,使你能够明白即使一些简单的算法也能得到非常好的结果,我们开始吧。

假如你在构建一个语言模型,并且用神经网络来实现这个模型。于是在训练过程中,你可能想要你的神经网络能够做到比如输入:“I want a glass of orange ___.”,然后预测这句话的下一个词。在每个单词下面,我都写上了这些单词对应词汇表中的索引。

实践证明,建立一个语言模型是学习词嵌入的好方法,我提出的这些想法是源于Yoshua Bengio,Rejean Ducharme,Pascal Vincent,Rejean Ducharme,Pascal Vincent还有Christian Jauvin。

吴恩达深度学习笔记(123) | NLP | 学习词嵌入

下面我将介绍如何建立神经网络来预测序列中的下一个单词,让我为这些词列一个表格,“I want a glass of orange”,我们从第一个词I开始,建立一个one-hot向量表示这个单词I。这是一个one-hot向量(上图编号1所示),在第4343个位置是1,它是一个10,000维的向量。然后要做的就是生成一个参数矩阵E,然后用E乘以O_4343,得到嵌入向量e_4343,这一步意味着e_4343是由矩阵E乘以one-hot向量得到的(上图编号2所示)。

然后我们对其他的词也做相同的操作,单词want在第9665个,我们将E与这个one-hot向量(O_9665)相乘得到嵌入向量e_9665。对其他单词也是一样,a是字典中的第一个词,因为a是第一个字母,由O_1得到e_1。同样地,其他单词也这样操作。

于是现在你有许多300维的嵌入向量。我们能做的就是把它们全部放进神经网络中(上图编号3所示),经过神经网络以后再通过softmax层(上图编号4所示),这个softmax也有自己的参数,然后这个softmax分类器会在10,000个可能的输出中预测结尾这个单词。假如说在训练集中有juice这个词,训练过程中softmax的目标就是预测出单词juice,就是结尾的这个单词。这个隐藏层(上图编号3所示)有自己的参数,我这里用W^[1] 和b^[1] 来表示,这个softmax层(上图编号4所示)也有自己的参数W^[2] 和b^[2] 。如果它们用的是300维大小的嵌入向量,而这里有6个词,所以用6×300,所以这个输入会是一个1800维的向量,这是通过将这6个嵌入向量堆在一起得到的。

吴恩达深度学习笔记(123) | NLP | 学习词嵌入

实际上更常见的是有一个固定的历史窗口,举个例子,你总是想预测给定四个单词(上图编号1所示)后的下一个单词,注意这里的4是算法的超参数。

这就是如何适应很长或者很短的句子,方法就是总是只看前4个单词,所以说我只用这4个单词(上图编号2所示)而不去看这几个词(上图编号3所示)。如果你一直使用一个4个词的历史窗口,这就意味着你的神经网络会输入一个1200维的特征变量到这个层中(上图编号4所示),然后再通过softmax来预测输出,选择有很多种,用一个固定的历史窗口就意味着你可以处理任意长度的句子,因为输入的维度总是固定的。所以这个模型的参数就是矩阵E,对所有的单词用的都是同一个矩阵E,而不是对应不同的位置上的不同单词用不同的矩阵。然后这些权重(上图编号5所示)也都是算法的参数,你可以用反向传播来进行梯度下降来最大化训练集似然,通过序列中给定的4个单词去重复地预测出语料库中下一个单词什么。

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

这就是早期最成功的学习词嵌入,学习这个矩阵E的算法之一

现在我们先概括一下这个算法,看看我们该怎样来推导出更加简单的算法。现在我想用一个更复杂的句子作为例子来解释这些算法,假设在你的训练集中有这样一个更长的句子:“I want a glass of orange juice to go along with my cereal.”。

我们在上个幻灯片看到的是算法预测出了某个单词juice,我们把它叫做目标词(下图编号1所示),它是通过一些上下文,在本例中也就是这前4个词(下图编号2所示)推导出来的。如果你的目标是学习一个嵌入向量,研究人员已经尝试过很多不同类型的上下文。如果你要建立一个语言模型,那么一般选取目标词之前的几个词作为上下文。但如果你的目标不是学习语言模型本身的话,那么你可以选择其他的上下文。

吴恩达深度学习笔记(123) | NLP | 学习词嵌入

比如说,你可以提出这样一个学习问题,它的上下文是左边和右边的四个词,你可以把目标词左右各4个词作为上下文(上图编号3所示)。这就意味着我们提出了一个这样的问题,算法获得左边4个词,也就是a glass of orange,还有右边四个词to go along with,然后要求预测出中间这个词(上图编号4所示)。

提出这样一个问题,这个问题需要将左边的还有右边这4个词的嵌入向量提供给神经网络,就像我们之前做的那样来预测中间的单词是什么,来预测中间的目标词,这也可以用来学习词嵌入。

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

还有一个效果非常好的做法就是上下文是附近一个单词,它可能会告诉你单词glass(上图编号7所示)是一个邻近的单词。或者说我看见了单词glass,然后附近有一个词和glass位置相近,那么这个词会是什么(上图编号8所示)?这就是用附近的一个单词作为上下文。

我们将在下节中把它公式化,这用的是一种Skip-Gram模型的思想。

这是一个简单算法的例子,因为上下文相当的简单,比起之前4个词,现在只有1个,但是这种算法依然能工作得很好。

研究者发现:

如果你真想建立一个语言模型,用目标词的前几个单词作为上下文是常见做法(上图编号9所示)。

但如果你的目标是学习词嵌入,那么你就可以用这些其他类型的上下文(上图编号10所示),它们也能得到很好的词嵌入。我会在下节详细介绍这些,我们会谈到Word2Vec模型

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

在下节你将看到如何用更简单的上下文和更简单的算法来建立从上下文到目标词的映射,这将让你能够更好地学习词嵌入,一起进入下节学习Word2Vec模型


分享到:


相關文章: