在线训练如何使用 Genism 在 Word2vec 模型中工作

问题描述

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

解决方法

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

并且在某种程度上,新数据可能更小,其单词用法更加特殊,新数据中的任何单词都将被训练为仅与新数据中正在训练的其他单词保持一致。 (根据新数据的大小,以及像 alphaepochs 这样选择的训练参数,它们可能会通过新示例被拉离它们的旧位置任意远 - 因此开始失去与之前训练过的词。)

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

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

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

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