В этом блоге я кратко расскажу о том, что такое word2vec, как обучить свой собственный word2vec, как загрузить предварительно обученный Google word2vec и как обновить предварительно обученную модель Google с помощью пакета gensim в Python.

Что такое word2vec?

Если вы когда-либо участвовали в создании любого текстового классификатора, вы наверняка слышали о word2vec. Word2vec был создан группой исследователей во главе с Томашем Миколовым из Google. Это алгоритм обучения без присмотра, и он работает, предсказывая контекстные слова, применяя двухслойную нейронную сеть. Чтобы узнать больше о word2vec под капотом, вы можете обратиться к Ютуб-видео Стэнфордского университета.

Конечным результатом word2vec является то, что он может преобразовывать слова в векторы.

Существует два алгоритма для генерации кодирования: непрерывный подход с набором слов и пропуск граммы. Они изображены на графике ниже.

Как тренировать word2vec?

from gensim.models import Word2Vec 
sentences = [['yes', 'this', 'is', 'the', 'word2vec', 'mode']\ ,['if',"you","have","think","about","it"]] 
model = Word2Vec(sentences,size = 10, window=5,min_count = 1)

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

Сохраните модель и загрузите модель

После того, как вы закончили обучение модели, вы можете сохранить ее следующим образом:

model.save(your_file_name_for_saving_in_the_disk)

Если вы хотите снова загрузить модель в рабочую область, вы можете загрузить ее следующим образом:

model.load(your_file_name_for_saving_in_the_disk)

Подробнее о том, как использовать пакет gensim для модели word2vec, см. в учебнике автора gensim.

Как обновить модель word2vec?

from gensim.models import Word2Vec 
old_sentences = [["bad","robots"],["good","human"]] 
new_sentences = [['yes', 'this', 'is', 'the', 'word2vec', 'model']\ 
,[ 'if',"you","have","think","about","it"]] 
old_model = Word2Vec(old_sentences,size = 10, window=5, min_count = 1, workers = 2) 
old_model.wv.vocab 
old_model.save("old_model") 
new_model = Word2Vec.load("old_model") 
new_model.build_vocab(new_sentences, update = True) 
new_model.train(new_sentences, total_examples=2, epochs = 1) 
new_model.wv.vocab

Это результаты приведенного выше кода.

Предварительно обученная Google модель word2vec

Google опубликовал предварительно обученную модель word2vec. Он обучен на части набора данных Google News (около 100 миллиардов слов). Модель содержит 300-мерные векторы для 3 миллионов слов и фраз. Вот ссылка для загрузки предварительно обученных 300-мерных векторов слов Google GoogleNews-vectors-negative300.bin.gz. Бинарный файл (GoogleNews-vectors-negative300.bin) занимает 3,4 гигабайта в разархивированном виде. Для получения дополнительной информации о модели word2vec, опубликованной Google, вы можете увидеть ссылка здесь.

После загрузки вы можете загрузить его следующим образом (если он находится в том же каталоге, что и файл py или блокнот jupyter):

from gensim.models import KeyedVectors 
filename = 'GoogleNews-vectors-negative300.bin' 
model = KeyedVectors.load_word2vec_format(filename, binary=True)

«Перенос обучения» на предварительно обученный Google word2vec

Обновите свой word2vec с помощью предварительно обученной модели Google.

Это мощная предварительно обученная модель, но у нее есть один недостаток. Вы не можете продолжать обучение, так как в нем отсутствуют скрытые веса, словарные частоты и бинарное дерево. Поэтому сейчас невозможно провести трансферное обучение на предварительно обученной модели Google.

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

Чтобы решить вышеуказанную проблему, вы можете заменить векторы слов из своей модели на векторы из модели Google word2vec с помощью вызова метода intersect_word2vec_format.

your_word2vec_model.intersect_word2vec_format('GoogleNews-vectors-negative300.bin', lockf=1.0,binary=True)

См. Документацию здесь для более подробной информации по этому новому методу.

Описанный выше метод не совсем является трансферным обучением, но очень похож на него.

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

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

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

Вот код для этого.

from gensim.models import Word2Vec 
sentences = [["bad","robots"],["good","human"],['yes', 'this', 'is', 'the', 'word2vec', 'model']] 
# size option needs to be set to 300 to be the same as Google's pre-# trained model 
word2vec_model = Word2Vec(size = 300, window=5, min_count = 1, workers = 2) 
word2vec_model.build_vocab(sentences) 
# assign the vectors to the vocabs that are in Google's pre-trained # model and your sentences defined above.
# lockf needs to be set to 1.0 to allow continued training. word2vec_model.intersect_word2vec_format('./word2vec/GoogleNews-vectors-negative300.bin', lockf=1.0, binary=True) 
# continue training with you own data word2vec_model.train(sentences, total_examples=3, epochs = 5)

Вот результат приведенного выше кода.

Первоначально опубликовано на сайте phdstatsphys.wordpress.com 27 декабря 2018 г.