Python中的fmincg实现

计算科学 优化 Python 机器学习 八度
2021-12-02 10:52:39

我正在尝试在 Python 中重新实现神经网络。我正确地实现了成本函数和反向传播算法。我通过执行其 Octave 等效代码来检查它们。

但是当我尝试使用该scipy.optimize.fmin_cg函数时,迭代需要很长时间才能执行。它以警告退出并给我一个错误,说“未达到所需的错误率”。

Octave 中的相同程序运行良好。但是,它fmincg定义了自己的功能。

我究竟做错了什么?

3个回答

作为未来的提示,使用双问号 ?? 拉取函数的来源:

查看 scipy 源,如果内部参数 alpha_k 为零或无,则会出现此错误消息。

该值又与内部 Wolfe Line 搜索算法相关联。特别是当搜索没有沿着搜索轨迹找到更好的值时调用它。您的函数可能在某个地方有一个线性轮廓,优化器会陷入其中并感到困惑。

也许尝试添加一个回调,看看失败的搜索是在哪里生成的?

我假设您没有指定fprime参数。如果您不提供此参数fmin_cg,则必须找出自己的解决方案,通常比提供的最佳解决方案要慢得多。您的代码可能如下所示:

theta = fmin_cg(compute_cost_reg, fprime=compute_gradient_reg,
                x0=theta, args=(X, y, lambd), maxiter=50)

我知道这是一个老问题,但我一直在努力解决类似的问题,并认为我会发布我的解决方案,以防其他人遇到这个问题。

我发现问题是我没有正确初始化Θ矢量打破对称性。

完成此操作后,我fmin_cg使用 ffprime 运行,尽管它仍然运行得相当慢,但它没有任何错误或警告,我一直看到这一点。

事实上,它实际上比 matlab 实现在最小化成本函数方面做得更好,尽管两者都有max_iters = 100.