【问题标题】:scipy.optimize.minimize Newton-CG stops even when second derivative is negative即使二阶导数为负,scipy.optimize.minimize Newton-CG 也会停止
【发布时间】:2018-01-30 22:34:50
【问题描述】:

尝试使用

最小化 sigmoid 曲线 f(x)=1/(1+exp(-x))(在负无穷处收敛到零,在无穷远处收敛到 1)
scipy.optimize.minimize(lambda x: 1/(1+np.exp(-x)),100,hess=lambda x:-(np.exp(x)*(np.exp(x)-1))/(np.exp(x)+1)**3,jac = lambda x:1/(np.exp(-x/2)+np.exp(x/2))**2,method = 'Newton-CG')

我得到以下输出:

     fun: array([ 1.])
     jac: array([  3.72007598e-44])
 message: 'Warning: Desired error not necessarily achieved due to precision loss.'
    nfev: 19
    nhev: 1
     nit: 0
    njev: 7
  status: 2
 success: False
       x: array([ 100.])

这意味着,算法只是停止在它所在的位置,并声称最小值是 f(100)=1,而实际上它是 f(-infinity)=0。这个答案只看x=100 的微小导数是合理的(并且考虑到最小值只能在一定的容错范围内找到),但是负二阶导数(hessian)意味着x=100 甚至不接近局部最小值。

如何避免警告消息,以及如何强制算法继续运行,直到它至少找到hess(x)>0 的位置?请注意,Jacobian 和 Hessian 实际上都没有遇到数值稳定性问题;确实是jac(100)>0hess(100)<0,最小化器应该能够从中得出尚未达到最优值的结论。

PS:这当然只是一个玩具问题,但我相信它抓住了我的实际应用程序失败的要领。另外,我不打算使用 Newton-CG,但是当 jacobian 像上面的例子一样小时,不能期望任何不使用二阶导数的方法继续,所以我确实想使用一种利用的方法二阶导数信息

我正在使用 Python3.6.3 和 scipy0.19.1

【问题讨论】:

  • x=100 处的粗麻布为 -3.7e-44。虽然这是负数,但它太小了,实际上无法与 0 区分开来。换句话说,该区域的曲线太平,对优化器没有意义。在这种情况下,我倾向于使用differential_evolution。如果您想确保有一个合理的最小值,您可以进一步将结果作为起点传递给基于梯度的优化例程。
  • "... 并声称最小值为 f(100)=1 ..." 它没有声明这一点。看看输出!它在那里说:“警告:由于精度损失,不一定会实现所需的错误。”和success: False。这意味着它没有找到最小值就停止了。

标签: python scipy minimization


【解决方案1】:

该算法没有声称最小值为 100,它明确表示未找到最小值(成功:False),并指出原因:精度损失。观察到1 + np.exp(-100),甚至1 + np.exp(-50),在以双精度执行计算时正好是1.0。你给优化器一个等于 1 的函数,据它所知,难怪它无处可去寻找更小的值。

解决方案是查看您的实际问题中的情况。如果您要优化两个如此巨大不同数量级的事物的总和,那么这些术语的比例似乎很糟糕。数值优化方法处理此类问题的能力有限;需要人工干预才能使问题易于处理。

【讨论】:

  • 对不起,我歪曲了算法。尽管我措辞不好,但我知道该警告信息,但我的问题仍然是我想避免它。我不相信我可以在我的问题中做很多事情来修复尺度,以及由此产生的函数的恒定性。我确实检查了简单地遵循梯度直到 Hessian 变为正定确实会导致最优,因此我的问题是我可以以某种方式告诉算法这样做
  • 你不能告诉算法忽略它应该最小化的函数,而只是通过梯度。作为一种可能的解决方法,尝试通过添加一个小的倍数|x|**2(一些变量平方)来修改函数,足以让它从初始位置脱离。运气好的话,它会收敛到离最小值不远的地方,您可以使用实际函数从那里继续。
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2023-03-21
  • 2011-02-01
  • 1970-01-01
  • 2022-01-11
  • 2019-12-30
相关资源
最近更新 更多