【问题标题】:How did online training work in the Word2vec model using Genism在线培训如何在使用 Gensim 的 Word2vec 模型中发挥作用
【发布时间】:2021-05-28 01:40:03
【问题描述】:

使用 Genism 库,我们可以在添加新句子时加载模型并更新词汇表。这意味着如果您保存模型,您以后可以继续训练它。我检查了样本数据,假设我的词汇表中有一个以前训练过的词(即“女性”)。在那之后,假设我有新句子并使用 model.build_vocab(new_sentence, update=True) 和 model.train(new_sentence),模型被更新。现在,在我的 new_sentence 中,我有一些在前一个词汇表中已经存在的单词(“women”),还有一些在前一个词汇表中不存在的新词(“girl”)。更新词汇后,我的语料库中既有旧词又有新词。我使用 model.wv['women'] 检查,向量在更新和训练新句子后更新。此外,获取一个新词的词嵌入向量,即 model.wv['girl']。之前训练过但不在 new_sentence 中的所有其他词,这些词向量没有改变。

model = Word2Vec(old_sentences, vector_size=100,window=5, min_count=1) 
model.save("word2vec.model")
model = Word2Vec.load("word2vec.model") //load previously save model 
model.build_vocab(new_sentences,update=True,total_examples=model.corpus_count, epochs=model.epochs)   
model.train(new_sentences)

但是,只是不了解在线培训如何运作的深入解释。请让我知道是否有人知道详细信息。我得到了代码,但想了解在线培训在理论上是如何工作的。是否从头开始根据新旧训练数据重新训练模型?

这是我关注的链接:Online training

【问题讨论】:

    标签: python-3.x nlp word2vec word-embedding


    【解决方案1】:

    当您对.train() 执行新调用时,它只会对新数据进行训练。所以只有新数据中的单词可能会被更新。

    如果新数据可能更小,并且在其单词使用方面更特殊,新数据中的任何单词都将被训练为仅与新数据中正在训练的其他单词保持一致。 (根据新数据的大小,以及像alphaepochs 这样选择的训练参数,它们可能会被新示例任意拉离其旧位置 - 因此开始失去与训练过的单词的可比性更早。)

    (另请注意,当提供与原始语料不同的语料库时,您不应使用 total_examples=model.corpus_count 之类的参数,而应重用 model.corpus_count,这是模型中从早期数据中提取的值。相反,参数应该描述当前批次的数据。)

    坦率地说,我不喜欢这个功能。它可能对高级用户有用。但大多数被它吸引的人可能会误用它,期望任何数量的微小增量更新来不断扩展和改进模型 - 当没有很好的支持时,这种想法会在幼稚的使用中可靠地发生。

    事实上,有理由怀疑此类更新通常是一个好主意。神经网络的增量更新破坏其先前性能的风险甚至有一个既定术语:catastrophic forgetting

    为新的扩展数据更新词向量的直接且最可靠的方法是从头开始重新训练,因此所有词都处于平等地位,并在相同的统一优化(SGD)上进行相同的交错训练) 日程。 (这样一个过程结束时的新向量将不在兼容的坐标空间中,但应该等效有用,或者如果数据现在更大更好,则更好。)

    【讨论】:

    • 感谢您的回答。我没有选择Alpha,在genism网站上建议不要自己选择Alpha。有人提到,“只有在多次调用 train() 时才使用,当您想自己管理 alpha 学习率时(不推荐)”。我不确定多次调用 train() 是什么意思。还有关于 total_examples=model.corpus_count,你是对的。我用我的数据集进行了测试,每次通过用 new_sentences 重新训练模型,以前出现在词汇表中的词,词向量都会改变。
    • 使用这种方法,当您对old_sentence 进行初始训练时,您实际上是第一次调用train(),使用默认的alpha/epochs - 到目前为止,一切都很好.然后当再次调用train() 时,在新数据上,您(隐式)选择再次使用默认的alphaepochs - 这可能不再是一个好主意,也可能不再是一个新的子集数据,可能小于原始数据。幕后发生的标准优化,SGD,通常假设一个会话,对所有数据,逐渐衰减alpha 学习率。
    • 当您然后重复 SGD 过程时,但现在有一些重叠的数据和一些词(已经针对旧数据/共现词进行了优化并与之保持平衡)是在已经以低 alpha 运行之后,现在再次以高 alpha 获得新的训练更新,您现在处于即兴混合领域。它可能仍然有帮助!但它不再像“一个会话”标准方法那样明显平衡,有些单词会获得几个完整的高 alpha 到低 alpha 会话,其中包含不同的数据子集,而其他单词只获得一个关于很久以前看到的数据的会话。
    • 因此,可能出错的事情的数量更多,并且必须通过高级理解做出的非默认选择的数量增加,并且需要仔细检查结果是否可能变得更糟变得更强大 - 通常是一组风险更高的步骤。
    • 我明白了。我在这里关注您的评论:stackoverflow.com/questions/51135118/…。冻结已经训练过的单词对我来说是一个解决方案。但是,此功能尚未实现。我正在考虑分叉存储库并更新文件。虽然我完全处于黑暗中,但当我查看 word2vec.py 文件时。 self.wv.vectors_lockf = np.ones(1, dtype=REAL),如何为我想冻结的某个单词设置 0.0。请建议我如何解决这个问题。
    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多