【问题标题】:Sklearn SGDClassifier minibatch-learning and learning rate scheduleSklearn SGDClassifier minibatch-learning and learning rate schedule
【发布时间】:2013-09-25 20:17:00
【问题描述】:

当我使用 partial_fit 方法训练 SGDClassifier 时,我正在尝试拼凑它如何选择学习率。

即,我的主要学习循环如下所示:

from sklearn.linear_model import SGDClassifier
m = SGDClassifier(n_iter=1, alpha=0.01)
n_iter = 40
t0 = time.time()
for i in range(n_iter):
    for fname in files:
        X, y = load_next_batch(fname)
        m.partial_fit(X, y, classes = [0, 1])
    print "%d:  valid-error: %f  (time: %fs)" % (i, 1.0-m.score(Xvalid, yvalid), time.time() - t0)

现在,由于我对整个训练集进行了 40 次传递,因此我想随着时间的推移调整我的学习率。如果我使用fit 而不是部分拟合,我的理解是这会自动发生(除非我修改learning_rate 参数)。

但是,我不清楚在使用部分拟合时会发生这种情况。略读代码也无济于事。谁能澄清我如何才能达到退火学习率 在我的设置中?

【问题讨论】:

    标签: scikit-learn gradient-descent


    【解决方案1】:

    fit 在内部使用partial_fit,因此learning rate configuration parameters 适用于fitpartial_fit。默认的退火计划是eta0 / sqrt(t)eta0 = 0.01

    编辑:这是不正确的,正如在 cmets 中看到的,SGDClassifier 的实际默认时间表是:

    1.0 / (t + t0) 其中t0 是启发式设置的,t 是过去看到的样本数。

    【讨论】:

    • 感谢您的回答。但是我注意到 eta0 默认设置为 0(即使文档说明它是 0.01)并且在整个过程中保持不变。所以我猜测 SGDClassifier 以某种方式在内部通过其他方式跟踪学习率.....如果我想知道在我的训练集进行 20 次循环后的学习率是多少,有什么方法可以让我查询?
    • 文档不是最新的...在source code 中,您可以看到SGDClassifier 默认学习率计划称为“最佳”1.0/(t+t0),其中设置了t0来自数据;在这种情况下不使用eta0。即使对于“invscaling”计划,eta0 也永远不会更新:这不是实际的学习率,而只是传递初始值的一种方式。在这两种情况下,时间表的进度都可以在属性model.t_ 中找到,该属性给出了过去看到的样本数。
    • 我明白了,感谢您的澄清,我之前无法理解代码:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2014-04-29
    相关资源
    最近更新 更多