Jak zainicjować nowy model word2vec przy pomocy wstępnie wyuczonych wag modelu?

14

Korzystam z biblioteki Gensim w Pythonie do używania i szkolenia modelu word2vector. Ostatnio zastanawiałem się nad zainicjowaniem wag modelu za pomocą wstępnie wyszkolonego modelu word2vec, takiego jak (model wstępnie przeszkolony GoogleNewDataset). Walczyłem z tym od kilku tygodni. Teraz właśnie sprawdziłem, że w gesim jest funkcja, która może mi pomóc zainicjować wagi mojego modelu przy pomocy wstępnie wyszkolonych odważników modelu. Zostało to wspomniane poniżej:

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.

Nie wiem, czy ta funkcja może zrobić to samo, czy nie. Proszę pomóż!!!

Nomiluks
źródło
Czy słownictwo modeli jest takie samo?
Hima Varsha
Dlaczego nie zainicjować każdego parametru word2vec losowo wygenerowanymi liczbami dla każdego przebiegu? Mogłem to zrobić i dzięki starannemu dobraniu liczb losowych dla każdego parametru (numFeatures, contextWindow, seed) udało mi się uzyskać krotki losowego podobieństwa, które chciałem dla mojego przypadku użycia. Symulacja architektury zespołu. Co sądzą o tym inni? Proszę odpowiedzieć.
zorze
Dzięki za pomoc. Bardzo mi to pomaga
frhyme

Odpowiedzi:

18

Dziękuję Abhishek. Rozpracowałem to! Oto moje eksperymenty.

1). narysujemy prosty przykład:

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()

wprowadź opis zdjęcia tutaj

Z powyższych wykresów widzimy, że proste zdania nie potrafią rozróżnić znaczenia różnych słów według odległości.

2). Załaduj wstępnie wyszkolone osadzanie słów:

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()

wprowadź opis zdjęcia tutaj

Na powyższym rysunku widać, że osadzanie słów jest bardziej znaczące.
Mam nadzieję, że ta odpowiedź będzie pomocna.

Shixiang Wan
źródło
1
ta odpowiedź jest dość pouczająca i pomocna przy osadzaniu modelu w pliku vec.
Akash Kandpal
@ harrypotter0 Thx!
Shixiang Wan,
schludny i jasny kolego !!!
vijay athithya
Kiedy próbowałem tego użyć, przetestowałem to z dwoma identycznymi zestawami danych. Wyniki były różne dla każdego modelu. Miałem nadzieję, że ponieważ zacznę od tych samych zainicjowanych ciężarów, modele będą potem takie same. Dlaczego tak się nie stało?
Eric Wiener,
1
@EricWiener Ponieważ nawet jeśli zestawy danych szkolenia są takie same, wektory słów dla każdego szkolenia są losowe. Przestrzenie wektorów słów obliczone przez ten sam zestaw danych powinny być podobne, a wydajność wykorzystywana w zadaniach NLP również powinna być podobna.
Shixiang Wan
4

Spójrzmy na przykładowy kod:

>>>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

Stąd obserwujemy, że model1 jest resetowany przez model2 i stąd słowo „trzeci” i „zdanie” znajdują się w jego słowniku, ostatecznie nadając swoje podobieństwo. Jest to podstawowe zastosowanie, możesz również sprawdzić reset_weights (), aby zresetować wagi do stanu niewytrenowanego / początkowego.

Hima Varsha
źródło
2

Jeśli szukasz wstępnie wyszkolonej sieci do osadzania słów, proponuję GloVe. Poniższy blog z Keras jest bardzo pouczający o tym, jak to zaimplementować. Zawiera również link do wstępnie przeszkolonych osadzeń GloVe. Istnieją wstępnie wyszkolone wektory słów, od 50 wektorów do 300 wymiarów. Zostały one zbudowane na Wikipedii, wspólnych danych indeksowania lub na Twitterze. Możesz je pobrać tutaj: http://nlp.stanford.edu/projects/glove/ . Ponadto powinieneś sprawdzić blog keras, w jaki sposób je wdrożyć. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

Samuel Sherman
źródło