Модель Gensim Word2vec не сходится

Я тренирую модель Word2vec с помощью Gensim Word2vec на хорошо известном дампе Википедии, предоставленном Тобиасом Шнабелем по следующей ссылке: http://www.cs.cornell.edu/~schnabts/eval/index.html (около 4 ГБ).

Я хотел бы понять, сколько эпох мне нужно запускать модель для обучения, пока модель не сойдется.

Я добавил следующий код:

 model = Word2Vec(size=self._number_of_dimensions_in_hidden_layer,
                    window=self._window_size,
                    min_count=3,
                    max_vocab_size=self._max_vocabulary_size,
                    sg=self._use_cbow,
                    seed=model_seed,
                    compute_loss=True,
                    iter=self._epochs)
    model.build_vocab(sentences)

    learning_rate = 0.025
    step_size = (learning_rate - 0.001) / self._epochs

    for i in range(self._epochs):
        end_lr = learning_rate - step_size
        trained_word_count, raw_word_count = model.train(sentences, compute_loss=True,
                                                         start_alpha=learning_rate,
                                                         end_alpha=learning_rate,
                                                         total_examples=model.corpus_count,
                                                         epochs=1)
        loss = model.get_latest_training_loss()
        print("iter={0}, loss={1}, learning_rate={2}".format(i, loss, learning_rate))
        learning_rate  *= 0.6


    model.save(model_name_path)

Однако я не вижу, чтобы модель сходилась:

iter=0, loss=76893000.0, learning_rate=0.025
iter=1, loss=74870528.0, learning_rate=0.015
iter=2, loss=73959232.0, learning_rate=0.009
iter=3, loss=73605400.0, 
learning_rate=0.005399999999999999
iter=4, loss=73224288.0, 
learning_rate=0.0032399999999999994
iter=5, loss=73008048.0, 
learning_rate=0.0019439999999999995
iter=6, loss=72935888.0, 
learning_rate=0.0011663999999999997
iter=7, loss=72774304.0, 
learning_rate=0.0006998399999999999
iter=8, loss=72642072.0, 
learning_rate=0.0004199039999999999
iter=9, loss=72624384.0, 
learning_rate=0.00025194239999999993
iter=10, loss=72700064.0, 
learning_rate=0.00015116543999999996
iter=11, loss=72478656.0, 
learning_rate=9.069926399999997e-05
iter=12, loss=72486744.0, 
learning_rate=5.441955839999998e-05
iter=13, loss=72282776.0, 
learning_rate=3.2651735039999986e-05
iter=14, loss=71841968.0, 
learning_rate=1.9591041023999992e-05
iter=15, loss=72119848.0, 
learning_rate=1.1754624614399995e-05
iter=16, loss=72054544.0, 
learning_rate=7.0527747686399965e-06
iter=17, loss=71958888.0, 
learning_rate=4.2316648611839976e-06
iter=18, loss=71933808.0, 
learning_rate=2.5389989167103985e-06
iter=19, loss=71739256.0, 
learning_rate=1.523399350026239e-06
iter=20, loss=71660288.0, 
learning_rate=9.140396100157433e-07

Я не понимаю, почему результат функции потерь не уменьшается и остается довольно постоянным на уровне 71M.


person Aviade    schedule 11.08.2018    source источник


Ответы (1)


Модель сходится, когда потери за полную эпоху перестают улучшаться. Нет гарантии, что потеря будет сколь угодно малой: модель просто достигает точки, когда она не может улучшить одно предсказание (контекст) -> (слово) без ухудшения другого. Так что здесь не обязательно что-то не так. Это может быть лучшая возможная потеря с моделью такой сложности на этих данных.

Обратите внимание, что вычисление потерь - это новая и экспериментальная опция в gensim, и даже в версии 3.5.0 могут возникать проблемы. (См., Например, этот PR.) Может быть, лучше оптимизировать мета -параметры, такие как количество эпох обучения, основанные на некоторой другой мере качества слова-вектора.

Обратите внимание, что типичное значение по умолчанию для количества итераций обучения для большого разнообразного корпуса, где слова появляются равномерно повсюду, равно 5. (Это было значение, используемое в исходном word2vec.c от Google.)

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

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

Прочие примечания:

  • вы, кажется, включаете режим пропуска грамм (не CBOW), если ваша переменная _use_cbow имеет значение True-ish, что сбивает с толку
  • обратите внимание, что max_vocab_size вызовет крайнюю обрезку слов во время начального сканирования корпуса, если текущий размер достигает этого порога - таким образом, размер словаря может быть меньше, чем ваше настроенное значение. В идеале вы должны установить это значение настолько высоко, насколько позволяет ваша память, для наиболее точного подсчета опросов, а затем использовать min_count в качестве основного механизма для обрезки окончательного размера до желаемого числа.
person gojomo    schedule 11.08.2018