从deeplearning4j和word2vec获得不同的结果

时间:2015-09-23 20:57:25

标签: word2vec

我使用Google的word2vec训练了一个嵌入模型的单词。输出是一个包含单词及其向量的文件。

我在deeplearing4j中加载了这个训练过的模型。

    WordVectors vec = WordVectorSerializer.loadTxtVectors(new File("vector.txt"));
    Collection<String> lst = vec.wordsNearest("someWord", 10);

但是,尽管我使用了相同的矢量文件,但是从deeplearing4j的包和word2vec的距离函数获得的两个相似单词列表完全不同。

有没有人对deeplaring4j中的工作原理以及这些差异来自何处有很好的理解?

2 个答案:

答案 0 :(得分:1)

列表是否相似?两组似乎都是相似的单词吗?

根据我的理解,列表应该几乎完全匹配 - 它们应该在相同的输入向量上实现相同的计算。如果他们没有,特别是如果原来的word2vec.c相似列表看起来更合理,那么我会怀疑DL4J中的一个错误。

查看进行计算的方法 - https://github.com/deeplearning4j/deeplearning4j/blob/f943ea879ab362f66b57b00754b71fb2ff3677a1/deeplearning4j-scaleout/deeplearning4j-nlp/src/main/java/org/deeplearning4j/models/embeddings/wordvectors/WordVectorsImpl.java#L385

  • if (lookupTable() instanceof InMemoryLookupTable) {...}分支的代码可能是正确的 - 我不熟悉nd4j API - 但对于排名余弦相似度值的计算几乎看起来太华丽了;
  • 后面的后备情况似乎没有使用单位矢量归一化矢量值(通常情况下) - 它使用getWordVectorMatrix()代替getWordVectorMatrixNormalized()

答案 1 :(得分:0)

可能有多种原因导致您从不同的实现中获取不同的向量(因此在相似的单词中有所不同)。我可以提一些

  • 向量的随机初始化
  • 负抽样
  • 线程

如果您的文件数量(培训数据)&gt;&gt;单词的数量(词汇量大小),单词的向量在几次迭代后会稳定下来,你可以从两者中找到一些最相似的单词,类似。