¿Cómo inicializar un nuevo modelo de word2vec con pesos de modelo previamente entrenados?

14

Estoy usando Gensim Library en python para usar y entrenar el modelo word2vector. Recientemente, estaba buscando inicializar los pesos de mi modelo con un modelo word2vec previamente entrenado como (modelo preformado GoogleNewDataset). He estado luchando con eso un par de semanas. Ahora, acabo de buscar que en gesim hay una función que me puede ayudar a inicializar los pesos de mi modelo con pesos de modelo previamente entrenados. Eso se menciona a continuación:

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.

No sé si esta función puede hacer lo mismo o no. ¡¡¡Por favor ayuda!!!

Nomiluks
fuente
¿El vocabulario de las modelos es el mismo?
Hima Varsha
¿Por qué no iniciar cada uno de los parámetros de word2vec con números generados al azar para cada ejecución? Pude hacer esto y con una cuidadosa selección de los números aleatorios para cada parámetro (numFeatures, contextWindow, seed) pude obtener tuplas de similitud aleatoria que quería para mi caso de uso. Simulando una arquitectura de conjunto. ¿Qué piensan los demás al respecto? Por favor responda.
zorze
Gracias por tu ayuda. Me ayuda mucho
frhyme

Respuestas:

18

Gracias a Abhishek. Lo he resuelto! Aquí están mis experimentos.

1) trazamos un ejemplo fácil:

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

ingrese la descripción de la imagen aquí

De las gráficas anteriores, podemos ver que las oraciones fáciles no pueden distinguir el significado de diferentes palabras por distancias.

2) Cargar incrustación de palabras previamente entrenada:

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

ingrese la descripción de la imagen aquí

De la figura anterior, podemos ver que las incrustaciones de palabras son más significativas.
Espero que esta respuesta sea útil.

Shixiang Wan
fuente
1
Esta respuesta es bastante informativa y útil para incrustar el modelo en un archivo vec.
Akash Kandpal
@ harrypotter0 ¡Gracias!
Shixiang Wan
compañero ordenado y claro !!!
vijay athithya
Cuando intenté usar esto, lo probé con dos conjuntos de datos idénticos. Los resultados fueron diferentes para cada modelo. Tenía la esperanza de que, dado que comenzaría con los mismos pesos inicializados, los modelos serían los mismos después. ¿Cómo es que este no fue el caso?
Eric Wiener
1
@EricWiener Porque incluso si los conjuntos de datos de entrenamiento son los mismos, los vectores de palabras para cada entrenamiento son aleatorios. Los espacios vectoriales de palabras calculados por el mismo conjunto de datos deberían ser similares, y el rendimiento utilizado en las tareas de PNL también debería ser similar.
Shixiang Wan
4

Veamos un código de muestra:

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

Por lo tanto, observamos que el modelo2 está siendo reiniciado por el modelo2 y, por lo tanto, la palabra 'tercer' y 'oración' están en su vocabulario, lo que finalmente da su similitud. Este es el uso básico, también puede verificar reset_weights () para restablecer los pesos al estado no entrenado / inicial.

Hima Varsha
fuente
2

Si está buscando una red pre-entrenada para la inserción de palabras, le sugiero GloVe. El siguiente blog de Keras es muy informativo sobre cómo implementar esto. También tiene un enlace a las incrustaciones GloVe pre-entrenadas. Hay vectores de palabras pre-entrenados que van desde un vector de 50 dimensiones hasta 300 vectores de dimensiones. Se crearon en Wikipedia, Common Crawl Data o Twitter. Puede descargarlos aquí: http://nlp.stanford.edu/projects/glove/ . Además, debe examinar el blog de Keras sobre cómo implementarlos. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

Samuel Sherman
fuente