Як ініціалізувати нову модель word2vec з попередньо підготовленими вагами моделі?


14

Я використовую бібліотеку Gensim у python для використання та навчання моделі word2vector. Нещодавно я розглядав ініціалізацію ваги моєї моделі з якоюсь попередньо навченою моделлю word2vec, такою як (попередньо вивчена модель GoogleNewDataset). Я боровся з цим пару тижнів. Тепер я просто дізнався, що в gesim є функція, яка може допомогти мені ініціалізувати ваги моєї моделі заздалегідь підготовленими модельними вагами. Про це йдеться нижче:

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.

Я не знаю, ця функція може робити те саме чи ні. Будь ласка, допоможіть!!!


Чи однаковий словниковий запас моделей?
Хіма Варша

Чому б не ініціювати кожен параметр word2vec з випадковими згенерованими числами для кожного запуску? Я міг би це зробити і при ретельному підборі випадкових чисел для кожного параметра (numFeatures, contextWindow, seed) я зміг отримати випадкові кортежі подібності, які я хотів використовувати для моєї справи. Моделювання ансамблевої архітектури. Що думають про це інші? Будь ласка, відповідь.
zorze

Спасибі за вашу допомогу. Мені це дуже допомагає
фром

Відповіді:


18

Дякую Абхішеку. Я це зрозумів! Ось мої експерименти.

1). ми наводимо простий приклад:

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

введіть тут опис зображення

З наведених сюжетів ми бачимо, що легкі речення не можуть відрізнити значення різних слів за відстані.

2). Завантажте заздалегідь підготовлене слово:

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

введіть тут опис зображення

З наведеної цифри ми бачимо, що вкладення слів мають більше значення.
Сподіваюся, що ця відповідь буде корисною.


1
ця відповідь є досить інформативною та корисною для вбудовування моделі у файл vec.
Акаш Кандпал

@ harrypotter0 Thx!
Шисян Ван

акуратний і чіткий товариш !!!
vijay athithya

Коли я намагався використати це, я перевірив його з двома однаковими наборами даних. Результати для кожної моделі були різними. Я сподівався, що оскільки я розпочну з тими ж ініціалізованими вагами, то моделі будуть такими ж. Як це не так?
Ерік Вінер

1
@EricWiener Оскільки навіть якщо набори даних тренувань однакові, слова векторів для кожного тренінгу є випадковими. Слова векторних просторів, обчислені одним і тим же набором даних, повинні бути схожими, а продуктивність, що використовується в завданнях NLP, також повинна бути схожою.
Shixiang Wan

4

Давайте подивимось на зразок коду:

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

Отже, ми спостерігаємо, що модель1 скидається моделлю2, і отже, слова "третій" і "речення" є в їхній лексиці, зрештою, надаючи схожість. Це основне використання, ви також можете перевірити reset_weights (), щоб скинути ваги до нетренованого / початкового стану.


2

Якщо ви шукаєте заздалегідь підготовлену мережу для введення слів, я б запропонував GloVe. Наступний блог від Keras дуже інформативний, як це втілити. Він також має посилання на попередньо підготовлені вкладення GloVe. Існують заздалегідь підготовлені вектори слів, що починаються від 50-мірного вектора до 300-мірних векторів. Вони були створені на даних Вікіпедії, Загальних даних про сканування або на даних Twitter. Завантажити їх можна тут: http://nlp.stanford.edu/projects/glove/ . Додатково слід ознайомитись із блогом кераса щодо того, як їх реалізувати. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.