如何使用预先训练的模型权重初始化新的word2vec模型?


14

我在python中使用Gensim库来使用和训练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.

我不知道此功能可以做同样的事情。请帮忙!!!


模型的词汇是否相同?
Hima Varsha

为什么不使用每次运行随机生成的数字来初始化每个word2vec参数?我可以做到这一点,并且通过仔细选择每个参数(numFeatures,contextWindow,seed)的随机数,我能够获得我的用例想要的随机相似元组。模拟整体架构。别人怎么看?请回复。
zorze

谢谢你的帮助。它帮助了我很多
frhyme

Answers:


18

感谢Abhishek。我知道了!这是我的实验。

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文件中。
Akash Kandpal,

@ harrypotter0谢谢!
Shixiang Wan

干净整洁的伴侣!!!
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

因此,我们观察到model1正在被model2重置,因此单词“ third”和“ sentence”在其词汇表中最终具有相似性。这是基本用法,您也可以检查reset_weights()以将权重重置为未训练/初始状态。


2

如果您正在寻找用于词嵌入的预训练网络,我建议您使用GloVe。以下来自Keras的博客非常指导如何实现此目的。它还具有到预先训练的GloVe嵌入的链接。存在从50维向量到300维向量的预训练词向量。它们建立在Wikipedia,Common Crawl Data或Twitter数据上。您可以在此处下载它们:http : //nlp.stanford.edu/projects/glove/。此外,您应该查看有关如何实施keras博客的信息。https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.