我正在寻找 Broyden-Fletcher-Goldfarb-Shanno 算法 ( BFGS )、L-BFGS-B 和 PORT 算法在优化中的优缺点。哪一个承诺最好的结果,为什么?
BFGS 与 L-BFGS-B 与 PORT 的优缺点
我从您的问题推断出您是 R 用户,并且您想知道是使用optim(具有 BFGS 和 L-BFGS-B 选项)还是nlminb(使用 PORT)。
在这里查看我的答案。相关位:
optim 可以使用许多不同的算法,包括共轭梯度、牛顿、准牛顿、Nelder-Mead 和模拟退火。最后两个不需要梯度信息,因此如果梯度不可用或计算不可行(但可能更慢并且分别需要更多参数微调),则可能很有用。它还可以选择在解决方案中返回计算出的 Hessian,如果您想要标准错误以及解决方案本身,则需要该选项。
nlminb 使用准牛顿算法,该算法与 optim 中的“L-BFGS-B”方法具有相同的优势。根据我的经验,它似乎比 optim 更强大,因为它更有可能在 optim 无法收敛的边缘情况下返回解决方案,尽管这可能取决于问题。如果您提供显式梯度函数,它具有很好的功能,即在解决方案中对其值进行数值检查。如果这些值与数值差分得到的值不匹配,nlminb 将给出警告;这有助于确保您在指定梯度时没有犯错(对于复杂的可能性很容易做到)。
但是,对于现代工作,您应该能够比其中任何一个做得更好,因为基本的例程都已有几十年的历史了。请参阅 CRAN 上的优化任务视图以获取通用优化器包的列表。我特别推荐nloptr、minqa和lbfgsb3包。此外,Rcgmin、Rvmmin和Rtnmin提供了对内置于optim. 最后,optimr是一个外壳程序,可让您使用相同的接口调用其他优化函数。
nloptr 和 minqa 都被非常流行的 lme4 包用于混合建模,因此如果您需要它,请投下信任票。
这三种算法不会尝试解决相同的问题,因此在它们之间进行选择将取决于您要解决的问题。
BFGS 试图在没有任何约束的情况下解决一般的非线性优化问题。您可以将其视为牛顿方法的近似值,其中近似值是对每次迭代更新的 Hessian 矩阵的巧妙“估计”。
L-BFGS-B 是 BFGS 的一种变体,它允许结合“盒子”约束,即形式的约束对于任何或所有参数. 显然,如果你没有任何盒子约束,你不应该费心使用 L-BFGS-B,如果你这样做了,你不应该使用无约束版本的 BFGS。
ETA:Jim 在上面的评论中指出,L-BFGS-B 使用有限内存版本的 BFGS 以及合并框约束。这对您的应用程序可能很重要,也可能不重要。我已经很长时间没有遇到内存限制了,但这是我的应用领域和工作环境的一个功能,而且,正如 Jim 所观察到的,“它被广泛使用 [在机器学习中],因为它比普通的内存效率更高香草BFGS”。
PORT 是 Levenberg-Marquardt 算法的一种特殊实现,它解决了非线性最小二乘问题。请注意,在这种情况下,目标函数是固定的,即,尽管您仍然可以指定. 显然,如果这不是您的目标函数,您就不能使用 PORT!但如果是,那么您应该优先使用 LM,而不是不太专业的 BFGS 算法。