word2vec gensim обновление скорость обучения - PullRequest
0 голосов
/ 02 июля 2018

Я обучил модель w2v на большом корпусе и хочу обновить ее на более мелкую, добавив новые предложения (и новые слова).

В первой большой тренировке я взял параметры по умолчанию для альфы (0,025 с линией затухания до 0,0001) Теперь я хочу использовать model.train для его обновления. Но из документа я не понимаю, какая (начальная и конечная) скорость обучения будет использоваться во время этого обновления обучения.

С одной стороны, если вы также используете 0.025 с lin. затухание до 0,0001, оно будет слишком сильным для уже существующих слов, которые часто встречались в первом большом корпусе и будут сильно изменены, но с другой стороны для новых слов (добавлено с model.build_vocab (предложения, обновление = True) ) слишком низкая скорость обучения 0,0001

Итак, мои вопросы:

  1. Каково поведение по умолчанию model.train в API для новых предложений, касающихся скорости обучения?
  2. Как мне выбрать скорость обучения, чтобы учесть эту проблему старых / новых слов?

  3. [в сторону вопроса] Почему, когда я использую два раза model.train для одних и тех же предложений, во второй раз он не обновляет векторы?

1 Ответ

0 голосов
/ 02 июля 2018

Хотя вы можете продолжать тренировать модель Word2Vec с новыми примерами, если только старые примеры также не представлены повторно с чередованием, эти новые примеры могут не сделать Модель лучше - независимо от того, насколько хорошо вы настроите alpha.

Это потому, что во время обучения новым примерам модель только подталкивается к тому, чтобы лучше предсказывать их слова в этих новых контекстах. Если в новых текстах отсутствуют слова, их векторы-слова остаются нескорректированными, так как остальная часть модели смещается. Даже если повторяются одни и те же слова, их новые контексты, вероятно, будут отличаться в некоторых важных аспектах - или зачем продолжать тренироваться с новыми данными? - которые постепенно ослабляют или ослабляют все влияние старшей тренировки.

Существует даже слово для тенденции (но далеко от определенности) нейронных сетей ухудшаться при представлении новых данных: катастрофическое забвение .

Таким образом, наиболее приемлемой политикой является переподготовка со всеми соответствующими данными, смешанными вместе, чтобы убедиться, что все они имеют одинаковое влияние. Если вы импровизируете какие-то другие ярлыки, вы находитесь на экспериментальной территории, и мало надежной документации или опубликованных работ, которые могут дать убедительные предположения об относительном балансе скоростей обучения / количества эпох / etc. Любые возможные ответы также будут очень сильно зависеть от относительных размеров корпусов и словарей как вначале, так и затем от любых последующих обновлений, а также от того, насколько важны для вашего конкретного проекта такие факторы, как стабильность вектора с течением времени или относительные качество их различных векторов. Так что не было бы единого ответа - только то, что имеет тенденцию работать в вашей конкретной ситуации.

gensim Word2Vec есть экспериментальная функция - некоторые внутренние свойства модели, заканчивающиеся _lockf. Это означает «коэффициент блокировки». Они соответствуют 1-к-1 со словами-векторами, а для В любом слоте, где этот коэффициент блокировки установлен на 0,0, слово-вектор игнорирует обновления обучения. Таким образом, вы можете по существу «заморозить» некоторые слова - например, те, в которых вы уверены, что они не будут улучшены в результате дополнительного обучения - пока позволяя другим обновляться. может помочь с дрейфом / забыванием проблем с обновлениями, но проблемы относительного качества и правильности alpha / epochs все еще неясны и требуют экспериментов по проектам.)

Специально для ваших пронумерованных вопросов:

(1) Каждый вызов train() будет выполнять указанное число epochs проходов по данным и плавно управлять скоростью обучения от настроенной модели, начиная с alpha до min_alpha (если вы не переопределите эти с дополнительными параметрами train().

(2) Как указано выше, не существует установленного эмпирического правила, потому что проблема сложная, дополнительное обучение в этом стиле не обязательно поможет, и даже там, где оно может помочь, оно будет сильно зависеть от не обобщаемых Специфика проекта.

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

...