Улучшение результатов Gensim Doc2vec

Я попытался применить doc2vec к 600000 строкам предложений: Код, как показано ниже:

from gensim import models
model = models.Doc2Vec(alpha=.025, min_alpha=.025, min_count=1, workers = 5)
model.build_vocab(res)
token_count = sum([len(sentence) for sentence in res])
token_count

%%time
for epoch in range(100):
    #print ('iteration:'+str(epoch+1))
    #model.train(sentences)
    model.train(res, total_examples = token_count,epochs = model.iter)
    model.alpha -= 0.0001  # decrease the learning rate`
    model.min_alpha = model.alpha  # fix the learning rate, no decay

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

  model.train(sentences)

As:

 token_count = sum([len(sentence) for sentence in res])
model.train(res, total_examples = token_count,epochs = model.iter)

person Hackerds    schedule 19.12.2017    source источник


Ответы (1)


К сожалению, ваш код представляет собой бессмысленную смесь ошибочных практик. так что не следуйте любому онлайн-примеру, которому вы следуете!

Рассмотрим проблемы по порядку, сверху вниз:

Не делайте min_alpha тем же, что и alpha. Процесс оптимизации стохастического градиентного спуска требует постепенного снижения скорости обучения от большей к меньшей alpha в течение просмотра множества разнообразных примеров и обычно должен заканчиваться ничтожно малым значением, близким к нулю. (Существуют и другие проблемы с попыткой кода явно уменьшить alpha таким образом, о котором мы поговорим ниже.) Только опытные пользователи, которые уже имеют рабочую настройку, хорошо понимают алгоритм и выполняют экспериментальные настройки, должны изменять _5 _ / _ 6_ по умолчанию.

Не устанавливать min_count=1. Редкие слова, которые встречаются только один или несколько раз, обычно бесполезны для обучения Word2Vec / Doc2Vec. Их небольшое количество вхождений означает, что их собственные соответствующие веса модели не получают особого обучения, и несколько вхождений с большей вероятностью будут нерепрезентативными по сравнению с истинным значением соответствующих слов (что может быть отражено в тестовых данных или более поздних производственных данных). Таким образом, представление модели этих отдельных редких слов вряд ли станет очень хорошим. Но в целом все эти редкие слова сильно конкурируют с другими словами, которые действительно имеют шанс стать значимыми, поэтому «грубые» редкие слова в основном представляют собой случайные помехи по сравнению с другими словами. Или, возможно, эти слова означают дополнительные параметры словаря модели, которые помогают модели стать лучше на поверхности в обучающих данных из-за запоминания не обобщаемых идиосинкразий, но хуже на будущих тестовых / производственных данных. Итак, min_count - это еще одно значение по умолчанию (5), которое следует изменять только после того, как у вас будет рабочая базовая линия - и если вы будете тщательно метаоптимизировать этот параметр позже, на наборе данных хорошего размера (например, в ваших документах 600K), вы, скорее всего, чтобы обнаружить, что выше min_count, а не ниже улучшает конечные результаты.

Зачем делать token_count? Нет более позднего места, где необходимо общее количество токенов. Параметр total_examples позже ожидает количество примеров текста, то есть количество отдельных документов / предложений, а не не всего слов. Предоставляя (намного большее) количество слов, train() не сможет правильно управлять alpha или оценивать прогресс в зарегистрированном выводе.

Не вызывайте train() несколько раз в цикле с вашим собственным alpha управлением, если вы не уверены, что знаете, что делаете. Большинство людей ошибаются. Предоставляя здесь в качестве параметра значение по умолчанию model.iter (которое имеет значение 5), вы фактически выполняете 500 полных проходов по вашему корпусу, что вряд ли вам нужно. Уменьшая начальное значение 0,025 alpha на 0,0001 за 100 циклов, вы получите конечное значение alpha 0,015 - менее половины начального значения. Вместо этого вызовите train() ровно один раз с правильным total_examples и хорошо подобранным значением epochs (часто в опубликованной работе Doc2Vec используется от 10 до 20). Затем он будет выполнять точное количество явных итераций, разумно alpha управлять и печатать точную оценку прогресса в журналах.

Наконец, следующая вещь не обязательно является проблемой в вашем коде, потому что вы не показываете, как построен ваш корпус res, но есть общая ошибка, которую следует остерегаться: убедитесь, что ваш корпус можно повторять несколько раз (как если бы это был список в памяти или перезапускаемый объект итерируемый поверх чего-то, исходящего от ввода-вывода). Часто люди предоставляют одноразовый итератор, который после одного прохода (как в build_vocab()) больше ничего не возвращает, что приводит к мгновенному обучению и бесполезной, все еще случайной и необученной модели. (Если вы включили ведение журнала и обратите внимание на вывод журнала и время каждого шага, будет очевидно, является ли это проблемой.)

person gojomo    schedule 19.12.2017
comment
'res' - это список помеченных документов и соответствующих тегов - person Hackerds; 19.12.2017
comment
и значение удачно выбранных эпох - ›а как насчет перетасовки? У меня есть цикл, выполняющийся 50 раз (== 50 эпох?), Который просто выполняет перетасовку + поезд (но я не пропускаю эпоху (== None)). Требуется ли перемешивание? - person lucid_dreamer; 04.04.2018
comment
Перемешивание между эпохами обучения не требуется - хотя, если ваш корпус начинается с некоторых шаблонов упорядочения (например, всех документов определенного типа / темы), объединенных вместе), может помочь одно начальное перемешивание. Вызов train() несколько раз в вашем собственном цикле почти всегда не нужен (и обычно сопровождается другими ошибками, такими как неправильное alpha управление). - person gojomo; 04.04.2018
comment
@gojomo, это было очень полезно. Есть ли у вас какие-либо дополнительные источники по настройке гиперпараметров в отношении Doc2Vec? - person mamafoku; 28.09.2018
comment
Нет единого источника, извините, мои советы разбросаны по различным ответам SO или веткам списка обсуждений gensim (groups.google.com/forum/#!forum/gensim). - person gojomo; 28.09.2018