在处理文字模型的时候,将文字转化成可以放进模型的数字,最简单方法是用 one-hot 编码。但是这种方法有弊端,转化后的每个词之间在数字上都是相互独立的,任何一对词的one-hot向量的余弦相似度都为0,任何词之间都没有关系。

Google团队发表的 word2vec 工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW)。值得一提的是,word2vec词向量可以较好地表达不同词之间的相似和类比关系。

下面就介绍一下Skip-Gram。

训练样本

确认窗口大小,比如这里设置为2。指定某个词后,例 brown,与其窗口为2的范围内的其他词可组成一对Training Sample,例 (brown,the) (brown,quick) (brown,fox) (brown,jumps)。这样每组Training Sample就对应每次训练的 (输入,输出)

【RNN】理解循环神经网络中的 Skip-Gram

网络结构

输入是使用 one-hot 所表示的输入word,经过隐藏层,和 softmax 处理后得到输出结果。这里输入和输出的words所表示的向量大小与词库大小相同。

例如,假设词库中有10000个words,输入 x 和输出 y 理论上均是长度为10000的 one-hot 向量。但输出结果由于经过了softmax,所以实际输出结果 y^ 是由不同的概率值组成。使用 yy^ 的交叉熵损失函数进行优化。
【RNN】理解循环神经网络中的 Skip-Gram

输出结果

假设隐藏层节点数设置为300,隐藏层所对应的 W 维度 为 10000*300 。最终训练结果中,隐藏层 W 的结果,就是总的词库对应的词向量。为什么这么说呢?

这是由于每个词最初由长度为10000的 one-hot 向量表示,除了对应的位置为1外,其余全部为0 。每个词与总的隐藏层的矩阵相乘后,得到的长度为300的新向量则是我们想要的对应 词向量表示结果了。这就让隐藏层中的信息变成了一张“查找表”,我们给定 one-hot 输入,得到相应的“查找结果”。只是“查找结果”的大小和数字表示都变了,变的不再稀疏,而是由实实在在的非零数字表示。

【RNN】理解循环神经网络中的 Skip-Gram

理解

其实某种程度上可以说,这是个“假的”监督学习训练模型,虽然整个流程是完整的。有输入和输出,有损失函数和优化方法。但是我们想要的结果并不是模型本身,因为并没有其他测试样本需要带入模型。想要的结果只是隐藏层的信息,是可以让 one-hot 向量转化成一个新的向量的信息,因为它使得新向量所能表达的含义更加丰富。而且整个神经网络模型中是没有**函数的。

再举个例子,假设有多个训练样本(juice,apple) (juice,pear) (juice,banana) ,这里指定中心词是 juice ,规定窗口内有apple、pear、banana等单词。这些训练样本的特点是,共同的输入 juice 对应多个不同词的输出。如果用这些样本训练后,得到的概率结果中,apple、pear、banana处的概率值肯定都相对较高。从而使得它们在对应隐藏层中的参数可能是相似的,这样才能得到相似的结果。如果我们用这些“水果”单词对应的新向量去计算它们之间余弦相似度的话,肯定是相对较高的。这也从另一个角度解释了,为什么word2vec方法得到的结果可以让单词之间具有相似性和类比关系。

其实这个模型确实还挺简单的。只是如果不能从根本上理解这么做的目的和意义,思维转不过来的话,可能会很难理解。本文只是想通过简单的语言解释Skip-Gram模型,并没有去堆公式来证明。公式的话我另一篇博客 中有详细描述。

当然,上面描述这个模型的方法有弊端,每次训练的时候,输入和输出计算量都是针对整个词库大小来的,假如词库有一百万个词,计算量就会变得非常大。针对这个问题,有两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax),以后有机会再介绍。

部分文字引用自 词向量 - - gluon.ai
部分图片引用自 Word2Vec Tutorial - The Skip-Gram Model