我有一个关于 CBOW 预测的问题。假设我的工作是使用 3 个环绕词 w(t-3)、w(t-2)、w(t-1) 作为输入来预测一个目标词 w(t)。一旦模型经过训练,我想在一个句子之后预测一个缺失的单词。这个模型是否只适用于前三个已知而最后一个未知的四个单词的句子?如果我有一个 10 字的句子。前九个单词是已知的,我可以使用 9 个单词作为输入来预测该句子中最后一个缺失的单词吗?
1 回答
Word2vec CBOW 模式通常使用围绕目标词的对称窗口。但它只是对窗口中所有单词的(当前训练中的)词向量进行平均,以找到预测神经网络的“输入”。因此,它可以容忍非对称窗口——如果任一侧可用的单词较少,则使用较少的那一侧的单词(对于文本前端/结尾的单词,那一侧甚至可能为零)。
此外,在每个训练示例中,它并不总是使用指定的最大窗口,而是使用一些随机大小的窗口,直到指定大小。所以对于window=5
,它有时会在两边只使用 1,而其他时候会使用 2、3、4 或 5。这样做是为了有效地超重更接近的单词。
最后也是最重要的是,对于您的问题,word2vec 在“模型说什么确切的词应该是热这个目标位置?”的训练期间并没有真正进行全面预测。在“分层softmax”或“负采样”变体中,这样的精确预测可能很昂贵,需要计算与完整语料库词汇量成比例的神经网络输出节点激活水平。
相反,它执行的计算次数要少得多,以查看神经网络预测训练数据中观察到的实际目标词的强度,这可能与其他几个词形成对比。在hierarchical-softmax中,这涉及为一个目标词的短编码计算输出节点——忽略所有其他编码其他词的输出节点。在负采样中,这涉及为目标词计算一个不同的输出节点,以及为其他随机选择的词(“负”示例)计算几个输出节点。
在这两种情况下,训练都不知道这个目标词是否优先于所有其他词被预测——因为它不需要时间来评估所有其他词。它只是查看真实示例目标词的当前输出强度,并推动它们(通过反向传播)稍微强一些。
这个过程的最终结果是用于其他目的的有用排列的词向量,其中相似的词彼此接近,甚至某些相对方向和大小也似乎与人类对词关系的判断相匹配。
但是最终的词向量和模型状态在预测文本中的缺失词方面可能仍然只是平庸——因为它只是在个别例子上被推动变得更好。从理论上讲,您可以比较模型对每个可能的目标词的预测,从而强制创建一种预测词的排序列表——但这比训练所需的任何东西都要昂贵,而且对这样的词的预测并不常见词向量集的下游应用。因此,实际上大多数 word2vec 库甚至都不包含任何用于进行完整目标词预测的接口方法。(例如,谷歌的原始 word2vec.c 没有。)
几个版本前,Pythongensim
库添加了一种用于预测的实验方法,[predict_output_word()][1]
. 它仅适用于负采样模式,并且不能像在训练中那样处理窗口词加权。您可以尝试一下,但如果结果不令人印象深刻,请不要感到惊讶。如上所述,对单词进行实际预测并不是 word2vec-training 通常的真正目标。(其他更有状态的文本分析,即使只是大型的共现表,可能会做得更好。但它们可能不会强制词向量进入有趣的星座,如 word2vec。)