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

时间:2018-06-14 15:07:58

标签: python c++ nlp word2vec gensim

我正在使用Google的Word2vec,我想知道如何获得使用分层softmax训练的skipgram模型预测的顶部单词,给定输入字?

例如,当使用负采样时,可以简单地将输入字的嵌入(来自输入矩阵)与输出矩阵中的每个矢量相乘,并取一个具有最大值的一个。然而,在分层softmax中,由于使用霍夫曼树,存在对应于每个输入字的多个输出矢量。

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

1 个答案:

答案 0 :(得分:0)

我还没有看到任何方法这样做,并且考虑到hierarchy-softmax(HS)输出的工作方式,没有明显正确的方法将输出节点的激活水平转换为精确的每字可能性估计。请注意:

  • (排序)模拟负抽样预测的predict_output_word()方法甚至不尝试处理HS模式

  • 在训练期间,HS和负采样模式都没有做出准确的预测 - 他们只是推动输出更像当前的训练示例需要

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

由于HS编码严格按字频分配的方式也可能存在问题 - 因此,“邻居”字共享主要是相同编码在语义上可能非常不同。 (在原来的word2vec.c代码中有一些提示,通过聚类相关的单词来进行HS编码可能有利于编写类似的编码,而不是严格的频率,但我从未见过这种做法。)

如果可解释的预测很重要,我建议坚持使用负抽样。 (但是请记住,word2vec并不主要用于预测,它只是使用训练尝试预测来引导矢量布置,结果对其他任务有用。)