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

时间:2016-01-16 20:05:52

标签: python random gensim word2vec word-embedding

LDA model generates different topics everytime i train on the same corpus中,通过设置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)

那么默认的随机种子是固定的吗?如果是,那么默认的随机种子数是多少?或者是因为我在一个小数据集上进行测试?

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

4 个答案:

答案 0 :(得分:6)

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

然而,

使用的散列函数是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]]

答案 1 :(得分:5)

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

对代码进行简单的参数编辑就可以了。

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

答案 2 :(得分:0)

对于完全确定性可重复的运行,除了定义种子之外,您还必须将模型限制为单个工作线程 (workers=1),以消除 OS 线程调度中的排序抖动。 (在 Python 3 中,解释器启动之间的重现性还需要使用 PYTHONHASHSEED 环境变量来控制哈希随机化。

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

model = gensim.models.Word2Vec (texts, workers=1, seed=1,hashfxn=hash)

答案 3 :(得分:0)

您的问题确实是一个小数据集:只有 100 个句子。

注意 Gensim FAQ 的意思:

<块引用>

[因为随机性是 Word2Vec 和类似模型的一部分],可以预期模型会因运行而异,即使是在相同的数据上训练也是如此。任何词向量或文档向量都没有单一的“正确位置”可以结束:只是与在同一模型内共同训练的其他向量的距离和方向越来越有用的位置。 [...]

合适的训练参数应该会产生从运行到运行大致一样有用的模型。测试和评估过程应该容忍向量位置的任何变化,以及模型整体效用的小“抖动”,这是由固有的算法随机性引起的。 (如果每次运行观察到的质量差异很大,可能存在其他问题:数据太少、参数调整不当或评估方法存在错误/弱点。)

您可以尝试强制确定性[.] 但是[...] 您会掩盖底层算法的固有随机性/近似性[.] 最好容忍一点抖动,并使用过度抖动作为指标数据或模型设置中其他地方的问题——而不是强加表面的决定论。