确保gensim针对相同数据的不同运行生成相同的Word2Vec模型

alv*_*vas 6 python random gensim word2vec word-embedding

LDA模型中,每次我在同一个语料库上进行训练时,都会生成不同的主题,通过设置np.random.seed(0),LDA模型将始终以完全相同的方式进行初始化和训练。

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

但是奇怪的是,它已经在不同情况下为我提供了相同的矢量。

>>> 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)
Run Code Online (Sandbox Code Playgroud)

那么默认随机种子是固定的是真的吗?如果是这样,默认的随机种子号是多少?还是因为我正在测试小型数据集?

如果确实是随机种子是固定的,并且对相同数据的不同运行返回相同的向量,则将非常感谢与规范代码或文档的链接。

kam*_*pta 7

是的,默认随机种子固定为1,如作者在https://radimrehurek.com/gensim/models/word2vec.html中所述。每个单词的向量都使用单词+ str(seed)的串联哈希值进行初始化。

但是,使用的哈希函数是Python的基本内置哈希函数,如果两台计算机在

上面的列表并不详尽。它涵盖了您的问题吗?

编辑

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

一个非常简单(也很糟糕)的例子是:

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

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

print model[sentences[0][0]]
Run Code Online (Sandbox Code Playgroud)


Man*_*Kar 6

根据Gensim的文档,要执行完全确定性可重现的运行,还必须将模型限制为单个工作线程,以消除OS线程调度中的排序抖动。

只需对代码进行简单的参数编辑即可解决问题。

model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=1)
Run Code Online (Sandbox Code Playgroud)


for*_*i23 5

只是说说随机性。

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