0
我目前在机器学习算法工作,我注意到,当我用Matlab的fminunc
算法收敛到全局最小速度非常快(几个迭代)比较时,我手动更新参数:fminunc如何在梯度下降中优化学习速率(步长比例)值?
thetas[j] = thetas[j] - (alpha*gradient)/sampleNum;
我认为这是因为我天真地认为alpha
(步数比例)是恒定的。
那么,如何在C中实现类似fminunc
的东西呢?
我试图从一个大的alpha
开始,并调整它,如果当前成本变得比以前的成本更大。这个问题出现在最小化函数的形状不是线性的时候,因为alpha
最初可以得到一个非常小的值,并且当函数形状趋向于“平坦”时不能返回到更大的值(并且可以采取更大的步骤)。
Matlab的'fminunc'不使用梯度下降。它使用准牛顿方法,无论您如何控制步长,速度都可以快得多。 – 3lectrologos
@ 3lectrologos感谢您的洞察力。这可以解释为什么当使用'fminunc'时为二次函数取得非常好的结果。所以,也许我应该尝试使用不同的方法,而不是改进我的“猜测”。根据您的经验,使用准牛顿方法与梯度下降相比有任何缺点(除了可能难以实现) –
我可能不是合适的人来回答这个问题,但我认为在Newton-如果您尝试从头开始实现它们(例如数字问题),那么这些方法可能有点棘手。在性能方面,我不知道喜欢渐变下降的原因,除非你的问题非常大(见随机梯度下降)。 – 3lectrologos