0

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

我在 deeplearning4j 中加载了这个训练有素的模型。

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

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

有人对 deeplaring4j 中的工作方式以及这些差异的来源有很好的了解吗?

4

2 回答 2

1

这些列表是否完全相似?任何一组看起来都像相似词一样合理吗?

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

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

  • 分支的代码if (lookupTable() instanceof InMemoryLookupTable) {...}可能是正确的——我不熟悉 nd4j API——但对于计算排名余弦相似度值来说似乎太华丽了;
  • 接下来的后备情况似乎没有使用单位向量归一化向量值(通常情况下)——它使用getWordVectorMatrix()而不是getWordVectorMatrixNormalized()
于 2015-10-03T05:27:49.973 回答
0

可能有多种原因导致您从不同的实现中获得不同的向量(因此相似词的差异)。我可以提几个

  • 向量的随机初始化
  • 负采样
  • 穿线

如果您的文档数量(训练数据)>> 唯一词的数量(词汇量),则词的向量将在几次迭代后稳定下来,您可以从两者中找到一些最相似的词,相似。

于 2015-09-27T04:06:54.117 回答