Gensim word2vec 训练不会在批处理结束时回调

Gensim word2vec training doesn't callback on batch end

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

到运行样本,让corpus_filepath指向一个由未标点符号的句子分隔的文件(给定一行的句子中的单词应该space分隔)。您可能还需要在 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

我做错了什么?

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

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

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

所以我建议调整您的代码以使用其他方法 – 也许是 on_epoch 回调? - 反而。您想在这样的 frequent/simultaneous 工作线程回调中执行什么操作?