【问题标题】:Getting different results from deeplearning4j and word2vec从 deeplearning4j 和 word2vec 获得不同的结果
【发布时间】:2015-12-21 08:19:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我们支持 Gitter 上的 DL4J 社区:gitter.im/deeplearning4j/deeplearning4j
  • 您在训练两个模型时是否使用了相同的参数?

标签: word2vec


【解决方案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()

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 您好,感谢您的回复。但就我而言,我使用了从一种方法训练的相同向量。我只是想在 deeplaring4j 中加载在 word2vec 模型中训练的向量结果。
    猜你喜欢
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2016-06-26
    相关资源
    最近更新 更多