Como inicializar um novo modelo word2vec com pesos pré-treinados?

13

Estou usando a Biblioteca Gensim em python para usar e treinar o modelo word2vector. Recentemente, eu estava olhando para inicializar meus pesos de modelo com algum modelo word2vec pré-treinado, como (modelo pré-treinado GoogleNewDataset). Eu tenho lutado com isso algumas semanas. Agora, acabei de pesquisar que no gesim existe uma função que pode me ajudar a inicializar os pesos do meu modelo com pesos pré-treinados. Isso é mencionado abaixo:

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.

Não sei se essa função pode fazer a mesma coisa ou não. Por favor ajude!!!

Nomiluks
fonte
O vocabulário dos modelos é o mesmo?
Hima Varsha
Por que não iniciar cada um dos parâmetros word2vec com números gerados aleatoriamente para cada execução? Eu poderia fazer isso e, com uma cuidadosa seleção dos números aleatórios para cada parâmetro (numFeatures, contextWindow, seed), consegui obter tuplas de similaridade aleatórias que eu queria para minha base de dados. Simulando uma arquitetura de conjunto. O que os outros pensam disso? Pls responder.
Zorze 21/08/19

Respostas:

18

Obrigado Abhishek. Eu descobri! Aqui estão minhas experiências.

1) traçamos um exemplo 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()

insira a descrição da imagem aqui

A partir das parcelas acima, podemos ver que frases fáceis não podem distinguir o significado de palavras diferentes por distâncias.

2) Carregar incorporação de palavras pré-treinadas:

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

insira a descrição da imagem aqui

A partir da figura acima, podemos ver que os casamentos de palavras são mais significativos.
Espero que esta resposta seja útil.

Shixiang Wan
fonte
1
esta resposta é bastante informativa e útil na incorporação de modelo em um arquivo vec.
Akash Kandpal
@ harrypotter0 Thx!
Shixiang Wan
companheiro limpo e arrumado !!!
Vijay athithya
Quando tentei usar isso, testei-o com dois conjuntos de dados idênticos. Os resultados foram diferentes para cada modelo. Eu esperava que, como começaria com os mesmos pesos inicializados, os modelos fossem os mesmos posteriormente. Como é que não foi esse o caso?
Eric Wiener
1
@EricWiener Como, mesmo que os conjuntos de dados de treinamento sejam os mesmos, os vetores de palavras para cada treinamento são aleatórios. Os espaços vetoriais de palavras calculados pelo mesmo conjunto de dados devem ser semelhantes e o desempenho usado nas tarefas da PNL também deve ser semelhante.
Shixiang Wan
4

Vamos ver um código de exemplo:

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

Portanto, observamos que o modelo1 está sendo redefinido pelo modelo2 e, portanto, a palavra 'terceiro' e 'sentença' estão em seu vocabulário, eventualmente dando sua semelhança. Este é o uso básico. Você também pode verificar reset_weights () para redefinir os pesos para o estado não treinado / inicial.

Hima Varsha
fonte
2

Se você está procurando uma rede pré-treinada para incorporação de palavras, sugiro o GloVe. O blog a seguir da Keras é muito informativo sobre como implementar isso. Ele também possui um link para os pré-treinamentos GloVe. Existem vetores de palavras pré-treinados que variam de um vetor dimensional de 50 a 300 vetores dimensionais. Eles foram criados na Wikipedia, Common Crawl Data ou Twitter. Você pode baixá-los aqui: http://nlp.stanford.edu/projects/glove/ . Além disso, você deve examinar o blog keras sobre como implementá-los. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

Samuel Sherman
fonte