Как получить детерминированные результаты в Doc2Vec? - PullRequest
0 голосов
/ 12 июня 2019

Я использую Doc2Vec для анализа некоторого абзаца и хочу получить детерминированное векторное представление данных поезда.Исходя из официальной документации , мне кажется, что мне нужно установить параметры "seed" и "worker", а также переменную среды PYTHONHASHSEED в Python 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.

1 Ответ

2 голосов
/ 12 июня 2019

Я считаю, что установка PYTHONHASHSEED внутри вашего кода слишком поздняя: его нужно установить в среде ОС , прежде чем интерпретатор Python вообще запустится. Когда Python запускается, он проверяет это, чтобы решить, будут ли все словари во время этого выполнения использовать указанное начальное значение рандомизации. (Это не перепроверяется позже, для каждого последующего создания словаря.)

Но также обратите внимание, что обычно не следует навязывать детерминизм этим алгоритмам, а делать свои оценки толерантными к небольшому межпроцессному джиттеру. Большое дрожание может указывать на другие проблемы с достаточностью ваших данных или метапараметров, но форсированный детерминизм скрывает этот ценный косвенный сигнал силы модели.

В Q11 и Q12 немного больше ответов на часто задаваемые вопросы по проекту gensim по этим вопросам:

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

...