Parameters 如何使用相同的参数更新gensim中经过训练的Word2vec模型

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的培训。所以,现在我想加载并继

我在更新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.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