Как инициализировать новую модель 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.

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

Nomiluks
источник
Лексика моделей одинакова?
Хима Варша
Почему бы не инициировать каждый из параметров 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

Самуэль Шерман
источник