Модель Gensim Word2Vec ухудшается за счет увеличения количества эпох - PullRequest
0 голосов
/ 01 октября 2019

Я строю модель Word2Vec для рекомендации по категориям для набора данных, состоящего из ~ 35 000 предложений, в общей сложности ~ 500 000 слов, но только ~ 3.000 отдельных. Я строю модель в основном так:

def train_w2v_model(df, epochs):
    w2v_model = Word2Vec(min_count=5,
                                 window=100,
                                 size=230,
                                 sample=0,
                                 workers=cores-1,
                                 batch_words=100)
    vocab = df['sentences'].apply(list)
    w2v_model.build_vocab(vocab)
    w2v_model.train(vocab, total_examples=w2v_model.corpus_count, total_words=w2v_model.corpus_total_words, epochs=epochs, compute_loss=True)
    return w2v_model.get_latest_training_loss()

Я пытался найти правильное количество эпох для такой модели, как эта:

print(train_w2v_model(1))
=>> 86898.2109375
print(train_w2v_model(100))
=>> 5025273.0

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

100 эпох:

w2v_model.wv.most_similar(['machine_learning'])
=>> [('salesforce', 0.3464601933956146),
 ('marketing_relationnel', 0.3125850558280945),
 ('batiment', 0.30903393030166626),
 ('go', 0.29414454102516174),
 ('simulation', 0.2930642068386078),
 ('data_management', 0.28968319296836853),
 ('scraping', 0.28260597586631775),
 ('virtualisation', 0.27560457587242126),
 ('dataviz', 0.26913416385650635),
 ('pandas', 0.2685554623603821)]

1эпоха:

w2v_model.wv.most_similar(['machine_learning'])
=>> [('data_science', 0.9953729510307312),
 ('data_mining', 0.9930223822593689),
 ('big_data', 0.9894922375679016),
 ('spark', 0.9881765842437744),
 ('nlp', 0.9879133701324463),
 ('hadoop', 0.9834049344062805),
 ('deep_learning', 0.9831978678703308),
 ('r', 0.9827396273612976),
 ('data_visualisation', 0.9805369973182678),
 ('nltk', 0.9800992012023926)]

Любое понимание того, почему он так себя ведет? Я бы подумал, что увеличение количества эпох наверняка окажет положительное влияние на тренировку потери.

1 Ответ

1 голос
/ 01 октября 2019

Во-первых, сообщение о потере тренировочного бега, по крайней мере через gensim-3.8.1 (сентябрь 2019 г.), немного недоделано. Это просто текущая сумма всех потерь во все эпохи - и, следовательно, всегда растущая - а не потери за эпоху, которые могут уменьшиться. Существует давно ожидаемое исправление , которое все еще требует небольшой работы , но пока оно не добавлено, сообщаемые числа нуждаются в дополнительном сравнении с более ранними числами, чтобы обнаружить любое уменьшение эпохи к эпохе.

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

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

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

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

Точно так же не ясно, какой embedding_size вы используете, но попытка сделать "очень большие" векторы для небольшого словаря очень склонна к перегрузкам, так как для векторов есть много "места" для запоминаниядетали обучения. Меньшие векторы вызывают своего рода «сжатие» в модели, что приводит к обучению, которое с большей вероятностью будет обобщать. (Мое очень грубое эмпирическое правило, совсем не строго соблюдаемое, заключается в том, чтобы никогда не использовать плотный размер вложения, больший, чем квадратный корень из ожидаемого размера словаря. Таким образом, с токенами 10К не более 100-мерного измерениявекторы.)

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

  • window=100 нетипичны и кажутся гораздо большими, чем вашисредний размер текста (~ 14 слов) - если предполагается, что все токены должны влиять на все остальные, независимо от расстояния (возможно, из-за того, что исходные данные изначально неупорядочены), это уместно, и вы также можете пойти намного больше (скажем, 1млн). С другой стороны, если прямые соседи токена более релевантны, чем другие в том же тексте, меньшее окно имело бы смысл.

  • нет веской причины использовать batch_words=100 - этобудет только замедлять обучение, и если на самом деле у вас есть какие-либо тексты, которые больше, чем 100 слов, это искусственно разбьет их (таким образом, отменяя любую выгоду от гигантского значения window выше). (Оставьте это значение по умолчанию.)

  • метод train() будет использовать только total_examples или total_words, но не оба, поэтому вам нужно указать только один

  • , так как может показаться, что вы работаете с чем-то вроде рекомендации по категориям, а не с чисто естественным языком, вы также можете возиться с нестандартными значениями параметра ns_exponent - проверьте документ-комментировать и ссылаться на статью в class docs об этом параметре для более подробной информации.

...