在同一功能SGDClassifier in Scikit-learn的原始C ++源代码中,当learning_rate='optimal'
时,找不到https://leon.bottou.org/projects/sgd的学习率公式。
SGDClassifier in Scikit-learn中提到了该公式:
此正确的公式是否已在原始SGDClassifier
代码中使用,或者移植到Scikit-learn
时是否发生了变化?
另外,t0到底代表什么(在文档中只提到它是通过启发式方法确定的)?
答案 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 = alpha
和t_0
与1/(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))
。
因此,公式相同。