自然语言处理 —— 2.5 学习词嵌入

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

所以今天想从一些稍微复杂的算法开始,因为我觉得这样更容易对算法的运作方式有一个更直观的了解,之后我们会对这些算法进行简化,使你能够明白即使是一些非常简单的算法也能得到非常好的结果。
在这里插入图片描述
假如你在构建一个语言模型,并且用神经网络来实现这个模型,于是在训练中你可能想要你的神经网络能够做到比如输入 I   w a n t   a   g l a s s   o f   o r a n g e   ( ) I\space want\space a\space glass\space of\space orange\space () I want a glass of orange (),然后预测这句话的下一个词,在每个单词的下面都写上了这些单词对应字典中的索引。

实践证明,建立一个语言模型是学习词嵌入的好方法,这里提出的这些想法是源于 Y o s h u a   B e n g i o Yoshua\space Bengio Yoshua Bengio R e j e a n   D u c h a r m e Rejean\space Ducharme Rejean Ducharme P a s c a   V i n c e n t Pasca\space Vincent Pasca Vincent还有 C h r i s t i a n   J a u v i n Christian\space Jauvin Christian Jauvin

下面将介绍如何建立神经网络来预测序列中的下一个单词,为 I   w a n t   a   g l a s s   o f   o r a n g e I\space want\space a\space glass\space of\space orange I want a glass of orange列一个表格。从第一个词 I I I开始,建立一个one-hot向量表示这个词 I I I,这是一个one-hot向量,在向量的第4343个位置是1,它是一个10000维的向量,然后要做的就是生成一个参数矩阵E,然后用E乘以 O 4343 O_{4343} O4343得到嵌入向量 e 4343 e_{4343} e4343,这一步意味着 e 4343 e_{4343} e4343是由矩阵E乘以one-hot向量得到的,然后我们对其它的词也做相同的操作。
在这里插入图片描述
于是现在你有很多300维的嵌入向量,这里每一个都是300维的嵌入向量,我们能做的就是把它们全部放进神经网络中。经过神经网络以后,再通过softmax层,这个softmax也也有自己的参数,会在10000个可能的输出中预测结尾这个单词,假如说在训练集中有juice这个词,训练过程中softmax的目标就是预测出单词juice就是结尾的这个单词。

这个隐藏层有自己的参数,这里用 W [ 1 ] W^{[1]} W[1] b [ 1 ] b^{[1]} b[1]表示,softmax层也有自己的参数 W [ 2 ] W^{[2]} W[2] b [ 2 ] b^{[2]} b[2]。如果它们用的是300维大小的嵌入向量,而我们举的例子中有6个词,所以用 6 ∗ 300 6*300 6300,所以这个输入会是一个1800维的向量,这是通过将这6个嵌入向量堆在一起得到的。实际上更常见的是有一个固定的历史窗口,你可能会决定你总是想预测给定四个词后的下一个单词,注意这里的4是算法的超参数,这就是如何适应很长或者很短的句子,方法就是总是只看前4个单词。如果一直使用4个词的历史窗口,这就意味着你的神经网络会输入一个1200维的特征变量到隐藏层,然后再通过softmax来预测输出。选择有很多种,用一个固定的历史窗口就意味着你可以处理任意长度的句子,因为输入的维度总是固定的,所以这个模型的参数就是矩阵E,对所有的单词用的都是同一个矩阵E, W [ 1 ] W^{[1]} W[1] b [ 1 ] b^{[1]} b[1] W [ 2 ] W^{[2]} W[2] b [ 2 ] b^{[2]} b[2]都是算法的参数,你可用后向传播来进行梯度下降来最大化训练集似然。通过序列中给定的4个单词去重复地预测出语料库中的下一个词是什么。

事实上通过这个算法能够很好地学习词嵌入,原因是如果你还记得我们的orange juice,apple juice的例子,在这个算法的激励下,苹果和橙子会学习到很相似的嵌入,这样做能够让算法更好地符合训练集。因为它有时看到的是orange juice,有时看到的是apple juice。

如果你只用一个300维的特征向量来表示所有这些词,算法会发现想要最好地拟合训练集,就要使苹果,橘子,葡萄和梨等等,还有像榴莲这种很稀有的水果,都拥有相似的特征向量,这就是早期最成功的学习词嵌入。

现在我们先概括一下这个算法,看看我们该怎么来推导出更加简单的算法,现在用一个更复杂的句子作为例子来解释这些算法。假设在你的训练集中有一个更长的句子 I   w a n t   a   g l a s s   o f   o r a n g e   j u i c e   t o   g o   a l o n g   w i t h   m y   c e r e a l . I\space want\space a\space glass\space of\space orange\space juice\space to\space go\space along\space with\space my\space cereal. I want a glass of orange juice to go along with my cereal.在上面我们讨论过算法预测出了某个单词juice,我们把它叫做目标词,它是通过一些上下文,在本例中是其前4个词推导得到的。如果你对目标是学习一个嵌入向量,研究人员已经尝试过很多不同类型的上下文。如果你要建立一个语言模型,那么一般选取目标词之前的几个词作为上下文。但如何你的目标不是学习语言模型本身的话,你可以选择其它的上下文。

比如说,你可以提出这样一个学习问题,它的上下文是左边和右边的4个单词,你可以把目标词左右各4个词作为上下文,这就意味着我们提出了一个这样的问题,算法获得左边4个词还有右边4个词,然后要求预测出中间这个词。提出这样一个问题,这个问题需要将左边还有右边的4个词的嵌入向量提供给神经网络,就像我们之前做的那样,来预测中间的单词是什么,这也可以用来学习词嵌入。

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

还有一个效果非常好的做法就是上下文是附近一个单词,它可能会告诉你单词glass是一个邻近的单词,或者说看到了单词glass,然后附近有一个词和glass位置相近,那么这个词会是什么?这就是用附近的一个单词作为上下文,这用的是一种Skip-Gram模型的思想,这是一个简单算法的例子,因为上下文相当的简单比起之前4个词,现在只有1个,但是这种算法依然能够工作得很好。

研究者发现,如果你真想建立一个语言模型,用目标词的前几个单词作为上下文是常见的。但如果你的目标是学习词嵌入,那么你就可以用这些其它类型的上下文,它们也能得到很好的词嵌入。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值