gensim - Doc2Vec: MemoryError при обучении английской википедии - PullRequest
0 голосов
/ 17 мая 2018

Я извлек 145 185 965 предложений (14 ГБ) из дампа английской Википедии, и я хочу обучить модель Doc2Vec на основе этих предложений.К сожалению, у меня «только» 32 ГБ ОЗУ и я получаю MemoryError при попытке тренироваться.Даже если я установлю min_count равным 50, gensim скажет мне, что ему потребуется более 150 ГБ ОЗУ.Я не думаю, что дальнейшее увеличение min_count было бы хорошей идеей, потому что получающаяся модель была бы не очень хорошей (только предположение).Но в любом случае, я попробую его с 500, чтобы увидеть, достаточно ли памяти, тогда.

Есть ли возможность обучить такую ​​большую модель с ограниченным объемом оперативной памяти?

Вот мой текущий код:

corpus = TaggedLineDocument(preprocessed_text_file)
model = Doc2Vec(vector_size=300, 
                window=15, 
                min_count=50,  #1
                workers=16, 
                dm=0, 
                alpha=0.75, 
                min_alpha=0.001, 
                sample=0.00001,
                negative=5)
model.build_vocab(corpus)
model.train(corpus, 
            epochs=400, 
            total_examples=model.corpus_count, 
            start_alpha=0.025, 
            end_alpha=0.0001)

Возможно, я допускаю некоторые очевидные ошибки?Использовать его совершенно неправильно?

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

1 Ответ

0 голосов
/ 17 мая 2018

Требуемый размер модели в адресуемой памяти во многом зависит от количества требуемых весов, от количества уникальных слов и уникальных тегов документов.

Имея 145 000 000 уникальных тегов документов, независимо от того, сколько слов вы ограничиваете, только для необработанных векторов документов потребуется:

145,000,000 * 300 dimensions * 4 bytes/dimension = 174GB

Вы можете попробовать меньшийнабор данных.Вы можете уменьшить размер вектора.Вы могли бы получить больше памяти.

Сначала я бы попробовал один или несколько из них, просто чтобы убедиться, что вы можете заставить все работать и некоторые начальные результаты.

Существует один прием, который лучше всего рассматривать как экспериментальный, который может помочь в обучении больших наборов документов-векторов при некоторой стоимости дополнительной сложности и более низкой производительности: параметр docvecs_mapfile Doc2Vec.

Обычно вы не хотите, чтобы сеанс обучения в стиле Word2Vec / Doc2Vec использовал какую-либо виртуальную память, потому что любое обращение к более медленному вводу-выводу на диск делает обучение чрезвычайно медленным.Однако для большого набора документов, который повторяется только в одном порядке, снижение производительности может быть выжившим после создания массива документа-векторов, который будет поддерживаться файлом с отображением в памяти.По сути, каждый проход обучения проходит по файлу от шрифта к концу, читая каждый раздел один раз и разбирая его по страницам один раз.

Если вы укажете аргумент docvecs_mapfile, Doc2Vec выделит массив doc-vectors, который будет поддерживаться этим файлом на диске.Таким образом, у вас будет файл размером в сотни ГБ на диске (в идеале SSD), диапазоны которого выгружаются в / из ОЗУ по мере необходимости.

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

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

...