Недавно я перешел на 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)