scipy.optimize.minimize用BFGS:物镜与相同的参数向量称为两次



我正在使用scipy.optimize.minimize使用method='bfgs'来训练凸目标。

每次我运行最小化时,前两个调用BFGS Optimizer对我的目标函数进行的始终具有相同的参数向量。这似乎是不必要的,因为它浪费了很大的几分钟,重新计算了两次同一件事。

最少的工作示例(目标要简单得多(;

from scipy.optimize import minimize
def obj_jac(x):
    """Return objective value and jacobian value wrt. x"""
    print(x)
    return 10*x**2, 20*x
minimize(obj_jac, -100, method='bfgs', jac=True, tol=1e-7)

输出;

[-100.]
[-100.]
[-98.99]
[-94.95]
[-78.79]
[-30.17904355]
[-3.55271368e-15]

有人知道BFGS在Scipy中实现这是否是预期的行为?


更新:我已经在Scipy项目上提交了该问题#10385。

这不是预期的行为,或者至少有一个报告错误。

通过options参数进行优化的统计输出:

minimize(obj_jac, -100, method='bfgs', jac=True, tol=1e-7, options={'disp': True})

scipy输出以下内容:

[-100.]
[-100.]
[-98.99]
[-94.95]
[-78.79]
[-30.17904355]
[-3.55271368e-15]
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 3
         Function evaluations: 6
         Gradient evaluations: 6

,报告的功能数量和梯度评估肯定被一个关闭。因此,bfgs肯定有一个统计报告错误。

我还会怀疑,Scipy内部效率低下,这将符合以下几行。在迭代循环之前,评估功能及其梯度。然后开始循环,然后从评估功能及其梯度开始。这将增加0次迭代的其他功能评估,并且可以通过轻微的代码重组避免避免(可能有一些权衡的WRT算法可读性流(。

以下是相关的:

  • 2014 stackoverflow类似问题
  • 2014年Scipy中的封闭错误
  • 2014年执行了拉动请求,以避免其他计算

不是Scipy的专家,我想说一个旧的错误弹出了(然后应该报告(,或者首先从未解决过,尽管我从Github讨论中理解了。

最新更新