Önceden eğitilmiş model ağırlıklarıyla yeni bir word2vec modeli nasıl başlatılır?


14

Word2vector modelini kullanmak ve eğitmek için Python'da Gensim Kütüphanesi kullanıyorum. Son zamanlarda, model ağırlıklarımı (GoogleNewDataset önceden eğitilmiş modeli) gibi önceden eğitilmiş word2vec modelleriyle başlatmaya bakıyordum. Birkaç haftadır bununla mücadele ediyorum. Şimdi, gesim'de, modelimin ağırlıklarını önceden eğitilmiş model ağırlıklarıyla başlatmama yardımcı olabilecek bir işlev olduğunu araştırdım. Bu aşağıda belirtilmiştir:

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.

Bu işlevin aynı şeyi yapıp yapamayacağını bilmiyorum. Lütfen yardım et!!!


Modellerin kelime dağarcığı aynı mı?
Hima Varsha

Word2vec parametrelerinin her birini neden her çalışma için rasgele oluşturulmuş sayılarla başlatmıyorsunuz? Bunu yapabilir ve her parametre (numFeatures, contextWindow, tohum) için rasgele sayıların dikkatli seçimi ile benim usecase için istediğim rastgele benzerlik tuples elde edebildi. Topluluk mimarisini simüle etme. Diğerleri bunun hakkında ne düşünüyor? Pls cevap verir.
zorze

Yardımınız için teşekkürler. Bana çok yardımcı olur
frhyme

Yanıtlar:


18

Teşekkürler Abhishek. Anladım! İşte deneylerim.

1). kolay bir örnek çiziyoruz:

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

resim açıklamasını buraya girin

Yukarıdaki grafiklerden, kolay cümlelerin farklı kelimelerin anlamlarını mesafelerle ayırt edemediğini görebiliriz.

2). Önceden eğitilmiş kelime yerleştirmeyi yükle:

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

resim açıklamasını buraya girin

Yukarıdaki rakamdan, kelime düğünlerinin daha anlamlı olduğunu görebiliriz.
Umarım bu cevap faydalı olacaktır.


1
bu cevap, modeli bir vec dosyasına gömmek için oldukça bilgilendirici ve yararlıdır.
Akash Kandpal

@ harrypotter0 Teşekkürler!
Shixiang Wan

temiz ve açık dostum !!!
vijay athithya

Bunu kullanmaya çalıştığımda, iki özdeş veri kümesiyle test ettim. Sonuçlar her model için farklıydı. Aynı başlangıç ​​ağırlıklarıyla başlayacağımdan, modellerin daha sonra aynı olacağını umuyordum. Neden böyle olmadı?
Eric Wiener

1
@EricWiener Egzersiz veri kümeleri aynı olsa bile, her eğitim için sözcük vektörleri rasgele. Aynı veri kümesi tarafından hesaplanan sözcük vektör uzayları benzer olmalı ve NLP görevlerinde kullanılan performans da benzer olmalıdır.
Shixiang Wan

4

Örnek bir koda bakalım:

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

Bu nedenle, model1'in model2 tarafından sıfırlandığını ve dolayısıyla 'üçüncü' ve 'cümle' kelimesinin sonunda kelime benzerliğini verdiği gözlemlemekteyiz. Bu temel kullanımdır, ayrıca ağırlıkları eğitimsiz / başlangıç ​​durumuna sıfırlamak için reset_weights () öğesini de kontrol edebilirsiniz.


2

Kelime düğünler için önceden eğitilmiş bir ağ arıyorsanız, GloVe'yi öneririm. Keras'ın aşağıdaki blogu, bunu nasıl uygulayacağınız konusunda çok bilgilendiricidir. Ayrıca önceden eğitilmiş GloVe düğünlerine bir bağlantı vardır. 50 boyutlu bir vektörden 300 boyutlu vektörlere kadar önceden eğitilmiş sözcük vektörleri vardır. Bunlar Wikipedia, Ortak Tarama Verileri veya Twitter verileri üzerine oluşturuldu. Bunları buradan indirebilirsiniz: http://nlp.stanford.edu/projects/glove/ . Ayrıca, keras blogunu nasıl uygulayacağınızı da incelemelisiniz. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.