Parameters 如何使用相同的参数更新gensim中经过训练的Word2vec模型
我在更新gensim的模型时遇到了一些麻烦。我使用以下命令创建模型Parameters 如何使用相同的参数更新gensim中经过训练的Word2vec模型,parameters,gensim,word2vec,Parameters,Gensim,Word2vec,我在更新gensim的模型时遇到了一些麻烦。我使用以下命令创建模型 model=gensim.models.Word2Vec(句子,大小=100,窗口=20,最小计数=10,工人=24,iter=200,回调=[epoch\u saver]) 为了保存模型,我使用了: model.save(type+“/”+“word2vec”+name+“+”type+“+版本) 就我所记得的,当训练一个模型时,第一步是创建一个vocab。无论如何,我不得不停止对iter=147的培训。所以,现在我想加载并继
model=gensim.models.Word2Vec(句子,大小=100,窗口=20,最小计数=10,工人=24,iter=200,回调=[epoch\u saver])
为了保存模型,我使用了:
model.save(type+“/”+“word2vec”+name+“+”type+“+版本)
就我所记得的,当训练一个模型时,第一步是创建一个vocab。无论如何,我不得不停止对iter=147的培训。所以,现在我想加载并继续训练。这是我加载模型的方式:
model=gensim.models.Word2Vec.load(“encoded\u op\u op/temporary\u model/Word2Vec.model”)
但如何使用train()方法继续更新?我正在努力:
model=model.train(句子,epoch=53,回调=[epoch\u saver])
但它给出了一个错误:
您必须指定total_示例或total_单词,以获得正确的作业参数更新和进度
计算。通常的值是total\u examples=model.corpus\u count
无论如何,在哪里可以定义创建模型时使用的相同参数:size=100、window=20、min\u count=10、workers=24。好啊我相信规模已经确定了。但是工人呢
通过在最初的实例化调用中直接提供
语句,您提前感谢了,您实际上要求一个调用也使用这些语句自动执行build_vocab()
&train()
步骤
虽然您总是可以向模型发送更多的培训示例,但这不是通常预期的操作,因此需要谨慎/专业知识才能正确操作,并且可能会打破SGD培训优化的一些常见假设。这尤其是在前一次运行可能在计划的训练期间计数中断的情况下。
模型中包含您的原始参数,以及来自初始词汇表调查的一些缓存值(如workers
等)。但是,当您自己调用train()
时,需要明确说明您发送了多少数据,因此会出现错误
您可以非常简单地通过提供它所请求的内容来避免错误——使用模型中缓存的值。例如(由于以下原因,请不要这样做):
model.train(句子,epoch=53,回调=[epoch\u saver],
总数(示例=模型、语料库数量)
(注意:您也不想将返回值(只是一些统计信息)分配到模型中,否则您将失去对实际模型的引用。)
这提供了错误请求的内容&从而防止了异常——但仍然没有做正确的事情
这是因为最初的训练是正常线性学习率衰减过程的147/200,从0.025
的开始alpha
到其结束min_alpha
值。但是,如果您只运行上述代码,您将以0.025
的速度重新启动学习,这与最初的培训继续进行时会发生的情况完全不同
相反,要使内部学习率大致恢复到147世纪中期的训练水平,您可以使用可选参数train()
,start\u alpha
,如下所示:
model.train(model.train(sentences, epochs=53, callbacks=[epoch_saver],
total_examples=model.corpus_count,
start_alpha=(model.min_alpha + (53/200 * (model.alpha - model.min_alpha)))
然后,如果最初的训练达到了最后53个阶段,你将非常接近于会发生什么
但是,一般来说,您应该从头开始重新开始培训。它更简单,更不容易出错
但是,如果事实上这是如此耗时,你觉得你需要从部分训练中恢复,那么你使用这么多的训练时间是很奇怪的。如果有足够的大数据(可能需要数小时才能运行),更典型的iter
值将是5
(默认值)到10
或20
只有当数据非常小/很薄时,才会出现较大的值。尽管word2vec不能在如此小的数据上工作,但您可以通过更多的训练周期获得部分合理的结果。但是,总的训练时间不太可能太长,你必须做如此复杂的部分恢复工作
另外:使用提供纯Python序列作为语料库的语句
参数,workers=24
可能无法获得很好的吞吐量和CPU核心利用率。实现在线程之间传递数据的方式中存在一些瓶颈,加上Python全局解释器锁(GIL)的限制,这意味着线程之间经常会相互阻塞,无法取得良好的进展
通常,即使您的机器有16个、32个、64个或更多的内核,该路径最多也只有大约8-12个工作线程才能达到最大吞吐量。(您将获得最好的吞吐量是确保您的语句
尽可能简单,要么是内存中已标记化的列表,要么是从磁盘简单读取空格分隔的标记,但不要重复正则表达式预处理/标记化。)
如果您可以将语料库写入一个文件,每个句子都在一行上,所有标记都被一个空格预分割,那么您可以使用较新的corpus_file
选项指定该文件,然后许多worker
到您机器中的实际内核数都将执行自己的非阻塞工作,实现更高的吞吐量/CPU利用率。以下是gensim在vocab_build之后的输出:从3519706628个原始单词和56707个句子的语料库中收集了264475612个单词类型
这够大吗?真正的测试是:您是否从更少的年代中获得足够/稳定的结果
,或者增加训练通行证会导致明显的i