2012-12-22 161 views
0

我目前在机器学习算法工作,我注意到,当我用Matlab的fminunc算法收敛到全局最小速度非常快(几个迭代)比较时,我手动更新参数:fminunc如何在梯度下降中优化学习速率(步长比例)值?

thetas[j] = thetas[j] - (alpha*gradient)/sampleNum;

我认为这是因为我天真地认为alpha(步数比例)是恒定的。

那么,如何在C中实现类似fminunc的东西呢?

我试图从一个大的alpha开始,并调整它,如果当前成本变得比以前的成本更大。这个问题出现在最小化函数的形状不是线性的时候,因为alpha最初可以得到一个非常小的值,并且当函数形状趋向于“平坦”时不能返回到更大的值(并且可以采取更大的步骤)。

+1

Matlab的'fminunc'不使用梯度下降。它使用准牛顿方法,无论您如何控制步长,速度都可以快得多。 – 3lectrologos

+0

@ 3lectrologos感谢您的洞察力。这可以解释为什么当使用'fminunc'时为二次函数取得非常好的结果。所以,也许我应该尝试使用不同的方法,而不是改进我的“猜测”。根据您的经验,使用准牛顿方法与梯度下降相比有任何缺点(除了可能难以实现) –

+0

我可能不是合适的人来回答这个问题,但我认为在Newton-如果您尝试从头开始实现它们(例如数字问题),那么这些方法可能有点棘手。在性能方面,我不知道喜欢渐变下降的原因,除非你的问题非常大(见随机梯度下降)。 – 3lectrologos

回答

3

Matlab的fminunc实际上并未使用梯度下降,而牛顿等的方法(BFGS-based quasi-Newton or trust-region根据问题的大小),这是一般比梯度下降显著更快,无论你如何选择步长。

也许你应该看看这种方法,如果你想更快的收敛。