如果 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
个例子的单词,负采样可能会更快 and 比 hs
模式得到更好的结果。 (已发表作品中的模式似乎更喜欢使用较大的语料库进行负采样。)
我正在训练 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
个例子的单词,负采样可能会更快 and 比hs
模式得到更好的结果。 (已发表作品中的模式似乎更喜欢使用较大的语料库进行负采样。)