首先,也不是没人用,只是不够流行。

至于为什么不够流行,我粗浅的理解:

  1. 二阶方法对内存要求太高;
  2. 拟牛顿法对梯度的质量要求比较高,所以要很大的batch,本质上还是对内存要求高,而且非常慢[1];
  3. SGD的随机性可以理解成某种regularization,似乎还会带来一些好处,如generalization[2][3]。

[1] A Progressive Batching L-BFGS Method for Machine Learning

[2] Implicit Regularization in Deep Learning

[3] Implicit Regularization in Over-parameterized Neural Networks


一方面是大家说的二阶方法对于深度学习动辄几亿个参数的模型来说太费力了。

另外我觉得也可能因为在高维空间中,损失函数的形状和我们在低维中想像的有差异,用不到拟牛顿法这么强的方法。

反倒是一些基于梯度下降的改进,例如momentum,RMSprop和他俩的个体adam,以及adam的各种改进用的很多。

感觉adam的想法其实也不复杂,但是人家在深度学习里就是好使。


很多基于gradient的优化演算法,比如bfgs,需要用到目标函数的二阶导数。对于一个neural network来说,一阶导数的个数等于参数,二阶导数的个数等于参数的平方,这在具体计算中基本是不可能做到的。比如一个简单的resnet,就有几千万个参数,二阶导的话,需要计算一千万亿次。

我曾经做过小的neural network,有几千个参数的那种,用tensorflow+bfgs。好处是不需要调learning rate,因为learning rate是基于二阶导数计算出来的。这样做收敛速度很快。但是计算量依然很大很大,整体的计算速度还是很慢。更大的神经网路的话,无论是从计算量还是内存上看,计算二阶导数都是不切实际的。

还有一个原因,是因为data的noise可能带来的影响都要超过二阶导数带来的修正。除非你对需要研究的问题的physics非常清楚,否则用二阶导数意义也不大


pytorch的优化演算法库含有L-BFGS,但是用的较少。

torch.optim.LBFGS(params, lr=1, max_iter=20, max_eval=None, tolerance_grad=1e-05, tolerance_change=1e-09, history_size=100, line_search_fn=None)

暂时还没发现哪个深度学习框架含有DFP。

我觉得,之所以SGD、Adam、RMSProp这些优化演算法的应用较广,主要是因为计算成本低。


简单点神经网路有人用,深度学习的... 上亿参数... 算不动啊...


不知道是不是我孤陋寡闻,神经网路能够训练,是因为反向传播演算法能够求得每个参数关于loss的一阶导数,但是对于二阶导数,好像不能用反向传播这么简单求得了吧,感觉实际不可操作。


首先,还真有人用l-bfgs优化神经网路,但估摸著效果不好,没人在论文中这么用。但工业上真有人这么搞。

其次,严格意义上神经网路那种优化叫做bp演算法,属于启发式演算法,只是看上去像随机剃度优化罢了,但本质上还是以启发式演算法面目示人的。

最后,和第二点密切相关的,无论随机梯度优化演算法,拟牛顿法都不应该能用来优化神经网路,神经网路可能既不凸,也不利普希茨连续,强用其实是错的。


计算量问题,不是很流行。


本质上是随机误差的影响。梯度误差就很大(实验表明,误差远大于期望,很多文献中也持类似观点),Hessian等二阶信息误差就更大了。受误差的影响,二阶法不见得比一阶快。另一方面,DFP、LBFGS等本来是基于差分表示梯度变化与参数变化的关系,在巨大的随机误差下梯度差分完全不可行,往往只能用Hessian向量等计算代价大好几倍的方式,计算效率就更不占优了。


浅层神经网路完全可以选择 但LM 共轭梯度这些方法更主流 深度学习不太可行


推荐阅读:
相关文章