本文为学习教程中的翻译记录。教程原文请参见Word2Vec Tutorial - The Skip-Gram Model。
Word2Vec Tutorial - The Skip-Gram Model
本教程覆盖Word2Vec的skip gram神经网络结构。本教材的目的是跳过关于Word2Vec的通常介绍和抽象见解,而引入更多的细节。具体地,我将深入skip gram神经网络模型。
The Model
skip gram神经网络模型的基本的形式简单地令人惊讶。Word2Vec使用了您在其他机器学习方法中可能见过的技巧。我们计划训练一个只有单个隐藏层的简单神经网络来执行某个任务。但是,我们实际上不会使用神经网络来完成我们训练它的任务!相反,目标实际上只是学习隐藏层的权重——我们将看到这些权重实际上是我们试图学习的"单词向量"。
另一个您可能见过这种技巧的地方的无监督特征学习,其中您训练一个自动编码器在隐藏层压缩输入向量,且在输出层把其解压回原始向量。在训练后,您剥离输出层(解压步骤),其只使用隐藏层——这是一个无需标记训练数据就能学习良好的图像特征的技巧。
The Fake Task
那么,现在我们需要讨论我们将要创建神经网络去运行的“假”任务。随后,我们将回到模型如何直接反馈给我们这些我们真实需要的单词向量。
我们将训练神经网络做以下工作。给定一个句子中间的一个指定单词(输入单词),查看附近的单词并随机选择一个。网络将告诉我们,词汇中每个单词是我们选择的"附近单词"的概率。
当我说“附近”时,这实际上是算法中的一个“窗口大小”参数。典型的窗口大小可能是5,意思是后面5个字,前面5个字(总共10个)。
输出概率将与在输入单词附近找到词汇表中每个单词的可能性有关。例如,如果你把单词“Soviet”作为训练后模型的输入,那么单词,如“Union”和“Russia”,的概率将远远高于不相关单词,如“watermelon”和“kangaroo”。
我们将通过给神经网络提供从训练文档中找到的单词对来训练神经网络。下面的例子展示了一些来自句子“The quick brown fox jumps over the lazy dog”的训练样本(单词对)。在这个例子中,我使用了一个较小的窗口尺寸(2)。蓝色高亮的单词是输入单词。
这个网络将要从每个对出现的次数中学习统计量。因此,例如,这个网络可能会得到比(“Soviet”, “Sasquatch”)更多的训练样本(“Soviet”, “Union”)。当训练结束后,如果您将单词“Soviet”作为输入,随后它将给“Union”和“Russia”输出比“Sasquatch”更高的概率。
Model Details
那么,这一切是如何表现的呢?
首先,您知道您不可能将一个形如文本字符串的单词提供给一个神经网络,因此我们需要一种方法将单词表示到网络中。为此,我们首先从我们训练样本中创建一个单词词汇表——让我们假设我们有一个拥有10,000个不同单词的词汇表。
我们将一个输入单词,如“ants”,表示为独热(one-hot)向量。这个向量有10,000个成分(每个成分代表我们词汇表中的一个单词),且我们将“1”放置到单词“ants”对应的位置,将“0”放置在其他位置。
这个网络的输出是一个单一的向量(同样有10,000个成分)。每一个成分表示一个随机选择的附近单词是我们词汇表中对应单词的概率。
以下是我们神经网络的结构:
在隐藏层神经元上没有使用任何的激活函数,但是输出的神经元使用了softmax。我们稍后在讨论这一点。
当在单词对上训练网络,输入是代表输入单词的独热向量,且训练的输出是一个代表输出单词的独热向量。但是,当您在输入词上评估训练后的网络时,输出向量实际上是一个概率分布(即一堆浮点值,而不是一个独热向量)。
The Hidden Layer
在我们的例子中,我们说我们将要学习带有300个特征的词向量。因此,隐藏层将被表示为10,000行和300列(一列是一个神经元)的权重矩阵。
300个特征是Google用在它们发表的在Google news数据集上训练的模型。特征的数量是一个您需要根据您应用而调节的超参数(也就是说,尝试不同的值,然后看看哪个参数能产生最好的结果)。
如果您查看这个权重矩阵的行,它们实际上将是我们的词向量!
因此,这一切的最终目标实际上只是学习这个隐藏的层重量矩阵——我们只是去无目的地完成输出层。
不过,让我们回到我们要训练的这个模型的定义中去。
现在,您可能会问您自己——“独热向量几乎全部为0……它的作用是什么呢?” 如果你将一个1x10,000的独热向量乘上一个10,000x300的矩阵,它将有效地选择对应“1”的矩阵行。这里有一个给你直观感受的小例子。
这意味着此模型的隐藏层实际上只是作为查找表在运行。隐藏层的输出只是输入单词的“词向量”。
The Output Layer
对应“ants”的1x300的词向量随后被输入输出层。输出层是一个softmax回归分类(Softmax Regression教程)。但其要点是,每个输出神经元(一个神经元是我们词汇表中的一个单词!)将产生0和1间的输出,且所有输出值的和相加为1。
具体来说,每个输出神经元都有一个权重向量,它从隐藏层中乘以词向量,然后将函数exp(x)应用于结果。最后,为了使所有输出相加为1,我们将此结果除以所有10,000 个输出节点的结果之和。
下面是计算"car"一词输出神经元的输出的示例。
请注意,神经网络对输出词相对于输入词的偏移一无所知。对输入之前和输入后的单词,它不会学习一组不同的概率。为了理解其中的含义,让我们说,在我们的训练语料库中,"York"一词的每一次出现都在"New"词后。即,至少根据训练数据,"New"在"York"附近的可能性为100%。但是,如果我们在"York"附近取10个单词,且随机选择其中一个单词,则该词为"New"的概率不会是100%:你可能在附近选了另一个词。
Intuition
好的,你准备好对这个网络进行更加深入的了解了吗?
如果两个不同的单词有非常相似的"上下文"(即它们周围可能出现哪些单词),那么我们的模型需要为这两个单词输出非常相似的结果。网络为这两个词输出类似上下文预测的一种方法是使其对应的词向量相似。所以,如果两个词有相似的上下文,那么我们的网络被鼓励为这两个单词学习相似的词向量。
两个词具有相似的上下文意味着什么?我认为你可以期待,像"intelligent"和"smart"这样的同义词会有非常相似的上下文。或者,相关词(如"engine"和"transmission")也可能具有类似的上下文。
这也可以为您进行词干处理——网络可能会为单词"ant"和"ants"学习类似的词向量,因为它们应该有类似的上下文。
Next Up
你可能已经注意到,skip-gram神经网络包含大量的权重(^^)……以我们为例,有300个特征和包含10,000个单词的词汇表,即隐藏层和输出层各有3M权重!在大型数据集中进行此训练令人望而却步。因此,为了使训练过程可行,Word2vec作者引入了一些调整。这些内容包含在教程的第二部分。
Other Resources
您是否知道 Word2vec模型也可以应用于推荐系统和广告定位的非文本数据?除了从一系列单词中学习向量,您可以从一系列用户操作中学习向量。请在新贴中阅读更多有关此内容的信息。
Cite
McCormick, C. (2016, April 19). Word2Vec Tutorial - The Skip-Gram Model. Retrieved from http://www.mccormickml.com