当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?

Posted

技术标签:

【中文标题】当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?【英文标题】:How to use scipy.optimize.minimize function when you want to compute gradient along with the objective function? 【发布时间】:2016-10-10 14:33:21 【问题描述】:

scipy.optimize.minimzeobjjac 函数作为输入。我相信它会在需要时单独调用它们。但我们经常会遇到目标函数,其梯度计算与目标函数共享大量计算。所以理想情况下我想同时计算objgrad。但是这个库似乎不是这种情况?如果还想用scipy.optimize.minimze,有什么办法呢?

【问题讨论】:

【参考方案1】:

你完全可以。只需使用jac=True

In [1]: import numpy as np

In [2]: from scipy.optimize import minimize

In [3]: def f_and_grad(x):
   ...:     return x**2, 2*x
   ...: 

In [4]: minimize(f_and_grad, [1], jac=True)
Out[4]: 
      fun: 1.8367099231598242e-40
 hess_inv: array([[ 0.5]])
      jac: array([  2.71050543e-20])
  message: 'Optimization terminated successfully.'
     nfev: 4
      nit: 2
     njev: 4
   status: 0
  success: True
        x: array([  1.35525272e-20])

其实是documented:

jac : bool 或可调用,可选的 Jacobian (梯度) 目标 功能。仅适用于 CG、BFGS、Newton-CG、L-BFGS-B、TNC、SLSQP、dogleg、 信任-ncg。 如果 jac 是布尔值并且为 True,则假定 fun 返回 梯度和目标函数。如果为假,梯度 将被数值估计。 jac 也可以是可调用的返回 目标的梯度。在这种情况下,它必须接受相同的 争论很有趣。

(强调我的)

【讨论】:

感谢您指出这一点!从文档/示例中这并不是很明显,我觉得应该考虑到这是一个功能的重要性。 我同意文档不是 100% 清楚的。理想情况下,它应该说“fun 假定返回一个元组,第一个元素是函数值,第二个元素是梯度”

以上是关于当您想与目标函数一起计算梯度时,如何使用 scipy.optimize.minimize 函数?的主要内容,如果未能解决你的问题,请参考以下文章

指数函数的 SCIP 优化

使用 Spring Security 自定义 Http 授权标头

当您想使用链接组件时,外部链接在 Next.js 中不起作用

Google OR-Tools(使用 SCIP 求解器) - 如何访问求解器找到的中间解决方案?

计算 SVM 损失函数的梯度

Tensorflow细节-P84-梯度下降与批量梯度下降