В gensim
Word2Vec
нет возможности принимать отрицательное значение для workers
. (Откуда вы взяли такую идею?)
Так что вполне возможно, что что-то ломается, возможно, даже не предпринимаются попытки тренировок.
Был ли разумный вывод журнала (на уровне INFO
), свидетельствующий о том, что обучение прогрессировало в ваших пробных запусках, либо против PathLineSentences
, либо во второй попытке? Показывали ли загруженные потоки такие утилиты, как top
? Предполагал ли результат конкретную скорость прогресса и позволил ли вам спрогнозировать вероятное время окончания?
Я бы посоветовал использовать положительное значение workers
и наблюдать за INFO
-уровневым ведением журнала, чтобы лучше понять, что происходит.
К сожалению, даже с 36 ядрами использование итерируемой последовательности корпуса (например, PathLineSentences
) помещает gensim Word2Vec
в модель, где вы, вероятно, получите максимальную пропускную способность со значением workers
в диапазоне 8–16, используя гораздо меньше, чем все ваши потоки. Но он будет делать правильные вещи с корпусом любого размера, даже если он собирается с помощью повторяющейся последовательности на лету.
Использование режима corpus_file
может привести к насыщению гораздо большего числа ядер, но вы все равно должны указать фактическое количество используемых рабочих потоков - в вашем случае workers=36
- и он предназначен для работы со всеми данными из одного файла.
Ваш код, который много раз пытается train()
работать с corpus_file
, имеет множество проблем, и я не могу придумать способ адаптировать режим corpus_file
для работы с множеством ваших файлов. Некоторые из проблем включают:
вы создаете словарь только из 1-го файла, что означает, что любые слова, появляющиеся только в других файлах, будут неизвестны и игнорироваться, а любая из частей алгоритма Word2Vec
, зависящих от частоты слов, может работать с нерепрезентативными
модель строит свою оценку ожидаемого размера корпуса (например: model.corpus_total_words
) на build_vocab()
шаге, поэтому каждый train()
будет вести себя так, как если бы этот размер был общим размером корпуса, в своей отчетности о прогрессе и управлении внутренним alpha
снижением скорости обучения . Таким образом, эти журналы будут неправильными, alpha
будет неправильно управляться в новом разложении каждый train()
, что приведет к бессмысленной мозаике вверх-вниз alpha
по всем файлам.
вы выполняете итерацию по содержимому каждого файла только один раз, что нетипично. (Это может быть разумным в гигантском корпусе из 210 миллиардов слов, если текст каждого файла одинаково и случайным образом представляет домен. В этом случае полный корпус один раз может быть таким же хорошим, как итерация по корпусу, который составляет 1/5 размер в 5 раз. Но было бы проблемой, если бы некоторые слова / шаблоны использования все сгруппированы в определенных файлах - лучшая тренировка чередует контрастные примеры на протяжении каждой эпохи и всех эпох.)
min_count=1
почти всегда неразумно с этим алгоритмом, особенно в больших корпусах типичных частот слов естественного языка. Редкие слова, особенно те, которые встречаются только один или несколько раз, делают модель гигантской, но эти слова не получат хороших слов-векторов, и их содержание действует подобно шуму, мешающему улучшению других, более распространенных слов.
Я рекомендую:
Попробуйте режим итерируемой последовательности корпуса с ведением журнала и разумным workers
значением, чтобы хотя бы получить точное представление о том, сколько времени это может занять. (Самым длинным шагом будет начальное сканирование словарного запаса, которое, по сути, является однопоточным и должно посещать все данные. Но вы можете .save()
модель после этого шага, а затем повторно .load()
ее, повозиться с настройками и попробовать разные train()
подходы без повторения медленного изучения словарного запаса.)
Попробуйте агрессивно более высокие значения min_count
(отказавшись от более редких слов для меньшей модели и более быстрого обучения). Возможно, также попробуйте агрессивно меньшие значения sample
(например, 1e-05
, 1e-06
и т. Д.), Чтобы отбросить большую часть наиболее часто используемых слов, для более быстрого обучения, которое также часто улучшает общее качество вектора слова (за счет относительно больших усилий, затрачиваемых на меньшее количество слов). частые слова).
Если он по-прежнему слишком медленный, подумайте, можно ли использовать меньшую подвыборку вашего корпуса.
Рассмотрите метод corpus_file
, если вы можете скопировать большую часть или все свои данные в один требуемый файл.
person
gojomo
schedule
27.01.2020