gensim - 更新word2vec模型是否需要混合旧语料库和新语料库?
问题描述
我发现它在使用中并不明确
from gensim.models import Word2Vec
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
model = Word2Vec(min_count=1)
model.build_vocab(sentences) # prepare the model vocabulary
model.train(sentences, total_examples=model.corpus_count, epochs=model.iter) # train word vectors
(1, 30)
句子是否应该包含旧语料库?
解决方案
您的代码没有显示使用新示例对旧模型进行任何增量更新。
但是,它永远不能保证增量更新(与build_vocab(new_sentences, update=True)
then一样train(new_sentences, ...)
)必然会改善模型的整体性能。
底层算法的优势来自一个大型数据集,其中包含细微变化的使用示例,并以交错的方式一起训练。对比示例以各种方式“拉动”模型,有时相互加强,有时相互抵消,最终形成对其他目的有用的词向量排列。
假设您随后使用与原始训练数据不同的文本进行增量更新。(毕竟,它们必须是有意义的不同,否则你不会费心进行更多的训练。)在新的训练期间,只有受新的(可能更小的)数据集影响的单词发生了变化。他们正在改变只是为了更好地处理新的文本示例。任何仅出现在早期数据中的词(或词义)都不会被更新……因此,新的训练不可避免地会将当前词从与联合训练后存在的旧词的平衡关系中拉出来。
在某些神经网络模型的极端情况下,这种新数据训练会导致“灾难性干扰”,使网络在它曾经知道的事情上变得更糟。
如果词汇有很好的重叠,或者选择了正确的再训练水平和学习率的平衡,它可能仍然可以工作......但是没有硬性的规则来选择参数/过程确保这种“调整”有效。您必须自己监控质量并进行优化。
当重要的新数据到来时,最安全、最稳健的方法是使用所有可用数据从头开始重新训练模型——丢弃旧模型(因为新模型中的坐标不一定与旧坐标可比)。可能的情况是,使用旧模型中的向量/权重启动这个新模型可能会比从头开始更快地达到质量/稳定性——但仍然不能保证坐标兼容性,或者必然可以安全地省略任何较旧的数据。
推荐阅读
- string - 此字符串解压缩的最佳算法
- node.js - Microsoft Teams botbuilder 如何在另一个频道中创建对话
- javascript - SocketIO & ReactJs:Socket Emitting 多次
- java - 即使所有值都保存在数组中,为什么我的 find 方法在这里不起作用?
- flutter - 在 Flutter 中重新发送 OTP 代码 Firebase 电话身份验证
- postgresql - Postgresql 服务器不断更改密码
- java - 我想从数据库 JAVA Jframe 中显示用户名
- css - 如何仅使用 CSS 将自动生成的 HTML 表格居中对齐?
- c++ - c++中“fstream”的一次和两次打开有什么区别(在第一种情况下输入不起作用)?
- javascript - 如何使用点击事件导航到另一个页面