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

时间:2018-04-09 17:18:34

标签: neural-network nlp deep-learning word2vec language-model

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

1 个答案:

答案 0 :(得分:2)

Word2vec CBOW模式通常使用目标字周围的对称窗口。但它只是平均窗口中所有单词的(当前训练中)字向量,以找到预测神经网络的“输入”。因此,它可以容忍非对称窗口 - 如果两边都有较少的单词,则使用该侧的单词较少(对于文本的前/末端的单词,可能在该侧甚至为零)。 p>

此外,在每个训练示例中,它并不总是使用指定的最大窗口,而是使用一些随机大小的窗口达到指定的大小。因此对于window=5,它有时会在任何一方使用1,有时使用2,3,4或5.这样做可以有效地超重单词。

最后也是最重要的是,对于你的问题,word2vec在训练期间没有真正进行全面预测“模型说的确切的词应该加热这个目标位置?”在“分层softmax”或“负采样”变体中,这种精确预测可能是昂贵的,需要计算神经网络输出节点激活水平与完整语料库词汇量的大小成比例。

相反,它可以进行所需的计算次数,这是为了观察神经网络预测训练数据中观察到的实际目标词的强度,这可能与其他几个词形成鲜明对比。在hierarchical-softmax中,这涉及计算一个目标字的短编码的输出节点 - 忽略编码其他字的所有其他输出节点。在负采样中,这涉及计算目标字的一个不同输出节点,以及其他随机选择字的几个输出节点(“否定”示例)。

在这两种情况下,训练都不知道这个目标词是否优先于其他所有单词进行预测 - 因为它没有花时间来评估所有其他单词。它只是查看当前实例的目标字的当前输出强度,并将它们(通过反向传播)微调得稍微强一些。

这个过程的最终结果是有用地安排用于其他目的的单词矢量,其中相似的单词彼此接近,甚至某些相对方向和大小似乎也符合人类对单词关系的判断。

但是最终的单词向量和模型状态在预测文本中缺失的单词时可能仍然只是平庸 - 因为它只是在个别例子中被推动得更好。理论上,你可以比较一个模型对每个可能的目标词的预测,从而强制创建一种预测词的排序列表 - 但这比训练所需的任何东西都要昂贵,并且像这样的词的预测不是通常的下行应用字向量集。因此,大多数word2vec库甚至不包括用于进行完整目标词预测的任何接口方法。 (例如,Google的原始word2vec.c没有。)

在几个版本之前,Python gensim库添加了一个预测实验方法[predict_output_word()][1]。它仅适用于负采样模式,并且不像在训练中那样处理窗口加权。你可以尝试一下,但如果结果不令人印象深刻,也不要感到惊讶。如上所述,对单词进行实际预测并不是word2vec-training通常的真正目标。 (其他更有状态的文本分析,即使只是大型共现表,也可能做得更好。但它们可能不会强迫字向量进入像word2vec这样有趣的星座。)

相关问题