【发布时间】:2012-12-22 09:33:43
【问题描述】:
我目前正在研究一种机器学习算法,我注意到当我使用 Matlab 的 fminunc 时,与我手动更新参数时相比,算法收敛到全局最小值的速度非常快(迭代次数很少):
thetas[j] = thetas[j] - (alpha*gradient)/sampleNum;
我认为这是因为我天真地假设alpha(步长比例)是恒定的。
那么,如何在 C 中实现类似fminunc 的东西?
我尝试从一个大的alpha 开始,如果当前成本大于之前的成本,则对其进行调整。当最小化函数的形状不是线性时,就会出现问题,因为alpha 最初可以得到一个非常小的值,并且当函数形状趋于“平坦”时无法返回到更大的值(并且更大的步长可以被采取)。
【问题讨论】:
-
Matlab 的
fminunc不使用梯度下降。它使用准牛顿方法,无论您如何控制步长,它都可以显着加快。 -
@3lectrologos 感谢您的洞察力。这可以解释为什么我在使用
fminunc时得到非常好的二次函数结果。所以,也许我应该尝试使用不同的方法来改进我的alpha猜测。根据您的经验,与梯度下降相比,使用准牛顿方法有任何缺点(除此之外,它可能更难实现) -
我可能不是回答这个问题的合适人选,但我认为在类似牛顿的方法中有一些实现细节,如果您尝试从头开始实现它们可能会有些棘手(例如数值问题)。在性能方面,我不知道有什么理由更喜欢梯度下降,除非你的问题真的很大(请参阅随机梯度下降)。
-
既然你的第一条评论以某种方式回答了我的问题(我错误地认为
fminunc使用梯度下降并且可能提高我的步长猜测不会把我带到正确的方向)你能把它转换成一个答案,所以我可以接受。我将进一步研究准牛顿方法。谢谢!
标签: c matlab machine-learning gradient-descent