在Gensim中训练word2vec时如何控制随机性?

问题描述

我正在研究 gensim 的 word2vec 模型,但在同一数据集上的不同运行会产生不同的模型。我尝试将种子设置为固定数量包括 PYTHONHASHSEED,并将工人数量设置为 1。但是以上方法都行不通。

在这里包含了我的代码

def word2vec_model(data):
    model = gensim.models.Word2Vec(data,size=300,window=20,workers=4,min_count=1)
    model.wv.save("word2vec.wordvectors")
    embed = gensim.models.KeyedVectors.load("word2vec.wordvectors",mmap='r')
    return embed

我检查了以下输出

Cooking.similar_by_vector(Cooking['apple'],topn=10,restrict_vocab=None)

示例输出

[('apple',0.9999999403953552),('charcoal',0.2554503381252289),('response',0.25395694375038147),('boring',0.2537640631198883),('healthy',0.24807702004909515),('wrong',0.24783077836036682),('juice',0.24270494282245636),('lacta',0.2373320758342743),('saw',0.2359238862991333),('insufferable',0.23015251755714417)]

每次运行,我都会得到不同的相似词。

有人知道如何解决吗?我感谢任何直接的代码或文档。提前致谢!

解决方法

您没有展示您如何设置 PYTHONHASHSEED。它必须在运行 Python 解释器之前设置,以防止 Python 的内置字符串散列随机化 - 因此您不能在 Python 中设置它。

而且:一般来说,您不应该试图消除运行到运行结果中的小抖动。它是这些算法的固有部分——尤其是在现实、高效的模式下运行时(如使用许多训练线程)。即使您成功了,您也会以非常慢的(单线程训练)模式结束,并且结果的稳定性可能会误导您在实际部署中的预期结果。

在 Gensim 常见问题解答中有更多关于同一点的讨论:

https://github.com/RaRe-Technologies/gensim/wiki/Recipes-&-FAQ#q11-ive-trained-my-word2vec--doc2vec--etc-model-repeatedly-using-the-exact-same-text-corpus-but-the-vectors-are-different-each-time-is-there-a-bug-or-have-i-made-a-mistake-2vec-training-non-determinism

另外,使用 min_count=1 几乎总是一个坏主意。这些算法不能为只有一个用法示例的单词制作好的向量,并且在丢弃稀有单词时通常会给出更好的结果,就像默认的 min_count=5 值一样。 (尤其是如果您有足够的训练数据来证明大型 300 维词向量的合理性,您可能应该增加而不是减少默认的 min_count=5 截止值。)