Word2Vec: использование Gensim и набора данных Google-News - очень медленное время выполнения

Код написан на питоне. Я загрузил бинарную модель в gensim на python и использовал параметр «init_sims», чтобы ускорить выполнение. Операционная система - OS X. На ее загрузку уходит почти 50-60 секунд. И эквивалентное время, чтобы найти "most_similar". Это нормально? До использования опции init_sims требовалось почти вдвое больше времени! У меня такое чувство, что это может быть проблема с выделением оперативной памяти ОС.

model=Word2Vec.load_word2vec_format('GoogleNewsvectorsnegative300.bin',binary=True)
model.init_sims(replace=True)
model.save('SmallerFile')
#MODEL SAVED INTO SMALLERFILE & NEXT LOAD FROM IT
model=Word2Vec.load('SmallerFile',mmap='r')
#GIVE RESULT SER!
print model.most_similar(positive=['woman', 'king'], negative=['man'])

person Nachiappan Chockalingam    schedule 23.09.2016    source источник
comment
попробуйте переключаться между cbow и ngram во время тренировки.   -  person AbtPst    schedule 23.09.2016


Ответы (1)


Обратите внимание, что эффект экономии памяти init_sims(replace=True) не сохраняется во время циклов сохранения / загрузки, потому что при сохранении всегда сохраняются «сырые» векторы (из которых можно пересчитать нормализованные на единицу векторы). Таким образом, даже после повторной загрузки, когда вы вызываете most_similar() в первый раз, init_sims() будет вызываться за кулисами, и использование памяти будет удвоено.

Кроме того, набор данных GoogleNews довольно велик: для загрузки требуется более 3 ГБ даже до того, как нормализация единиц, возможно, удвоит использование памяти. Итак, в зависимости от того, что еще у вас запущено, и от ОЗУ машины, вы можете использовать память подкачки к моменту выполнения most_similar() вычислений - что очень медленно для схожести результатов вычислений с каждым вектором и сортировки. опс. (Тем не менее, любые most_similar() проверки после 1-го не нуждаются в повторном заполнении кэша векторных нормализованных единиц, поэтому должны выполняться быстрее, чем 1-й вызов.)

Учитывая, что вы сохранили модель после init_sims(replace=True), ее необработанные векторы уже нормализованы по единицам. Таким образом, вы можете вручную исправить модель, чтобы пропустить пересчет, сразу после вашего load():

model.syn0norm = model.syn0

Тогда даже ваш первый most_similar() будет просто обращаться к (одиночному, отображенному в памяти) набору векторов, не вызывая init_sims().

Если это все еще слишком медленно, вам может потребоваться больше памяти или обрезать векторы до подмножества. Кажется, что векторы GoogleNews отсортированы так, чтобы наиболее часто встречающиеся слова помещались раньше, поэтому, если отбросить последние 10%, 50% или даже 90%, вы все равно можете получить полезный набор наиболее часто используемых слов. (Вам нужно будет выполнить эту обрезку самостоятельно, посмотрев на объект модели и исходный код.)

Наконец, вы можете использовать индексирование ближайших соседей, чтобы получить более быстрые совпадения с топ-N, но за счет дополнительной памяти и приблизительных результатов (которые могут пропустить некоторые из истинных совпадений с топ-N). В последних версиях gensim есть руководство по записной книжке IPython по адресу annoytutorial.ipynb Блокнот IPython демонстрационных блокнотов IPython в gensim docs/notebooks каталог.

person gojomo    schedule 27.09.2016