【问题标题】:Gensim Word2vec model is not updating the previous word's embedding weights during increased trainingGensim Word2vec 模型在增加训练期间不会更新前一个单词的嵌入权重
【发布时间】:2020-09-07 14:26:29
【问题描述】:

我想以一种增强的方式训练一个先前训练过的 word2vec 模型,如果在之前的训练过程中看到过这个词,则更新这个词的权重,并创建和更新在之前的训练过程中没有看到过的新词的权重之前的训练过程。例如:

from gensim.models import Word2Vec
# old corpus
corpus = [["0", "1", "2", "3"], ["2", "3", "1"]]
# first train on old corpus
model = Word2Vec(sentences=corpus, size=2, min_count=0, window=2)
# checkout the embedding weights for word "1"
print(model["1"])

# here comes a new corpus with new word "4" and "5"
newCorpus = [["4", "1", "2", "3"], ["1", "5", "2"]]

# update the previous trained model
model.build_vocab(newCorpus, update=True)
model.train(newCorpus, total_examples=model.corpus_count, epochs=1)

# check if new word has embedding weights:
print(model["4"])  # yes

# check if previous word's embedding weights are updated
print(model["1"])  # output the same as before

似乎前一个词的嵌入没有更新,即使前一个词的上下文在新语料库中发生了变化。有人可以告诉我如何更新以前的嵌入权重吗?

【问题讨论】:

    标签: python nlp gensim word2vec


    【解决方案1】:

    原始问题的答案

    尝试在前后打印它们(或者甚至只是几个前导尺寸,例如print(model['1'][:5])),看看它们是否发生了变化。

    或者,在开始时,将preEmbed 制作为值的正确副本(例如:preEmbed = model['1'].copy())。

    我想你会看到价值观确实发生了变化。

    您当前的preEmbed 变量将只是数组的一个视图,它会随着基础数组而变化,因此将始终返回Trues 以供您以后检查。

    查看Numpy Copies & Views 上的文章将有助于通过更多示例来解释正在发生的事情。

    更新代码的答案

    很可能在您随后的单周期训练中,'1' 的所有示例都将通过sample 下采样功能被跳过,因为'1' 在您的小语料库中是一个非常常见的词:占所有的 28.6%字。 (在现实的自然语言语料库中,最常用的词不会超过所有词的百分之几。)

    我怀疑如果你用sample=0 禁用这个下采样功能,你会看到你期望的变化。

    (请注意,此功能对于足够的训练数据确实很有帮助,更一般地说,很多关于 Word2Vec 和相关算法的事情,尤其是它们的核心优势,需要大量不同的数据——而且效果不佳,或使用玩具大小的数据集以预期的方式运行。)

    另请注意:您的第二个 .train() 应使用明确准确的 newCorpus 计数。 (当您提供额外数据时,使用total_examples=model.corpus_count 重新使用缓存的语料库计数可能并不总是合适的,即使它在这里工作正常。)

    另一件需要注意的事情:一旦你开始使用一个模型来进行更复杂的操作,比如.most_similar(),它就会缓存一些计算数据用于向量到向量的比较,而且这些数据并不总是(在至少通过gensim-3.8.3) 接受更多培训。因此,您可能必须丢弃该数据(model.wv.vectors_norm = Nonegensim-3.8.3 中)以确保获得新的单位范数向量或新的most_similar()(及相关方法)结果。

    【讨论】:

    • 是的,与视图进行比较是我的错误。但我更改了示例代码以仅在print(model['a']) 之间进行比较。它们还是一样的。
    • 查看更新的答案以获得更多可能解释您所看到内容的想法。
    • 更新后的答案完全解决了我的困惑,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2017-09-21
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多