Bagaimana cara menginisialisasi model word2vec baru dengan bobot model pra-terlatih?

14

Saya menggunakan Perpustakaan Gensim dalam python untuk menggunakan dan melatih model word2vector. Baru-baru ini, saya melihat inisialisasi bobot model saya dengan beberapa model word2vec yang sudah dilatih sebelumnya seperti (model pretrained GoogleNewDataset). Saya telah berjuang dengan itu beberapa minggu. Sekarang, saya hanya mencari bahwa di gesim ada fungsi yang dapat membantu saya untuk menginisialisasi bobot model saya dengan bobot model pra-terlatih. Itu disebutkan di bawah ini:

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.

Saya tidak tahu fungsi ini bisa melakukan hal yang sama atau tidak. Tolong bantu!!!

Nomiluk
sumber
Apakah kosakata modelnya sama?
Hima Varsha
Mengapa tidak memulai setiap parameter word2vec dengan angka yang dihasilkan secara acak untuk setiap proses? Saya bisa melakukan ini dan dengan pemilihan angka acak secara hati-hati untuk setiap parameter (numFeatures, contextWindow, seed) saya bisa mendapatkan tuple kesamaan acak yang saya inginkan untuk usecase saya. Mensimulasikan arsitektur ansambel. Apa yang orang lain pikirkan tentang itu? Pls jangan membalas.
zorze
Terima kasih atas bantuan Anda. Ini banyak membantu saya
frhyme

Jawaban:

18

Terima kasih Abhishek. Saya sudah memikirkannya! Ini eksperimen saya.

1). kami memplot contoh yang mudah:

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

masukkan deskripsi gambar di sini

Dari plot di atas, kita dapat melihat bahwa kalimat yang mudah tidak dapat membedakan arti kata yang berbeda berdasarkan jarak.

2). Muatkan penyisipan kata pra-terlatih:

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

masukkan deskripsi gambar di sini

Dari gambar di atas, kita dapat melihat bahwa embeddings kata lebih bermakna.
Semoga jawaban ini bermanfaat.

Shixiang Wan
sumber
1
jawaban ini cukup informatif dan membantu dalam menanamkan model ke file vec.
Akash Kandpal
@ harrypotter0 Thx!
Shixiang Wan
sobat rapi dan bersih !!!
vijay athithya
Ketika saya mencoba untuk menggunakan ini, saya mengujinya dengan dua set data yang identik. Hasilnya berbeda untuk setiap model. Saya berharap bahwa karena saya akan mulai dengan bobot yang diinisialisasi yang sama, model akan sama setelahnya. Kenapa ini tidak terjadi?
Eric Wiener
1
@EricWiener Karena meskipun set data pelatihan sama, kata vektor untuk setiap pelatihan adalah acak. Ruang vektor kata yang dihitung oleh dataset yang sama harus serupa, dan kinerja yang digunakan dalam tugas NLP juga harus serupa.
Shixiang Wan
4

Mari kita lihat kode contoh:

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

Oleh karena itu, kami mengamati bahwa model1 sedang direset oleh model2 dan karenanya kata, 'ketiga' dan 'kalimat' ada dalam kosa kata itu akhirnya memberikan kesamaan. Ini adalah penggunaan dasar, Anda juga dapat memeriksa reset_weights () untuk mengatur ulang bobot ke keadaan tidak terlatih / awal.

Hima Varsha
sumber
2

Jika Anda mencari jaring pra-terlatih untuk embeddings kata, saya sarankan GloVe. Blog berikut dari Keras sangat informatif tentang cara menerapkannya. Ini juga memiliki tautan ke pernikahan GloVe yang sudah dilatih sebelumnya. Ada vektor kata pra-terlatih mulai dari vektor 50 dimensi hingga 300 vektor dimensi. Mereka dibangun di Wikipedia, Data Perayapan Umum, atau data Twitter. Anda dapat mengunduhnya di sini: http://nlp.stanford.edu/projects/glove/ . Selain itu, Anda harus memeriksa keras blog tentang cara menerapkannya. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

Samuel Sherman
sumber