14

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)

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

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

4

5 回答 5

13

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

对代码进行简单的参数编辑应该可以解决问题。

model = Word2Vec(sentences, size=10, window=5, min_count=5, workers=1)
于 2017-02-16T05:23:25.420 回答
10

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

然而,使用的散列函数是 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]]
于 2016-01-18T08:03:57.000 回答
10

只是对随机性的评论。

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

于 2017-11-28T00:59:47.517 回答
1

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

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

model = gensim.models.Word2Vec (texts, workers=1, seed=1,hashfxn=hash)
于 2021-07-06T11:36:29.317 回答
-1

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

请注意Gensim 常见问题解答中所说的内容:

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

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

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

于 2021-07-06T13:07:27.630 回答