scipy.optimize.minimize 使用 BFGS:Objective 使用相同的参数向量调用两次
scipy.optimize.minimize with BFGS: Objective called twice with same parameter vector
我正在使用 scipy.optimize.minimize
和 method='bfgs'
来训练凸 objective。
每次我 运行 最小化时,BFGS 优化器对我的 objective 函数进行的前两次调用始终具有相同的参数向量。这似乎是不必要的,因为它浪费了好几分钟重新计算同一件事两次。
最小工作示例(更简单 objective);
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]
有谁知道这是否是 scipy 中 BFGS 实现的预期行为?
更新:我已将此作为 issue #10385 提交到 Scipy 项目。
这不是预期的行为,或者至少存在报告错误。
通过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 中肯定存在统计报告错误。
我还怀疑 SciPy 内部效率低下,具体如下。在迭代循环之前,评估函数及其梯度。然后开始循环并从评估函数及其梯度开始。这将为第 0 次迭代添加额外的函数评估,当然可以通过轻微的代码重组来避免(可能有一些 trade-off wrt 算法可读性流程)。
以下是相关的:
- 2014 Whosebug similar question
- 2014 closed bug in SciPy
- 2014 performed pull request exactly to avoid the additional calculation
我不是 SciPy 方面的专家,我会说要么是突然冒出一个老错误(然后应该报告它)要么一开始就没有修复,尽管我从中了解到GitHub 讨论。
我正在使用 scipy.optimize.minimize
和 method='bfgs'
来训练凸 objective。
每次我 运行 最小化时,BFGS 优化器对我的 objective 函数进行的前两次调用始终具有相同的参数向量。这似乎是不必要的,因为它浪费了好几分钟重新计算同一件事两次。
最小工作示例(更简单 objective);
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]
有谁知道这是否是 scipy 中 BFGS 实现的预期行为?
更新:我已将此作为 issue #10385 提交到 Scipy 项目。
这不是预期的行为,或者至少存在报告错误。
通过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 中肯定存在统计报告错误。
我还怀疑 SciPy 内部效率低下,具体如下。在迭代循环之前,评估函数及其梯度。然后开始循环并从评估函数及其梯度开始。这将为第 0 次迭代添加额外的函数评估,当然可以通过轻微的代码重组来避免(可能有一些 trade-off wrt 算法可读性流程)。
以下是相关的:
- 2014 Whosebug similar question
- 2014 closed bug in SciPy
- 2014 performed pull request exactly to avoid the additional calculation
我不是 SciPy 方面的专家,我会说要么是突然冒出一个老错误(然后应该报告它)要么一开始就没有修复,尽管我从中了解到GitHub 讨论。