如果 alpha 正在减少,如何通过回调检查? + 如何在训练期间加载所有核心?

How to check via callbacks if alpha is decreasing? + How to load all cores during training?

我正在训练 doc2vec,并使用回调尝试使用以下代码查看 alpha 是否随着训练时间的推移而减少:

class EpochSaver(CallbackAny2Vec):
'''Callback to save model after each epoch.'''

    def __init__(self, path_prefix):
        self.path_prefix = path_prefix
        self.epoch = 0

        os.makedirs(self.path_prefix, exist_ok=True)

    def on_epoch_end(self, model):
        savepath = get_tmpfile(
            '{}_epoch{}.model'.format(self.path_prefix, self.epoch)
        )
        model.save(savepath)
        print(
            "Model alpha: {}".format(model.alpha), 
            "Model min_alpha: {}".format(model.min_alpha),
            "Epoch saved: {}".format(self.epoch + 1),
            "Start next epoch"
        )
        self.epoch += 1


def train():

    workers = multiprocessing.cpu_count()*4
    model = Doc2Vec(
        DocIter(),
        vec_size=600, alpha=0.03, min_alpha=0.00025, epochs=20,
        min_count=10, dm=1, hs=1, negative=0, workers=workers,
        callbacks=[EpochSaver("./checkpoints")]
    )
    print(
        "HS", model.hs, "Negative", model.negative, "Epochs", 
         model.epochs, "Workers: ", model.workers, "Model alpha: 
         {}".format(model.alpha)
    )  

在训练过程中,我发现 alpha 并没有随着时间的推移而改变。在每次回调中,我看到 alpha = 0.03.
是否可以检查 alpha 是否在减少?或者它真的在训练期间根本没有减少?

还有一个问题: 我如何在训练 doc2vec 时从所有核心中获益?

正如我们所见,每个核心的负载不超过 +-30%。

model.alpha 属性 仅保留初始配置的起始-alpha – 它不会通过训练更新为有效学习率。

因此,即使该值被适当地减少(我希望它是),您也不会在您添加的日志记录中看到它。

对您的代码的单独观察:

  • 在至少到 3.5.0 的 gensim 版本中,最大训练吞吐量最常达到 workers 的某个值介于 3 和核心数量之间——但通常不是全部数量内核数(如果它高于 12 个)或更大。所以 workers=multiprocessing.cpu_count()*4 可能会比你用较小的数字所能达到的要慢得多。

  • 如果你的语料库足够大以支持 600 维向量,并且丢弃少于 min_count=10 个例子的单词,负采样可能会更快 andhs 模式得到更好的结果。 (已发表作品中的模式似乎更喜欢使用较大的语料库进行负采样。)