如何在 Doc2Vec 中获取确定性训练结果?



我正在使用Doc2Vec来分析某个段落,并希望获得训练数据的确定性向量表示。根据官方文档,似乎我需要在 Python 3 中设置参数 "seed" 和 "workers",以及 PYTHONHASHSEED 环境变量。因此,我编写了如下脚本。

import os
from gensim.models.doc2vec import TaggedDocument
from gensim.models import Doc2Vec

def main():
# Check whether the environment variable has been set successfully
print(os.environ.get('PYTHONHASHSEED'))
docs = [TaggedDocument(['Apple', 'round', 'apple', 'red', 'Apple', 'juicy', 'apple', 'sweet'], ['A']),
TaggedDocument(['I', 'have', 'a', 'little', 'frog', 'His', 'name', 'is', 'Tiny', 'Tim'], ['B']),
TaggedDocument(['On', 'top', 'of', 'spaghetti', 'all', 'covered', 'with', 'cheese'], ['C'])]
# Loop 3 times to check whether consistent results are produced within each run
for i in range(3):
model = Doc2Vec(min_count=1, seed=12345, workers=1)
model.build_vocab(docs)
model.train(docs, total_examples=model.corpus_count, epochs=model.epochs)
print(model.docvecs['B'])

if __name__ == '__main__':
os.environ['PYTHONHASHSEED'] = '12345'
main()

问题是在每次运行中它确实会产生确定性的结果,但是当我再次运行整个脚本时,它会给出不同的结果。我的环境变量设置是否有任何问题,或者我错过了其他内容?

我使用的是Python 3.6.5。

我相信在你的代码中设置PYTHONHASHSEED为时已晚:它需要在操作系统环境中设置,在 Python 解释器运行之前。当 Python 启动时,它会检查这一点,以确定此执行期间的所有字典是否都将使用指定的随机化种子。(对于每个后续的字典创建,以后不会重新检查它。

但是,还要注意的是,您通常不应该对这些算法强制确定性 - 而是使您的评估能够容忍小的运行抖动。大抖动可能表明数据或元参数的充分性存在其他问题,但强制确定性隐藏了模型强度的宝贵间接信号。

在 gensim 项目 FAQ 的 Q11 和 Q12 中有更多关于这些问题的讨论:

https://github.com/RaRe-Technologies/gensim/wiki/recipes-&-faq#q11-ive-trained-my-word2vecdoc2vecetc-model-repeatedly-using-the-exact-same-text-corpus-but-the-vectors-are-different-each-time-is-there-a-bug-or-have-i-made-a-mistake-2vec-training-non-determinism

我认为你应该使用以下代码来修复PYTHONHASHSEED

import os
import sys
hashseed = os.getenv('PYTHONHASHSEED')
if not hashseed:
os.environ['PYTHONHASHSEED'] = '0'
os.execv(sys.executable, [sys.executable] + sys.argv)

最新更新