首先,也不是沒人用,只是不夠流行。

至於為什麼不夠流行,我粗淺的理解:

  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 共軛梯度這些方法更主流 深度學習不太可行


推薦閱讀:
相关文章