Wie initialisiere ich ein neues word2vec-Modell mit vorab trainierten Modellgewichten?

13

Ich verwende die Gensim Library in Python, um das word2vector-Modell zu verwenden und zu trainieren. Kürzlich habe ich versucht, meine Modellgewichte mit einem vorab trainierten word2vec-Modell zu initialisieren, z. B. mit einem vorab trainierten Modell von GoogleNewDataset. Ich habe ein paar Wochen damit zu kämpfen. Ich habe gerade herausgefunden, dass es in gesim eine Funktion gibt, mit der ich die Gewichte meines Modells mit vorgefertigten Modellgewichten initialisieren kann. Das wird unten erwähnt:

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.

Ich weiß nicht, ob diese Funktion dasselbe kann oder nicht. Bitte helfen Sie !!!

Nomiluks
quelle
Ist der Wortschatz der Models derselbe?
Hima Varsha
Warum nicht jeden der word2vec-Parameter mit zufällig generierten Zahlen für jeden Lauf auslösen? Ich konnte dies tun und durch sorgfältige Auswahl der Zufallszahlen für jeden Parameter (numFeatures, contextWindow, seed) konnte ich zufällige Ähnlichkeitstupel erhalten, die ich für meinen Verwendungszweck wollte. Simulation einer Ensemble-Architektur. Was denken andere darüber? Pls antworten.
Zorze

Antworten:

17

Vielen Abhishek. Ich habe es herausgefunden! Hier sind meine Experimente.

1). Wir zeichnen ein einfaches Beispiel:

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

Bildbeschreibung hier eingeben

Aus den obigen Darstellungen können wir ersehen, dass einfache Sätze die Bedeutung verschiedener Wörter nicht durch Entfernungen unterscheiden können.

2). Laden Sie vorgefertigte Worteinbettungen:

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

Bildbeschreibung hier eingeben

Aus der obigen Abbildung können wir ersehen, dass Worteinbettungen aussagekräftiger sind.
Hoffe, diese Antwort wird hilfreich sein.

Shixiang Wan
quelle
1
Diese Antwort ist sehr informativ und hilfreich beim Einbetten des Modells in eine VEC-Datei.
Akash Kandpal
@ harrypotter0 Thx!
Shixiang Wan
ordentlich und klar Kumpel !!!
Vijay Athithya
Als ich dies versuchte, habe ich es mit zwei identischen Datensätzen getestet. Die Ergebnisse waren für jedes Modell unterschiedlich. Ich hatte gehofft, dass, da ich mit denselben initialisierten Gewichten beginnen würde, die Modelle danach dieselben sein würden. Wieso war das nicht der Fall?
Eric Wiener
1
@EricWiener Da die Wortvektoren für jedes Training zufällig sind, auch wenn die Trainingsdatensätze identisch sind. Die Wortvektorräume, die von demselben Dataset berechnet werden, sollten ähnlich sein, und die Leistung, die in NLP-Tasks verwendet wird, sollte ebenfalls ähnlich sein.
Shixiang Wan
4

Schauen wir uns einen Beispielcode an:

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

Daher stellen wir fest, dass model1 durch model2 zurückgesetzt wird und daher das Wort 'third' und 'sentence' im Wortschatz enthalten sind, was letztendlich seine Ähnlichkeit verleiht. Dies ist die grundlegende Verwendung. Sie können auch reset_weights () aktivieren, um die Gewichte auf den untrainierten / anfänglichen Zustand zurückzusetzen.

Hima Varsha
quelle
2

Wenn Sie nach einem vorgefertigten Netz für Worteinbettungen suchen, würde ich GloVe empfehlen. Der folgende Blog von Keras ist sehr informativ, wie man dies umsetzt. Es gibt auch einen Link zu den vorgefertigten GloVe-Einbettungen. Es gibt vorab trainierte Wortvektoren, die von einem 50-dimensionalen Vektor bis zu 300-dimensionalen Vektoren reichen. Sie wurden entweder auf Wikipedia-, Common Crawl-Daten oder Twitter-Daten erstellt. Sie können sie hier herunterladen: http://nlp.stanford.edu/projects/glove/ . Darüber hinaus sollten Sie im Keras-Blog nachlesen, wie Sie diese implementieren können. https://blog.keras.io/ using-pre-trained-word-embeddings-in-a-keras-model.html

Samuel Sherman
quelle