我目前正在研究一种机器学习算法,我注意到当我使用 Matlab 的 fminunc
时,与我手动更新参数时相比,该算法收敛到全局最小值的速度非常快(迭代次数很少):
thetas[j] = thetas[j] - (alpha*gradient)/sampleNum;
我认为这是因为我天真地假设 alpha
(步长比例)是恒定的。
那么,如何在 C 中实现类似 fminunc
的东西呢?
我试着从一个大的 alpha
开始,如果当前的成本比之前的成本大,我会调整它。当最小化函数的形状不是线性时就会出现问题,因为 alpha
最初可以得到一个非常小的值,并且当函数形状趋于“平坦”时无法返回到更大的值(并且可以采取更大的步骤)。
最佳答案
Matlab 的 fminunc
实际上并不使用梯度下降法,而是使用类似牛顿的方法(BFGS-based quasi-Newton or trust-region 取决于问题的大小),无论怎样,它通常比梯度下降法快得多您选择步长。
如果你想要更快的收敛,也许你应该研究这种方法。
关于c - fminunc如何优化梯度下降中的学习率(步长比例)值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13998880/