Scikit学习中SGDClassifier中最佳学习率的公式

时间:2018-09-30 11:07:18

标签: python scikit-learn gradient-descent

在同一功能SGDClassifier in Scikit-learn的原始C ++源代码中,当learning_rate='optimal'时,找不到https://leon.bottou.org/projects/sgd的学习率公式。

SGDClassifier in Scikit-learn中提到了该公式:

foo+bar

此正确的公式是否已在原始SGDClassifier代码中使用,或者移植到Scikit-learn时是否发生了变化? 另外,t0到底代表什么(在文档中只提到它是通过启发式方法确定的)?

1 个答案:

答案 0 :(得分:2)

让我们遍历源代码和公式。

Sklearn声明以下公式:eta = 1/(alpha* (t+t_0))。在Leon Bottou的网站上,我们找到表达式eta = eta_0 / (1 + lambda eta_0 t)

让我们稍微重写后面的公式:

eta = eta_0 / (1 + lambda eta_0 t)
    = 1 / ( 1/eta_0 + lambda t )
    = 1 / ( lambda * ( 1/eta_0 *  1/lambda  + t)).

如果现在sklearn的lambda = alphat_01/(eta_0*alpha)相同,则公式相同。现在让我们看一下源代码:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/sgd_fast.pyx#L657

在657行中,我们看到了optimal_init = 1.0 / (initial_eta0 * alpha)optimal_init变量只是t_0与公式中不同的名称,如我们在679行中看到的:eta = 1.0 / (alpha * (optimal_init + t - 1))

因此,公式相同。