首页 > 解决方案 > 如何使用预训练嵌入到 gensim skipgram 模型?

问题描述

我想先训练部分语料库,然后基于整个语料库的嵌入训练。我可以用 gensim skipgram 实现这一点吗?

我还没有找到可以传递初始嵌入的 API。

我想要的是一些东西

from gensim.models import Word2Vec
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"],
             ["cat2", "say2", "meow"], ["dog2", "say", "woof"]]
model = Word2Vec(sentences[:2], min_count=1)
X = #construct a new one
model = Word2Vec(sentences, min_count=1, initial_embedding=X)

标签: pythonmachine-learninggensimword2vec

解决方案


我不确定您为什么要这样做:如果您拥有整个语料库,并且可以在整个语料库上进行训练,那么您可能会从整体语料库训练中获得最佳结果。

而且,在第二语料库中缺少任何内容的情况下,第二语料库训练将倾向于将仍在训练的单词的向量从语料库中不再存在的单词中拉出——导致语料库中向量的可比性衰减。(这只是示例之间交错的拔河比赛,包括所有将它们推到彼此有意义相关的位置的单词。)

但是,请记住这一点:您可以继续train()使用新数据建立模型。那是:

# initialize & do all default training
model = Word2Vec(sentences[:2], min_count=1)
# now train again even more with a slightly different mix
model.train(sentences, total_examples = len(sentences), epochs=model.epochs)

请注意,在这种情况下,模型发现的词汇表仅基于原始初始化。如果只有 中的单词sentences[0],当这些句子被呈现给在初始化期间没有看到这些单词的模型时,它们将被忽略——并且永远不会得到向量。(如果以这种方式使用您的小型示例语料库,“猫”这个词将不会得到向量。同样,您真的想在最大的语料库上进行训练——或者至少使用最大的语料库,带有单词的超集,1st .)

此外,还会记录一个警告,因为第二次训练将再次alpha以较大的起始值启动内部学习率,然后逐渐降低到最终min_alpha值。像这样的值不是标准的 SGD,通常表示用户错误。但是,根据你的目标,这可能是可以忍受的——你只需要注意当你在做这样不寻常的训练序列时,你在实验/先进的领域,必须通过你自己的理解来处理可能的副作用.


推荐阅读