Тренировка файлового потока Gensim doc2vec хуже производительности - PullRequest
0 голосов
/ 13 декабря 2018

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

Так я использовал для trin мой doc2vec:

training_iterations = 20
d2v = Doc2Vec(vector_size=200, workers=cpu_count(), alpha=0.025, min_alpha=0.00025, dm=0)
d2v.build_vocab(corpus)

for epoch in range(training_iterations):
    d2v.train(corpus, total_examples=d2v.corpus_count, epochs=d2v.iter)
    d2v.alpha -= 0.0002
    d2v.min_alpha = d2v.alpha

И это довольно хорошо классифицирует документы, только недостатком является то, что при обучении процессоры используются на 70%

Итак, новый способ:

corpus_fname = "spped.data"
save_as_line_sentence(corpus, corpus_fname)

# Choose num of cores that you want to use (let's use all, models scale linearly now!)
num_cores = cpu_count()

# Train models using all cores
d2v_model = Doc2Vec(corpus_file=corpus_fname, workers=num_cores, dm=0, vector_size=200, epochs=50)

Теперь все процессоры используются на 100%

, но модель работает очень плохо.Согласно документации, я не должен также использовать метод train, я должен использовать только количество эпох, а не итераций, также не следует трогать значения min_aplpha и aplha.

Конфигурация обоих Doc2Vec выглядит одинаково длямне так, есть ли проблема с моей новой установкой или конфигурацией, или что-то не так с новой версией gensim?

PS Я использую один и тот же корпус в обоих случаях, также я пробовал Epoch Count = 100также с меньшими числами, такими как 5-20, но мне не повезло

РЕДАКТИРОВАТЬ : первая модель выполняла 20 итераций по 5 эпох каждый, вторая выполняла 50 эпох, поэтому вторая модельзаставил 100 эпох сделать его еще лучше, поскольку я больше не управлял альфой самостоятельно.

О второй проблеме, которая возникла: при предоставлении файла со строчными документами идентификаторы документов не всегда соответствовалиЛинии, мне не удалось выяснить, что может быть причиной этого, кажется, работает нормально для небольшого корпуса, если я найдуt, что я делаю неправильно, я обновлю этот ответ.

Окончательная конфигурация для корпуса размером 4 ГБ выглядит следующим образом

    d2v = Doc2Vec(vector_size=200, workers=cpu_count(), alpha=0.025, min_alpha=0.00025, dm=0)
    d2v.build_vocab(corpus)
    d2v.train(corpus, total_examples=d2v.corpus_count, epochs=100)

1 Ответ

0 голосов
/ 13 декабря 2018

Большинство пользователей не должны вызывать train() более одного раза в своем собственном цикле, где они пытаются сами управлять alpha и итерациями.Слишком легко сделать это неправильно.

В частности, ваш код, в котором вы вызываете train() в цикле, делает это неправильно.Каким бы ни был онлайн-источник или учебное пособие, на котором вы смоделировали этот код, вам следует прекратить консультации, так как он вводит в заблуждение или устарел.(Ноутбуки в комплекте с gensim являются лучшими примерами, на которых можно основывать любой код.)

Еще более конкретно: ваш код цикла на самом деле делает 100 проходов по данным, 20 ваших внешних циклов, тогда значение по умолчанию d2v.iter 5 раз каждый звонок на train().И ваш первый train() вызов плавно затухает с действительным alpha с 0,025 до 0,00025, что в 100 раз меньше.Но тогда ваш следующий train() вызов использует фиксированный alpha 0,0248 для 5 проходов.Затем 0,0246 и т. Д., Пока ваш последний цикл не выполнит 5 проходов при alpha=0.0212 - даже 80% от начального значения.То есть самая низкая альфа будет достигнута на ранних этапах обучения.

Назовите две опции совершенно одинаково, за исключением способа указания corpus_file вместо итеративного корпуса.

Вы должны получить одинаковые результаты в обеих формах корпуса.(Если у вас был воспроизводимый контрольный пример, в котором один и тот же корпус дает результаты совершенно разного качества, и не было какой-либо другой ошибки, о которой стоит сообщить gensim как об ошибке.)

Еслирезультаты для обоих не так хороши, как если бы вы неправильно управляли train() и alpha, скорее всего, это потому, что вы не проводите сопоставимое количество общего обучения.

...