SciPy优化:Newton-CG与BFGS对比L-BFGS

问题描述 投票:6回答:1

我正在使用Scipy做一个优化问题,我正在采用一个平面网络的顶点和大小为NNxNN的连接,连接它的两侧(即使其周期性),并最小化能量函数,使其卷曲形成一个圆筒。 (见下面的链接。)

由于我有函数energy(xyz-position)和它的渐变,我决定使用Scipy手册中推荐的三种方法 - Newton-CGBFGSL-BFGS-B - 并比较它们的表现方式。

我调用优化函数如下,我只是根据情况用'Newton-CG''BFGS'替换'L-BFGS-B'

from scipy.optimize import minimize
res = minimize(energy, xyzInit, method='Newton-CG', jac = energy_der,  options={'disp': True}) 

我发现了以下一般行为(我给出了NN=9的输出数据,对应于3*9^2=243维参数空间) -

  1. BFGS系统地未能找到正确的最小值(对于低NN),并且根本没有为大型NN收敛。请参阅https://plot.ly/~apal90/162/了解最终结果。 NN=9 Method: BFGS Warning: Desired error not necessarily achieved due to precision loss. Current function value: 204.465912 Iterations: 1239 Function evaluations: 1520 Gradient evaluations: 1508 Time taken for minimisation: 340.728140116
  2. Newton-CG发现小NN(<= 8)的正确最小值,但从NN = 9开始,返回不正确的最小值(即,一端压扁的气缸),并且更高的值甚至会收敛。注意:出于某些原因,这种行为因奇怪的NN而加剧。见https://plot.ly/~apal90/164/ NN=9 Method: Newton-CG Optimization terminated successfully. Current function value: 7.954412 Iterations: 49 Function evaluations: 58 Gradient evaluations: 1654 Hessian evaluations: 0 Time taken for minimisation: 294.203114033
  3. 对于我测试的所有NN(高达NN=14),L-BFGS-B找到了正确的最小值,而且速度太快了。见https://plot.ly/~apal90/160/ NN=9 Method: L-BFGS-B Time taken for minimisation: 36.3749790192

问题:为什么L-BFGS-B在这种情况下优于其他两种方法?特别是,为什么它优于BFGS,当两者都被认为是准牛顿方法(我的理解),以完全相同的方式。

我对这种情况的看法:所有三种方法都在每个点x做二次近似。为此,它需要一个渐变和一个Hessian。如果没有给出Hessian,则必须通过算法计算。在我们的情况下,只显示渐变,这是由算法在数值上计算的每一步。更具体地说,我们需要的是Hessian的逆,这是一个非常昂贵的步骤,特别是在更高的维度。现在,Newton-CG明确地计算了这个逆Hessian,因此需要更长的时间。像BFGS和L-BFGS这样的准牛顿方法基于梯度计算Hessian的近似值(即曲率),该梯度在时间上更便宜,并且据推测也可以更好地估计关于点的曲率。因此,对于二次函数,Newton-CG收敛得更快,而对于非二次函数,准牛顿函数收敛得更好。 L-BFGS是BFGS的低内存版本,每个步骤存储的内存比完整的NxN矩阵少得多,因此它比BFGS快。

这个解释说明了Newton-CG和准牛顿方法之间的分歧。它没有解释的是算法无法找到真正的最小值,特别是BFGS和L-BFGS之间的差异,它们都应该以相同的方式起作用。

我对长收敛时间的一般预感是系统关于最小值是非二次的(即平坦的),因此算法在收敛时振荡。除此之外,如果BFGS和L-BFGS真正以相同的方式工作,我相信Scipy算法的收敛容差水平之间必定存在一些差异。否则,BFGS和L-BFGS实际上并没有以相同的方式工作,后者可能更准确地计算Hessian。

参考 -

http://www.scipy-lectures.org/advanced/mathematical_optimization/#newton-and-quasi-newton-methods

https://en.wikipedia.org/wiki/Newton%27s_method_in_optimization

https://en.wikipedia.org/wiki/Quasi-Newton_method

https://docs.scipy.org/doc/scipy-0.18.1/reference/optimize.minimize-bfgs.html#optimize-minimize-bfgs

https://docs.scipy.org/doc/scipy-0.18.1/reference/optimize.minimize-lbfgsb.html#optimize-minimize-lbfgsb

python optimization scipy newtons-method
1个回答
0
投票

您的问题缺少两个重要信息:能量函数和初始猜测。能量函数可以是凸/非凸,平滑/分段平滑/不连续。因此,在您的上下文中很难完全回答您的问题。但是,我可以解释BFGS和L-BFGS-B之间的一些关键差异。

两种方法都是用于解决非线性优化问题的迭代方法。它们都通过在每次迭代时使用函数的Hessian近似来逼近牛顿方法。与牛顿方法的关键区别在于,它们不是在特定点计算完整的Hessian,而是在先前的点处累积梯度,并使用BFGS公式将它们组合在一起作为Hessian的近似值。除非函数具有接近最优值的二次泰勒展开,否则不能保证牛顿和BFGS方法收敛。

自给定的初始猜测以来,原始BFGS方法累积所有梯度。这种方法存在两个问题。首先,内存可以无限增加。其次,对于非线性问题,最初猜测的Hessian通常不能代表解决方案中的Hessian。因此,近似的Hessian将被偏置,直到在解附近积累足够的梯度。这可能会减慢收敛速度,但根据我的经验,它仍然应该与具有单个局部最小值的能量函数的良好线搜索算法收敛。

L-BFGS与BFGS相同但具有有限的记忆,这意味着在一段时间之后,旧的梯度被丢弃以留出更多空间用于新计算的梯度。这解决了存储器的问题,并且避免了初始梯度的偏差。然而,根据记忆中保留的梯度数量,可能永远不会精确估计Hessian,并且可能是另一个偏差来源。这也可以减慢收敛速度,但同样,它仍然应该与具有单个局部最小值的能量函数的良好线搜索算法收敛。

L-BFGS-B与L-BFGS相同,但对输入变量具有约束条件。 L-BFGS-B将停止优化域边界上的变量。由于您未指定任何约束,因此算法的此方面不适用于您的问题。

我的假设是你试图使用远离解决方案的初始猜测来解决平滑但非凸的问题,并且最终得到局部最小值。既然你提到你从一个平面配置开始,我就不会感到惊讶你从一个奇点开始导致退化的Hessian,这可能会导致其余优化的麻烦。在您的情况下,BFGS和L-BFGS之间的唯一区别是每次迭代都会计算略有不同的梯度,并且L-BFGS方法将最终跟随导致全局最小值的路径。

© www.soinside.com 2019 - 2024. All rights reserved.