梯度法(SGD)、擬牛頓法(LBFGS)與共軛梯度法(CG)

一、基本原理

梯度法:

一階泰勒級數展開式,f(x+dx) = f(x) + sum(i,df/dx(i)*dx(i)) + r(x,dx)。其中r(x,dx)爲餘項,當dx很小時,可忽略餘項。推倒得迭代:x=x+dx=x-miu*dfx。

優點:可收斂於一個極小值點。

缺點:收斂速度慢,在梯度值小時尤爲明顯。學習率miu需要依據經驗賦值。

牛頓法:

         由二階泰勒級數展開式,f(x+dx) ~= f(x) + f’(x)*dx + 1/2*(dx)’H(dx),H爲黑森矩陣。推到的迭代式:dx=-H[-1]df/dx。

         優點:精度高於梯度法。

         缺點:H矩陣計算存儲複雜,收斂性沒法保證。

         擬牛頓法:利用函數一階導數(梯度)來近似遞推H矩陣。

共軛梯度法:

         共軛梯度法也是一種近似的二階方法,只需計算一階導數,不需計算和存儲二階導數。

二、三者性能比較(引自網絡)

本文主要是參考論文:On optimization methods fordeep learning,文章內容主要是筆記SGD(隨機梯度下降),LBFGS(受限的BFGS),CG(共軛梯度法)三種常見優化算法的在deeplearning體系中的性能。下面是一些讀完的筆記。

SGD優點:實現簡單,當訓練樣本足夠多時優化速度非常快。

SGD缺點:需要人爲調整很多參數,比如學習率,收斂準則等。另外,它是序列的方法,不利於GPU並行或分佈式處理。

  各種deep learning中常見方法(比如說AutoencoderRBMDBNICASparse coding)的區別是:目標函數形式不同。這其實才是最本質的區別,由於目標函數的不同導致了對其優化的方法也可能會不同,比如說RBM中目標函數跟網絡能量有關,採用CD優化的,而Autoencoder目標函數爲理論輸出和實際輸出的MSE,由於此時的目標函數的偏導可以直接被計算,所以可以用LBFGSCG等方法優化,其它的類似。所以不能單從網絡的結構來判斷其屬於Deeplearning中的哪種方法,比如說我單獨給定64-1002層網絡,你就無法知道它屬於deep learning中的哪一種方法,因爲這個網絡既可以用RBM也可以用Autoencoder來訓練。

  作者通過實驗得出的結論是:不同的優化算法有不同的優缺點,適合不同的場合,比如LBFGS算法在參數的維度比較低(一般指小於10000維)時的效果要比SGD(隨機梯度下降)和CG(共軛梯度下降)效果好,特別是帶有convolution的模型。而針對高維的參數問題,CG的效果要比另2種好。也就是說一般情況下,SGD的效果要差一些,這種情況在使用GPU加速時情況一樣,即在GPU上使用LBFGSCG時,優化速度明顯加快,而SGD算法優化速度提高很小。在單核處理器上,LBFGS的優勢主要是利用參數之間的2階近視特性來加速優化,而CG則得得益於參數之間的共軛信息,需要計算器Hessian矩陣。

  不過當使用一個大的minibatch且採用線搜索的話,SGD的優化性能也會提高。

  在單核上比較SGDLBFGSCG三種算法的優化性能,當針對Autoencoder模型。結果如下:

  可以看出,SGD效果最差。

  同樣的情況下,訓練的是Sparse autoencoder模型的比較情況如下:


  這時SGD的效果更差。這主要原因是LBFGSCG能夠使用大的minibatch數據來估算每個節點的期望激發值,這個值是可以用來約束該節點的稀疏特性的,而SGD需要去估計噪聲信息。

  當然了作者還有在GUPconvolution上也做了不少實驗。

  最後,作者訓練了一個2隱含層(這2層不算pooling層)的Sparse autocoder網絡,並應用於MNIST上,其識別率結果如下:


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章