如何在 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 中有更多关于这些问题的讨论:
我认为你应该使用下面的代码来修复 PYTHONHASHSEED
import os
import sys
hashseed = os.getenv('PYTHONHASHSEED')
if not hashseed:
os.environ['PYTHONHASHSEED'] = '0'
os.execv(sys.executable, [sys.executable] + sys.argv)
我正在使用 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 中有更多关于这些问题的讨论:
我认为你应该使用下面的代码来修复 PYTHONHASHSEED
import os
import sys
hashseed = os.getenv('PYTHONHASHSEED')
if not hashseed:
os.environ['PYTHONHASHSEED'] = '0'
os.execv(sys.executable, [sys.executable] + sys.argv)