本教程将介绍 Word2Vec 的 Skip-Gram Model 神经网络体系结构。 本教程的目的是跳过关于 Word2Vec 的常见介绍性和抽象的见解,并深入了解更多的细节。 具体来说,我正在潜入 Skip-Gram Model 神经网络模型。
skip-gram 神经网络模型其最基本的形式实际上是惊人的简单;我认为这是所有的小调整和增强,开始混乱的解释。
让我们先从高层次了解我们要了解的。Word2Vec 使用了一个你可能在机器学习中看到过的技巧。 我们将训练一个带有单个隐藏层的简单的神经网络来执行某个任务,但是实际上我们并没有将这个神经网络用于我们训练的任务。 相反,目标实际上只是为了学习隐藏层的权重 - 我们会看到这些权重实际上是我们试图学习的 "单词向量"。
另一个你可能已经看到使用这个技巧的地方是在无监督的特征学习中,训练一个自动编码器来压缩隐藏层中的输入矢量,并将其解压缩回输出层的原始数据。 在训练完成后,你可以去掉输出层(解压缩步骤),然后使用隐藏层 - 这是学习好的图像特征而不用标记训练数据的一个技巧。
所以现在我们需要谈论这个 "假" 的任务,我们要建立神经网络来执行,回过头来,这个 "假" 任务间接地给我们提供那些真正的单词向量。
我们要训练神经网络做以下事情。 给定一个句子中的特定单词(输入单词),查看附近的单词并随机选择一个单词。 网络将告诉我们在我们所选择的 "附近的词" 词汇中的每个词的概率。
当我说 "附近" 时,算法实际上有一个 "窗口大小" 参数。 一个典型的窗口大小可能是 5,即 5 个字落后 5 个字(总共 10 个)。
输出概率将与在我们的输入词附近找到每个词汇单词的可能性有关。 例如,如果你给训练的网络输入单词 "苏联",输出概率将比 "西瓜" 和 "袋鼠" 这样无关的单词高得多,比如 "联盟" 和 "俄罗斯"。
我们将通过训练文档中输入的单词对,来训练神经网络。下面的例子显示了一些训练样本(单词对),我们将从 "The quick brown fox jumps over the lazy dog." 这个句子中取出。我只是用一个 2 的小窗口来举例。 以蓝色突出显示的单词是输入单词。
网络将从每次配对显示的次数中学习统计。 因此,相比于("苏联","萨斯克奇")网络可能会获得更多的("苏联","联盟")训练样本。 训练结束后,如果将 "苏联" 一词作为输入,则 "联盟" 或 "俄罗斯" 的概率比 "萨斯克奇" 输出的概率高得多。
那么这是如何表示的?
首先,你知道你不能把一个单词作为一个文本字符串输入到一个神经网络,所以我们需要一种方法来把这个单词表达给网络。 要做到这一点,我们首先要从培训文档中建立一个单词词汇表(假设我们有一个有 10,000 个独特单词的词汇表)。
我们将把一个像 "蚂蚁" 这样的输入词表示成一个 one-hot 向量,这个向量将有 10,000 个元素(我们词汇表中的每个单词都有一个),我们将在与 "蚂蚁" 单词对应的位置放置一个 "1",在所有其他位置放置一个 "0"。
网络的输出是一个单一的矢量(也有 10,000 个元素),对于我们的词汇表中的每一个单词,都包含随机选择的附近单词是该单词的概率。
这是我们的神经网络框架。
隐藏层不使用激活函数,输出层使用 softmax, 我们稍后再看。
当在单词对上训练这个网络时,输入是代表输入词的单向矢量,训练输出也是代表输出词的单向矢量。 但是当你在输入字上评估训练好的网络时,输出矢量实际上是一个概率分布(即一堆浮点值,而不是一个热点矢量)。
对于我们的例子,我们要说,我们正在学习 300 个特征的单词向量。 所以隐藏层将由一个 10,000 行的权重矩阵(我们词汇表中的每个单词一个)和 300 列(每个隐藏的神经元一个)来表示。
300 特征是 Google 在 Google 新闻数据集上训练的发布模型中使用的(可以从这里 下载 )。 特征的数量是一个 "超参数",你只需要你的应用程序调整它(即尝试不同的值,看看用什么值可以产生最好的结果)。
如果你看这个权重矩阵的行,这些实际上是我们的词向量!
因此,所有这些的最终目标实际上只是为了学习这个隐藏的层权重矩阵(当我们完成后,我们会去掉输出层!)
让我们回过头来看,通过我们要训练的这个模型的定义来工作。
现在,你可能会问,"那个 one-hot 向量几乎全是零... 那有什么效果?" 如果你用 1×10,000 one-hot 向量乘以一个 10000×300 的矩阵,它将有效地选择矩阵中对应于 "1" 的行。 这里有一个小例子,可以直观感受一下。
这意味着这个模型的隐藏层实际上只是作为一个查找表来操作。 隐藏层的输出只是输入单词的 "单词向量"。
"蚂蚁" 的 1×300 单词向量,被送到输出层。 输出层是一个 softmax 回归分类器。 这里 有一个关于 Softmax 回归的深入教程,Softmax 的要点是每个输出神经元(我们词汇表中的每个单词)将产生一个 0 到 1 之间的输出,并且所有这些输出值的总和将加起来等于 1。
具体来说,每个输出神经元都有一个权向量,它与来自隐层的单词向量相乘,然后将函数 exp(x) 应用于结果。 最后,为了得到输出总和为 1,我们将这个结果除以所有 10,000 个输出节点的结果之和。
下面是计算单词 "car" 的输出神经元输出的图示。
请注意,神经网络不知道输出词相对于输入词的偏移量。 在输入之前的单词与之后的单词之间没有学到不同的一组概率。 为了理解这个含义,假设在我们的训练语料库中,每个单词 "York" 的前面都有 "New" 这个词。 也就是说,至少根据训练数据,"纽约" 附近有 100%的可能性。 然而,如果我们把 "York" 附近的 10 个字词随机选取其中的一个,那么 "New" 的可能性不是 100%。 你可能已经选择了附近的其他单词之一。
好了,现在你准备好了了解这个网络了吗?
如果两个不同的单词具有非常相似的 "上下文"(即那些单词可能出现在他们周围),那么我们的模型需要为这两个单词输出非常相似的结果。 网络为这两个单词输出相似的上下文预测的一种方式是是否单词向量是相似的。 所以,如果两个单词具有相似的上下文,那么我们的网络就有动机学习这两个单词的相似单词向量!
两个词有什么相似的背景? 我认为你可以期望像 "intelligent" 和 "smart" 这样的同义词具有非常相似的背景。 或者,像 "engine" 和 "transmission" 这样相关的词语也可能具有相似的语境。
这也可以为你处理干扰。网络可能会学习类似的单词向量的单词 "ant" 和 "ants",因为这些应该有类似的上下文。
您可能已经注意到 skip-gram 神经网络包含了大量的权重... 对于我们的例子,有 300 个特征和 10,000 个单词的词汇,每个隐藏层和输出层都是 3M 权重! 在一个大的数据集上进行训练是很难的,所以 word2vec 作者引入了一些调整来使训练变得可行。 这些在本教程的 第 2 部分 中有介绍。
其他资源
我还创建了一篇 文章 ,链接到其他 word2vec 教程,论文和实现的描述。
引用
McCormick, C. (2016, April 19). Word2Vec Tutorial - The Skip-Gram Model. Retrieved from http://www.mccormickml.com
来源: http://www.jianshu.com/p/c027cc1df657