如何使用训练有素的 CBOW 预测单词

How to predict word using trained CBOW

我有一个关于 CBOW 预测的问题。假设我的工作是使用 3 个周围词 w(t-3)、w(t-2)、w(t-1) 作为输入来预测一个目标词 w(t)。模型训练完成后,我想预测句子后遗漏的单词。这个模型是否只适用于前三个已知而最后一个未知的四个单词的句子?如果我有一个10个字的句子。前九个词是已知的,我可以使用 9 个词作为输入来预测该句子中最后一个缺失的词吗?

Word2vec CBOW 模式通常使用围绕目标词的对称 windows。但它只是对 window 中所有单词的(当前 in-training)word-vectors 进行平均,以找到预测 neural-network 的 'inputs'。因此,它可以容忍不对称 windows——如果两边可用的单词较少,则使用那一侧的单词较少(对于 front/end 处的单词,那一侧甚至可能为零一段文字)。

此外,在每个训练示例中,它并不总是使用指定的maximum-window,而是使用一些random-sized window up-to 指定的大小。因此,对于 window=5,它有时会在两边只使用 1,有时会使用 2、3、4 或 5。这样做是为了有效地增加更接近的单词的权重。

最后,对于你的问题,最重要的是,word2vec 在训练 "what exact word does the model say should be heat this target location?" 期间并没有真正做 full-prediction 在 'hierarchical softmax' 或 'negative-sampling' 变体中,例如准确的预测可能很昂贵,需要计算与完整语料库词汇量的大小成比例的 neural-network output-node 激活水平。

相反,它执行 much-smaller number-of-calculations 所需的 neural-network 预测训练数据中观察到的实际目标词的强度,也许与其他一些相比字。在 hierarchical-softmax 中,这涉及为一个目标词的短编码计算输出节点——忽略所有其他编码其他词的输出节点。在 negative-sampling 中,这涉及计算目标词的一个不同输出节点,以及其他 randomly-chosen 词的几个输出节点('negative' 示例)。

在这两种情况下,训练都不知道是否优先预测此目标词而不是所有其他词——因为它没有花时间评估所有其他词。它只是查看当前 strength-of-outputs 以获取真实示例的目标词,并推动它们(通过 back-propagation)稍微更强一些。

这个过程的最终结果是word-vectors用于其他目的usefully-arranged,其中相似的词彼此接近,甚至某些相对方向和大小也似乎与人类相匹配词语关系的判断。

但最终的 word-vectors 和 model-state 在预测文本中缺失的单词方面可能仍然表现平平——因为它只是在个别示例上被推动得更好。从理论上讲,您可以比较模型对每个可能的目标词的预测,因此 force-create 是 predicted-words 的一种 ranked-list – 但这比训练和预测诸如此类的词所需的任何东西都昂贵这不是 word-vectors 组的通常下游应用程序。所以实际上大多数 word2vec 库甚至不包含任何用于进行完整 target-word 预测的接口方法。 (例如,Google 中的原始 word2vec.c 不是。)

几个版本前,Python gensim 库添加了一种用于预测的实验方法,[predict_output_word()][1]。它仅适用于 negative-sampling 模式,并且处理 window-word-weighting 的方式与训练中的方式不同。您可以尝试一下,但如果结果不尽如人意,请不要感到惊讶。如上所述,对单词进行实际预测并不是 word2vec 训练通常的真正目标。 (其他更有状态的 text-analysis,即使只是大型 co-occurrence 表,可能在这方面做得更好。但它们可能不会强制 word-vectors 进入像 word2vec 这样有趣的星座。)