在BFGS和共轭梯度之间进行优化时,应该考虑哪些因素?我试图适合这些变量的函数是指数函数。但是,实际的目标功能除其他外还涉及集成,如果有帮助的话,则成本很高。
在BFGS和共轭梯度之间进行优化时,应该考虑哪些因素?我试图适合这些变量的函数是指数函数。但是,实际的目标功能除其他外还涉及集成,如果有帮助的话,则成本很高。
Answers:
JM关于存储是正确的。BFGS需要近似的Hessian,但是您可以使用单位矩阵对其进行初始化,然后只要您具有可用的梯度信息(最好是分析性而非通过有限差分),就可以随即计算近似Hessian的秩2更新。BFGS是一种准牛顿法,将以比CG更少的步骤收敛,并且具有“卡住”的趋势,并且需要进行少量的算法调整以便在每次迭代中获得明显的下降。
相反,CG需要矩阵向量乘积,如果您可以计算方向导数(再次,解析地或使用有限差分),则对您可能有用。方向导数的有限差分计算比Hessian的有限差分计算便宜得多,因此,如果您选择使用有限差分构造算法,则只需直接计算方向导数即可。但是,该观察结果并不真正适用于BFGS,它会使用梯度信息的内积来计算近似的Hessian。
如果您知道存储不会成为问题,那么我将在您的应用程序的一个小测试问题上比较这两种算法。在不知道问题具体细节的情况下,我猜测BFGS会更快,但是您应该真正测试这两种算法以更好地了解哪种算法会更好。
最后,关于自动差异化的一句话:拥有Fortran内部自动差异化(AD)工具(DAEPACK)的经验,我可以告诉您,AD工具通常很挑剔。他们可能不一定能够区分自己生成的代码。有两种类型的AD工具:
从源到源的工具实际上是经过修改的编译器,这些编译器将获取您编写的源代码,对其进行解析,并自动生成新的源代码,以计算源代码中函数的梯度。运算符重载AD工具要求您在源代码中使用重载的AD运算符,以便可以计算导数,这将需要您付出额外的精力来计算使用AD的分析导数。
以我的经验,具有大量更新的BFGS所存储的信息与当前解决方案相距太远,以至于在逼近非滞后的Jacobian方面确实很有用,如果存储过多的信息,实际上可能会失去收敛性。正是由于这些原因,BFGS的“无内存”变体看起来非常像非线性共轭梯度(请参阅其中的最后一个更新)。因此,如果您愿意使用L-BFGS而不是BFGS,则内存问题将消失,并且相关方法也将相关。轶事证据表明重新启动是一个棘手的问题,因为有时是不必要的,有时是非常必要的。
您在这两者之间的选择还很大程度上取决于您感兴趣的问题。如果您有足够的资源,则可以同时尝试解决您的问题并确定哪种方法更好。例如,我个人不使用这些算法进行优化,而是关注非线性方程组的解。对于这些,我发现NCG效果更好,并且更易于执行非线性预处理。BFGS更强大。
在低维中,一个良好实现的BFGS方法通常比CG更快且更健壮,尤其是在函数距离二次项不太远的情况下。
BFGS和CG都不需要关于凸度的任何假设。仅初始Hessian近似(对于BFGS)。前提条件(对于CG)必须是正定的。但是,始终可以选择这些元素作为单位矩阵,并且尺寸较小,不会造成太大危害。另请参阅/scicomp//a/3213/1117
在没有编程梯度的情况下,使用数字梯度会浪费很多精力,尤其是当函数值昂贵时。相反,应该使用无导数算法。有关最新调查,请参见http://archimedes.cheme.cmu.edu/?q=dfocomp。