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

How to get deterministic train results in Doc2Vec?

我正在使用 Doc2Vec 分析一些段落,并希望获得列车数据的确定性向量表示。基于official documentation,似乎需要设置参数"seed"和"workers",以及Python中的PYTHONHASHSEED环境变量 3.因此,我写了脚本如下。

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 为时已晚:需要在 OS 环境 之前设置 ,然后再 Python 解释器运行。当 Python 启动时,它会对此进行检查以决定在此执行期间 all 字典是否将使用指定的随机化种子。 (以后不会为每个后续字典创建重新检查。)

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

在 gensim 项目常见问题解答的 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)