python - 如何使用经过训练的 skipgram 模型预测单词?

标签 python c++ nlp word2vec gensim

我正在使用 Google 的 Word2vec,我想知道在给定输入词的情况下,如何获得使用分层 softmax 训练的 skipgram 模型预测的热门词?

例如,当使用负采样时,可以简单地将输入词的嵌入(来自输入矩阵)与输出矩阵中的每个 vector 相乘,然后取最高值的 vector 。然而,在分层 softmax 中,由于使用了霍夫曼树,每个输入词对应多个输出 vector 。

在这种情况下,我们如何计算给定输入词的输出词的似然值/概率?

最佳答案

我还没有看到任何方法可以做到这一点,并且考虑到 hierarchical-softmax (HS) 输出的工作方式,没有明显正确的方法可以将输出节点的激活级别转换为精确的每个单词似然估计。请注意:

  • (某种程度上)模拟负采样预测的 predict_output_word() 方法甚至不尝试处理 HS 模式

  • 在训练期间,HS 和负采样模式都不会做出准确的预测——它们只是将输出推得更像当前训练示例所需要的那样

在某种程度上,您可以计算给定上下文的所有输出节点激活,然后检查每个单词的唯一 HS 代码点节点值,了解它们与“被预测”的接近程度,您可能综合每个词的相对分数——衡量值与该词的“特定”输出的距离的某种度量。但是,每个节点的偏差是否以及如何影响该分数,以及该分数如何指示可解释的可能性,尚不清楚。

由于 HS 代码严格按词频分配的方式,也可能存在问题 - 因此“相邻”词共享大部分相同的编码在语义上可能非常不同。 (在原始的 word2vec.c 代码中有一些提示,通过将相关词聚类为具有相似编码而不是严格的频率来分配 HS 编码可能是有益的,但从那以后我很少看到这种做法。)

如果可解释的预测很重要,我建议坚持负采样。 (但也要记住,word2vec 并不主要用于预测,它只是使用预测时的训练尝试来引导一个 vector 排列,结果证明它对其他任务很有用。)

关于python - 如何使用经过训练的 skipgram 模型预测单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50860649/

相关文章:

python - Django: NotImplementedError: annotate() + distinct(fields) 未实现

python - 文件系统性能测试

python - pyside2如何查询以及创建和删除动态widget

c++ - 从 C++ 应用程序发送验证电子邮件

python - 为什么在某些情况下使用 NLTK 提取单词会截断最后的 'S'?

预测性自动完成背后的算法/理论?

python - 如何解析可能具有跨多行值的制表符分隔文件?

c++ - 当我们复制/分配派生类对象时,如何在继承中复制基类成员?

c++ - C++不支持非成员虚函数的原因是什么

python - 无法在朴素贝叶斯中训练模型