【问题标题】:The formula for the optimal learning rate in the SGDClassifier in Scikit-learnScikit-learn 中 SGDClassifier 中最优学习率的公式
【发布时间】:2019-03-05 17:57:43
【问题描述】:

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

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

这个公式是在原始SGDClassifier 代码中使用的,还是在移植到Scikit-learn 时发生了变化? 还有 t0 究竟代表什么(在文档中只提到它是用启发式方法确定的)?

【问题讨论】:

  • 这是正确的公式。您可以在source code 中找到它以及初始 t 值。
  • @Scratch'N'Purr 你能指出源代码中的那一行吗? Line679 看起来略有不同。

标签: python scikit-learn gradient-descent


【解决方案1】:

让我们来看看源代码和公式。

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)).

如果现在 lambda = alpha 和来自 sklearn 的 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))。

因此,公式是相同的。

【讨论】:

  • 有道理,非常感谢。不过,我想知道为什么 eta = 1.0 / (alpha * (optimal_init + t - 1)) 中有 -1。如果我没记错的话,从源代码中观察到的另一个想法是,t0 = 1/(eta_0*alpha) 仅依赖于alpha,因为eta0 本身依赖于alpha。
  • t-1 部分可能是 t 的计数和初始化。我没有比较 python 和 c++ 的初始化,但可能存在+-1 的差异。 t_0 的值取决于alpha,因为它是由它缩放的。否则初始学习率是相同的。公式只是稍微重写,因此初始学习率看起来略有不同。
  • 最后一个问题,t_0 究竟代表什么(我正在寻找一个术语)?我知道在学习率的公式中设置时间步长t 可以每次都减少后者。上面公式中使用t_0主要是为了调节每次迭代学习率降低多少?
  • 您可以将其称为“反向的、缩放的初始学习率”。 t_0越大,初始学习率越小。
猜你喜欢
  • 2017-11-26
  • 2016-03-12
  • 2016-08-11
  • 2016-06-18
  • 2015-12-19
  • 1970-01-01
  • 2020-11-15
  • 2019-02-06
  • 2018-08-03
相关资源
最近更新 更多