Come inizializzare un nuovo modello word2vec con pesi modello pre-allenati?


14

Sto usando Gensim Library in Python per l'utilizzo e l'addestramento del modello word2vector. Di recente, stavo cercando di inizializzare i pesi del mio modello con alcuni modelli word2vec pre-addestrati come (modello preinstallato GoogleNewDataset). Ho avuto delle difficoltà per un paio di settimane. Ora, ho appena scoperto che in gesim esiste una funzione che può aiutarmi a inizializzare i pesi del mio modello con pesi modello pre-allenati. Questo è menzionato di seguito:

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.

Non so che questa funzione può fare la stessa cosa o no. Per favore aiuto!!!


Il vocabolario dei modelli è lo stesso?
Hima Varsha,

Perché non avviare ciascuno dei parametri word2vec con numeri generati casuali per ogni corsa? Potrei farlo e con un'attenta selezione dei numeri casuali per ogni parametro (numFeatures, contextWindow, seed) sono stato in grado di ottenere tuple di somiglianza casuali che volevo per il mio caso d'uso. Simulazione di un'architettura d'insieme. Cosa ne pensano gli altri? Per favore, rispondi.
zorze,

Grazie per l'aiuto. Mi aiuta molto
frhyme il

Risposte:


18

Grazie ad Abhishek. L'ho capito! Ecco i miei esperimenti.

1). tracciamo un semplice esempio:

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

inserisci qui la descrizione dell'immagine

Dalle trame di cui sopra, possiamo vedere che le frasi facili non possono distinguere il significato di parole diverse per distanza.

2). Carica incorporamento parole pre-addestrato:

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

inserisci qui la descrizione dell'immagine

Dalla figura sopra, possiamo vedere che gli incantesimi di parole sono più significativi.
Spero che questa risposta sia utile.


1
questa risposta è piuttosto istruttiva e utile per incorporare il modello in un file VEC.
Akash Kandpal,

@ harrypotter0 Thx!
Shixiang Wan,

pulito e pulito amico !!!
vijay athithya,

Quando ho tentato di utilizzare questo, l'ho testato con due set di dati identici. I risultati sono stati diversi per ciascun modello. Speravo che, poiché avrei iniziato con gli stessi pesi inizializzati, i modelli sarebbero stati gli stessi in seguito. Come mai non è stato così?
Eric Wiener

1
@EricWiener Perché anche se i set di dati di allenamento sono uguali, i vettori di parole per ciascun allenamento sono casuali. Gli spazi vettoriali di parole calcolati dallo stesso set di dati dovrebbero essere simili e anche le prestazioni utilizzate nelle attività di PNL dovrebbero essere simili.
Shixiang Wan,

4

Vediamo un codice di esempio:

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

Quindi, osserviamo che model1 viene reimpostato da model2 e quindi la parola "terza" e "frase" si trovano nel suo vocabolario alla fine dando la sua somiglianza. Questo è l'uso di base, puoi anche controllare reset_weights () per ripristinare i pesi allo stato iniziale / non allenato.


2

Se stai cercando una rete pre-allenata per gli incantesimi di parole, suggerirei GloVe. Il seguente blog di Keras è molto istruttivo su come implementarlo. Ha anche un collegamento agli incorporamenti pre-addestrati di GloVe. Esistono vettori di parole pre-addestrati che vanno da un vettore di 50 dimensioni a 300 vettori di dimensioni. Sono stati costruiti su Wikipedia, Common Crawl Data o Twitter. Puoi scaricarli qui: http://nlp.stanford.edu/projects/glove/ . Inoltre, dovresti esaminare il blog di keras su come implementarli. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.