Как инициализировать новую модель word2vec с предварительно подготовленными весами модели?


14

Я использую Gensim Library в Python для использования и обучения модели word2vector. Недавно я смотрел на инициализацию весов моей модели с помощью некоторой предварительно обученной модели word2vec, такой как (предварительно обученная модель GoogleNewDataset). Я боролся с этим пару недель. Теперь я только что выяснил, что в gesim есть функция, которая может помочь мне инициализировать веса моей модели с помощью предварительно обученных весов модели. Это упоминается ниже:

reset_from(other_model)

    Borrow shareable pre-built structures (like vocab) from the other_model. Useful if testing multiple models in parallel on the same corpus.

Я не знаю, эта функция может делать то же самое или нет. Пожалуйста помоги!!!


Лексика моделей одинакова?
Хима Варша

Почему бы не инициировать каждый из параметров word2vec случайными числами для каждого прогона? Я мог сделать это, и с тщательным выбором случайных чисел для каждого параметра (numFeatures, contextWindow, seed) я смог получить случайные кортежи подобия, которые я хотел для своего варианта использования. Имитация ансамблевой архитектуры. Что другие думают об этом? Просьба ответить.
Zorze

Спасибо за вашу помощь. Это мне очень помогает
frhyme

Ответы:


18

Спасибо, Абхишек. Я понял это! Вот мои эксперименты.

1). приведем простой пример:

from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
# define training data
sentences = [['this', 'is', 'the', 'first', 'sentence', 'for', 'word2vec'],
            ['this', 'is', 'the', 'second', 'sentence'],
            ['yet', 'another', 'sentence'],
            ['one', 'more', 'sentence'],
            ['and', 'the', 'final', 'sentence']]
# train model
model_1 = Word2Vec(sentences, size=300, min_count=1)

# fit a 2d PCA model to the vectors
X = model_1[model_1.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# create a scatter plot of the projection
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model_1.wv.vocab)
for i, word in enumerate(words):
    pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

введите описание изображения здесь

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

2). Загрузить предварительно обученное встраивание слов:

from gensim.models import KeyedVectors

model_2 = Word2Vec(size=300, min_count=1)
model_2.build_vocab(sentences)
total_examples = model_2.corpus_count
model = KeyedVectors.load_word2vec_format("glove.6B.300d.txt", binary=False)
model_2.build_vocab([list(model.vocab.keys())], update=True)
model_2.intersect_word2vec_format("glove.6B.300d.txt", binary=False, lockf=1.0)
model_2.train(sentences, total_examples=total_examples, epochs=model_2.iter)

# fit a 2d PCA model to the vectors
X = model_2[model_1.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# create a scatter plot of the projection
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model_1.wv.vocab)
for i, word in enumerate(words):
    pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

введите описание изображения здесь

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


1
Этот ответ довольно информативен и полезен при внедрении модели в файл vec.
Акаш Кандпал

@ harrypotter0 Спасибо!
Шиксян Ван

аккуратный и понятный приятель !!!
Виджай Атхитья

Когда я попытался использовать это, я протестировал его с двумя одинаковыми наборами данных. Результаты были разными для каждой модели. Я надеялся, что, поскольку я буду начинать с тех же начальных весов, модели будут такими же после. Почему это не так?
Эрик Винер

1
@EricWiener Поскольку даже если наборы данных для обучения одинаковы, векторы слов для каждого вида обучения являются случайными. Векторные пространства слов, рассчитанные по одному и тому же набору данных, должны быть одинаковыми, и производительность, используемая в задачах НЛП, также должна быть одинаковой.
Шиксян Ван

4

Давайте посмотрим на пример кода:

>>>from gensim.models import word2vec

#let us train a sample model like yours
>>>sentences = [['first', 'sentence'], ['second', 'sentence']]
>>>model1 = word2vec.Word2Vec(sentences, min_count=1)

#let this be the model from which you want to reset
>>>sentences = [['third', 'sentence'], ['fourth', 'sentence']]
>>>model2 = word2vec.Word2Vec(sentences, min_count=1)
>>>model1.reset_from(model2)
>>>model1.similarity('third','sentence')
-0.064622000988260417

Следовательно, мы видим, что модель1 сбрасывается моделью2, и, следовательно, слова «третье» и «предложение» в своем словаре в конечном итоге дают сходство. Это основное использование, вы также можете проверить reset_weights (), чтобы сбросить веса в нетренированное / начальное состояние.


2

Если вы ищете предварительно обученную сеть для встраивания слов, я бы предложил GloVe. Следующий блог от Keras очень информативен о том, как это реализовать. Также имеется ссылка на предварительно обученные вложения GloVe. Существуют предварительно обученные векторы слов в диапазоне от 50-мерного вектора до 300-мерных векторов. Они были построены на Википедии, Общих данных сканирования или Твиттере. Вы можете скачать их здесь: http://nlp.stanford.edu/projects/glove/ . Кроме того, вы должны изучить блог keras о том, как их реализовать. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.