问题描述
我正在研究 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 常见问题解答中有更多关于同一点的讨论:
另外,使用 min_count=1
几乎总是一个坏主意。这些算法不能为只有一个用法示例的单词制作好的向量,并且在丢弃稀有单词时通常会给出更好的结果,就像默认的 min_count=5
值一样。 (尤其是如果您有足够的训练数据来证明大型 300 维词向量的合理性,您可能应该增加而不是减少默认的 min_count=5
截止值。)