Python 确保gensim为相同数据上的不同运行生成相同的Word2Vec模型

Python 确保gensim为相同数据上的不同运行生成相同的Word2Vec模型,python,random,gensim,word2vec,word-embedding,Python,Random,Gensim,Word2vec,Word Embedding,在中,通过设置np.random.seed(0),LDA模型将始终以完全相同的方式初始化和训练 来自gensim的Word2Vec型号是否相同?通过将随机种子设置为常量,相同数据集上的不同运行是否会产生相同的模型? 但奇怪的是,它已经在不同的情况下给了我相同的向量 >>> from nltk.corpus import brown >>> from gensim.models import Word2Vec >>> sentences = b

在中,通过设置
np.random.seed(0)
,LDA模型将始终以完全相同的方式初始化和训练

来自gensim的Word2Vec型号是否相同?通过将随机种子设置为常量,相同数据集上的不同运行是否会产生相同的模型?

但奇怪的是,它已经在不同的情况下给了我相同的向量

>>> from nltk.corpus import brown
>>> from gensim.models import Word2Vec
>>> sentences = brown.sents()[:100]
>>> model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.04985042,  0.02882229, -0.03625415, -0.03165979,  0.06049283,
        0.01207791,  0.04722737,  0.01984878, -0.03026265,  0.04485954], dtype=float32)
>>> model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.04985042,  0.02882229, -0.03625415, -0.03165979,  0.06049283,
        0.01207791,  0.04722737,  0.01984878, -0.03026265,  0.04485954], dtype=float32)
>>> model = Word2Vec(sentences, size=20, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.02596745,  0.01475067, -0.01839622, -0.01587902,  0.03079717,
        0.00586761,  0.02367715,  0.00930568, -0.01521437,  0.02213679,
        0.01043982, -0.00625582,  0.00173071, -0.00235749,  0.01309298,
        0.00710233, -0.02270884, -0.01477827,  0.01166443,  0.00283862], dtype=float32)
>>> model = Word2Vec(sentences, size=20, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.02596745,  0.01475067, -0.01839622, -0.01587902,  0.03079717,
        0.00586761,  0.02367715,  0.00930568, -0.01521437,  0.02213679,
        0.01043982, -0.00625582,  0.00173071, -0.00235749,  0.01309298,
        0.00710233, -0.02270884, -0.01477827,  0.01166443,  0.00283862], dtype=float32)
>>> exit()
alvas@ubi:~$ python
Python 2.7.11 (default, Dec 15 2015, 16:46:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from nltk.corpus import brown
>>> from gensim.models import Word2Vec
>>> sentences = brown.sents()[:100]
>>> model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=4)
>>> word0 = sentences[0][0]
>>> model[word0]
array([ 0.04985042,  0.02882229, -0.03625415, -0.03165979,  0.06049283,
        0.01207791,  0.04722737,  0.01984878, -0.03026265,  0.04485954], dtype=float32)
>>> model = Word2Vec(sentences, size=20, window=5, min_count=5, workers=4)
>>> model[word0]
array([ 0.02596745,  0.01475067, -0.01839622, -0.01587902,  0.03079717,
        0.00586761,  0.02367715,  0.00930568, -0.01521437,  0.02213679,
        0.01043982, -0.00625582,  0.00173071, -0.00235749,  0.01309298,
        0.00710233, -0.02270884, -0.01477827,  0.01166443,  0.00283862], dtype=float32)
那么默认随机种子是固定的吗?如果是,默认随机种子数是多少?还是因为我在一个小数据集上测试


如果随机种子是固定的,并且相同数据上的不同运行返回相同的向量,那么最好链接到规范代码或文档

是,默认随机种子固定为
1
,如作者在中所述。每个单词的向量都是使用word+str(seed)串联的散列初始化的

然而,所使用的哈希函数是Python的基本内置哈希函数,如果两台机器的性能不同,则会产生不同的结果

  • 32对64位
  • python版本
  • 不同的操作系统/解释器
上述清单并非详尽无遗。但它是否涵盖了你的问题

编辑

如果要确保一致性,可以在word2vec中提供自己的哈希函数作为参数

一个非常简单(但不好)的例子是:

def hash(astring):
   return ord(astring[0])

model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=4, hashfxn=hash)

print model[sentences[0][0]]

根据Gensim的文档,为了执行完全确定的可重复运行,您必须将模型限制为单个工作线程,以消除操作系统线程调度中的顺序抖动

对代码进行简单的参数编辑就可以做到这一点

model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=1)

只是对随机性的评论

如果您正在使用gensim的W2V模型,并且正在使用Python版本>=3.3,请记住默认情况下会启用哈希随机化。如果要寻求两次执行之间的一致性,请确保设置
pythonhasheed
环境变量。例如,像这样运行代码时
pythonhasheed=123 python3 mycode.py
,下次生成模型时(使用相同的散列种子),它将与先前生成的模型相同(前提是,遵循所有其他随机性控制步骤,如上所述-随机状态和单个工作进程)。 有关详细信息,请参阅和