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

时间:2019-06-12 02:07:03

标签: python gensim doc2vec

我正在使用Doc2Vec分析某些段落,并希望获得火车数据的确定性矢量表示。基于official documentation,似乎我需要在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。

2 个答案:

答案 0 :(得分:2)

我相信在代码中设置PYTHONHASHSEED为时已晚:需要在操作系统环境中设置,然后才能完全运行Python解释器。当Python启动时,它会检查以决定在执行过程中 all 字典是否将使用指定的随机种子。 (以后每次创建字典时都不会再次检查。)

但是,还要注意,您通常不应该对这些算法强加确定性,而是要使您的评估能够承受较小的运行间抖动。较大的抖动可能表明您的数据或元参数充足还可能导致其他问题,但强制确定性隐藏了这种宝贵的间接强度信号。

有关Gensim项目常见问题的问题,在第11季度和第12季度还有更多讨论:

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

答案 1 :(得分:0)

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

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