【发布时间】:2014-04-30 09:15:15
【问题描述】:
我在 Octave/Matlab 中有一些执行 L-BFGS 优化的代码,调用签名如下:
[optTheta, cost] = fminlbfgs(objFunc, theta);
objFunc 是我的目标函数,theta 是我对参数的初始猜测。我认为fminlbfgs 是一个库,但它的调用签名和行为类似于 Matlab 中的minFunc。 objFunc 返回[cost, gradient]。此代码最多执行 400 次迭代,并在 5 分钟内完成。
我已将我的代码移植到 Python 并尝试使用 Scipy 的 minimize 进行相同的优化:
res = minimize(obj_func, theta,
method='BFGS', jac=True,
options={'maxiter': 400, 'disp':True})
但由于某种原因,这段代码运行得非常慢(我等了大约 15 分钟才杀死它)。 obj_func 的返回签名与 Octave 中的相同。
我想知道我是否没有正确调用minimize 函数?分析显示包含minimize 的模块占用了最多的运行时间。
【问题讨论】:
-
也许你应该和 scipy 的 lbfgsb 比较一下。如果没有更多信息,就不可能说出原因可能是什么。跨 scipy 版本更改的 linesearch 可能存在一些问题。
-
基于 scipy 源,我相信
minimize和method='BFGS'应该调用与fmin_bfgs相同的函数。似乎minimize是 scipy 基于文档实现的所有算法的首选接口。 -
我的意思是
method=‘L-BFGS-B’和'BFGS'不同,我不知道哪个优化器相当于Octave的L-BFGS。 -
啊,我认为 BFGS 是正确的。我认为 L-BFGS 是一种低内存变体,只要数据具有一定大小或其他东西,Scipy 就会使用它。 L-BFGS-B 是 L-BFGS 的受限版本。
-
你试过了吗? bfgs 在 Python 中,在 scipy 中的 lbfgsb 在 Fortran 中,并且可能基于与 octave 中的相同的原始 Fortran 包。不需要在 lbfgsb 中使用最后一个
b。但正如我之前评论的那样,如果您的优化没有在 15 分钟内完成,那么您的情况就有些“奇怪”了。