【问题标题】:Gensim word2vec training doesn't callback on batch endGensim word2vec 训练不会在批处理结束时回调
【发布时间】:2021-01-19 02:38:55
【问题描述】:

我有兴趣在 Gensim word2vec 模型上放置一个回调,以在每批之后触发一些函数。根据documentation,可以在批处理结束或纪元结束时放置回调。但是,如下面的 MVE 所示,实际上只触发了 epoch 回调。

要运行示例,让corpus_filepath 指向一个由不带标点的句子组成的行分隔文件(给定一行的句子中的单词应该用空格分隔)。您可能还需要在 Word2Vec 实例化中更改 workers

from gensim.models import Word2Vec
from gensim.models.callbacks import CallbackAny2Vec

corpus_filepath = 'train.txt'
out_filepath = 'out.txt'

class MyCallback(CallbackAny2Vec):
    def __init__(self):
        pass

    def on_batch_end(self, model):
        print('batch end')

    def on_epoch_end(self, model):
        print('epoch end')


callback = MyCallback()
model = Word2Vec(size=300, window=5, min_count=0, workers=64)
print('Making vocabulary...')
model.build_vocab(corpus_file=corpus_filepath)
print('Beginning training...')
model.train(corpus_file=corpus_filepath, epochs=5, total_words=model.corpus_total_words, callbacks=[callback])

输出不正确(缺少批量打印输出):

Making vocabulary...
Beginning training...
epoch end
epoch end
epoch end
epoch end
epoch end

我做错了什么?

【问题讨论】:

    标签: python machine-learning gensim word2vec


    【解决方案1】:

    查看代码,Gensim 似乎没有在您使用的corpus_file 模式下实现on_batch_beginon_batch_end 回调。

    因此,您可以尝试更改为传统的语料库可迭代模式以查看回调触发。 (无论有多少 CPU 内核可用,该模式下的总体训练吞吐量往往会在大约 8-12 个工作人员时达到最大值。)

    但是,还要注意,即使在那里,每批回调在多个线程中的任意时间运行 - 在这些回调中尝试很多事情是不明智/不安全的。例如,尝试保存模型可能会导致错误或其他文件损坏,甚至纯粹的信息输出也可能来自多个线程或反映不一致的变化状态。见Gensim's open bug report #2181 for more details。由于在即将发布的版本中存在这种风险,on_batch 回调可能会被完全删除。

    所以我建议调整您的代码以使用其他方法——也许是on_epoch 回调? - 反而。在如此频繁/同时的工作线程回调中,你想做什么操作?

    【讨论】:

    • 感谢您的深入回复!我有兴趣在一个研究项目中使用 Gensim 词向量,在该项目中插入对次要任务的培训很重要,并穿插对主要目标的培训。如果能够以比 epoch 更小的粒度做到这一点,那就太好了。你有什么建议吗? Gensim 是我们当前的目标训练架构,因为使用足够多的线程进行训练非常快。
    • 您也许可以在每个标准时期结束时交错替代目标的完整时期,或者扩展 Gensim 源以在每批甚至每个微示例中应用您的替代目标。我建议在预发布版 gensim-4.0.0beta 或 github 项目 develop 分支源上构建任何扩展。 (扩展/更改最棘手的部分是基本的 cython 优化代码,它在内存/线程方面相当脆弱,并且依赖于显式 cython-to-c(pp) 然后 c(pp) 编译。 )
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2021-10-22
    相关资源
    最近更新 更多