Word2Vec介绍:skip-gram模型
由iquant创建,最终由qxiao 被浏览 9 用户
本文是译文,原文戳这里.
本教程将介绍Word2Vec的skip-gram神经网络模型。本教程的目的是忽略Word2Vec的一般介绍性和抽象概念,深入了解skip-gram的更多的细节。
模型概述
skip-gram神经网络模型其最基本的形式实际上惊人的简单; 我认为是所有的细节和技巧使其难以解释。
我们先从高层次了解该模型。Word2Vec使用了一个在机器学习中经常用到的技巧。我们将训练一个带有单个隐藏层的简单的神经网络来完成某个任务,但是实际上我们并没有使用这个神经网络用于训练我们的任务。相反,我们的目标实际上只是学习隐藏层的权重——我们将看到这些权重实际上是我们试图学习的“词向量”。
另一个使用这个技巧的地方是在无监督的特征学习中,训练一个自动编码器来压缩隐藏层中的输入向量,并在输出层将其解压缩回原始数据。在训练完成后,你可以去掉输出层(解压缩步骤)仅使用隐藏层——这是学习无标签数据的图像特征的一个技巧。
假设任务
现在我们先聊聊这个“假“任务,我们要打造一个神经网络来解决它,然后我们会回过头来理解这个过程是如何间接地得到我们真正想要的词向量。
我们要训练神经网络做以下事情。给定一个句子中的特定单词(输入单词),查看附近的单词并随机选择一个。神经网络将告诉我们词汇表中每个词是这个”附近单词“的概率。
当我说“附近”时,算法实际上有一个“窗口大小”参数。典型的窗口大小是5,即输入单词前5个单词和后5个单词(共10个单词)。
输出概率表示词汇表中每个单词是输入单词的”附近单词“的可能性。例如,如果你给训练后的网络输入单词“Soviet”,输出”Union”和“Russia”的概率将比输出“watermelon”和“kangaroo”这样无关的单词高得多。
我们把训练文档中得到的单词对输入神经网络,以此来进行训练。下面的例子显示了一些训练样本(单词对),我们将从“The quick brown fox jumps over the lazy dog.”这个句子中得到单词对。使用一个窗口大小为2的小窗口为例。以蓝色突出显示的单词是输入单词。
![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='886' height='529'></svg>)
网络将从每个单词对出现的数量中学得统计数据。例如,相较于单词对(“Soviet”, “Sasquatch”),网络可能会获得更多的(“Soviet”, “Union”)训练样本。训练结束后,如果输入“Soviet”一词,则“Union”或“Russia”比“Sasquatch”输出的概率将高得多。
更多细节
所有这些如何表示?
首先,你不能把一个单词作为一个文本字符串输入到一个神经网络中,所以我们需要一种单词的表示方法。为了做到这一点,我们首先要从训练文档中建立一个单词词汇表,假设我们有一个有10,000个唯一单词的词汇表。
我们将把一个像“ants”这样的输入词表示成一个one-hot向量。这个向量的维度是10,000(每个维度表示词汇表中的一个单词),我们将one-hot中“ants”对应的维度置为“1”,所有其他维度置为“0”。
网络的输出是一个向量(维度也是10,000),每一个维度包含该维度对应的词汇表中的单词是“附近单词”的概率。
一下是我们的神经网络的架构。
![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='1569' height='980'></svg>)
隐藏层的神经元没有激活函数,输出神经元使用softmax函数。 我们稍后会回来细说。
当使用单词对训练这个网络时,输入是表示输入单词的one-hot向量,输出也是表示输出词的one-hot向量。但是当你使用输入词评估训练好的网络时,输出向量实际上是一个概率分布(即一堆浮点数的组合,而不是一个one-hot向量)。
隐藏层
对于我们的例子来说,我们想要学习有300个特征值的词向量。所以我们隐藏层的权重矩阵是10000行(每行代表词汇表中的一个词)和300列(一列代表一个隐藏神经元)。
300个特征是Google在他们发表的用Google news数据(下载链接)训练的模型使用的数字。特征值的数量是一个“超参数”,你可以在实际应用时调整该参数(尝试不同的数字,看什么数字能得到最好的结果)。
观察权重矩阵的行,他们就是我们实际想要的词向量。
![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='782' height='671'></svg>)
所以我们的最终目的就是学习隐藏层的权重矩阵——当完成训练输出层就可以“扔掉”了。
让我们回过头来梳理一下我们将要训练的模型的定义。
你可能会问:“one-hot向量几乎全是0…有什么用呢?”如果你用一个1 x 10,000的one-hot向量乘以一个10,000 x 300的矩阵,它将高效的提取矩阵中与”1”对应的那一行。下图是一个简单的例子。
![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='621' height='139'></svg>)
也就是说隐藏层就是一个查询表,隐藏层的输出就是输入单词的”词向量“。
输出层
单词“ants”的1 x 300的词向量输入给输出层。输出层是一个softmax回归分类器(softmax regression classifier)。关于softmax回归的教程可以点击这里,但是要点是每个输出神经元(每个神经元代表词汇表中的一个单词)将产出一个[0,1]之间的数字,所有这些输出值的和为1.
具体来说, 每一个输出神经元都有一个权重向量用于与隐藏层输出的词向量相乘。然后对结果求指数exp(x)。最后,为了使所有输出相加为1,每个输出除以全部10000个输出的和。
下图展示了输出神经元的输出为单词“car”的计算过程。
![](data:image/svg+xml;utf8,<svg%20xmlns='http://www.w3.org/2000/svg' width='1131' height='280'></svg>)
请注意,神经网络不知道输出词相对于输入词的偏差(offset)。它并没有为输入之前的单词与之后的单词学习不同的概率。为了理解这个含义,假设在我们的训练语料库中,每一个单词’York’的前面都有单词’New’。也就是说,至少根据训练数据,’New’在’York’附近的概率是100%。然而,如果我们把’York’附近的10个单词随机选取其中的一个,那么’New’的概率不是100%。你可能选择了附近的其他单词之一。
直观理解
好了,你准备好开始对这个网络开展令人兴奋的洞察了吗?
如果两个不同的单词有非常相似的“上下文”(也就是说,在它们周围可能出现什么词),那么我们的模型将对这两个单词输出非常相似的结果。网络预测类似的上下文的一种方法是,使词向量相似。因此,如果两个词有相似的上下文,那么我们的网络就会主动学习这两个词相似的词向量!呀呼!
这两个词有相似的上下文意味着什么?我想你可以期望像“intelligent”和“smart”这样的同义词会有非常相似的上下文。或者像“engine”和“transmission”这样相关的词也可能有相似的上下文。
这也能处理分词的问题——对于“ant”和 “ants”网络很可能会学习相似的词向量,因为它们应该有相似的上下文。
后续工作
你可能已经注意到,skip-gram神经网络包含大量的权重…例如300个特征值和10000词汇量,相当于隐藏层和输出层有300万个权重!所有在一个很大的数据集训练是非常难的,所以Word2vec作者介绍了一些技巧,使训练可行。本教程第2部分介绍了这些内容。
其他资源
我还创建了一个博文有其他关于Word2vec的教程、论文、实现的链接。