我正在尝试在 Python 中重新实现神经网络。我正确地实现了成本函数和反向传播算法。我通过执行其 Octave 等效代码来检查它们。
但是当我尝试使用该scipy.optimize.fmin_cg
函数时,迭代需要很长时间才能执行。它以警告退出并给我一个错误,说“未达到所需的错误率”。
Octave 中的相同程序运行良好。但是,它fmincg
定义了自己的功能。
我究竟做错了什么?
我正在尝试在 Python 中重新实现神经网络。我正确地实现了成本函数和反向传播算法。我通过执行其 Octave 等效代码来检查它们。
但是当我尝试使用该scipy.optimize.fmin_cg
函数时,迭代需要很长时间才能执行。它以警告退出并给我一个错误,说“未达到所需的错误率”。
Octave 中的相同程序运行良好。但是,它fmincg
定义了自己的功能。
我究竟做错了什么?
作为未来的提示,使用双问号 ?? 拉取函数的来源:
查看 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
使用 f和fprime 运行,尽管它仍然运行得相当慢,但它没有任何错误或警告,我一直看到这一点。
事实上,它实际上比 matlab 实现在最小化成本函数方面做得更好,尽管两者都有max_iters = 100
.