2.牛頓算法(Newton’s method)
因為牛頓算法用到了海森矩陣,所以它屬于二階算法。此算法的目標是使用損失函數的二階偏導數尋找更好的學習方向。
?
?
下圖展示的是牛頓法的流程圖。參數的更新也分為兩步,計算牛頓訓練方向和合適的學習率。
?
牛頓法的性能如下圖所示。從相同的初始值開始尋找損失函數的最小值,它比梯度下降方法需要更少的步驟。
?
然而,牛頓法的難點在于準確計算海森矩陣和其逆矩陣需要大量的計算資源。
3.共軛梯度法(Conjugate gradient)
共軛梯度法介于梯度下降法與牛頓法之間。它的初衷是解決傳統(tǒng)梯度下降法收斂速度太慢的問題。不像牛頓法,共軛梯度法也避免了計算和存儲海森矩陣。
共軛梯度法的搜索是沿著共軛方向進行的,通常會比沿著梯度下降法的方向收斂更快。這些訓練方向與海森矩陣共軛。
我們將d定義為訓練方向向量。然后,將參數向量和訓練方向訓練分別初始化為w0和d0 = -g0,共軛梯度法的方向更新公式為:
di+1 = gi+1 + di·γi, i=0,1,…
其中γ是共軛參數,計算它的方法有許多種。其中兩種常用的方法分別是Fletcher 和 Reeves 以及 *** 和 Ribiere發(fā)明的。對于所有的共軛梯度算法,訓練方向會被周期性地重置為梯度的負值。
參數的更新方程為:
wi+1 = wi + di·ηi, i=0,1,…
下圖是共軛梯度法訓練過程的流程圖。參數更新的步驟分為計算共軛梯度方向和計算學習率兩步。
?
此方法訓練神經網絡模型的效率被證明比梯度下降法更好。由于共軛梯度法不需要計算海森矩陣,當神經網絡模型較大時我們也建議使用。
4. 準牛頓法(Quasi-Newton method)
由于牛頓法需要計算海森矩陣和逆矩陣,需要較多的計算資源,因此出現了一個變種算法,稱為準牛頓法,可以彌補計算量大的缺陷。此方法不是直接計算海森矩陣及其逆矩陣,而是在每一次迭代估計計算海森矩陣的逆矩陣,只需要用到損失函數的一階偏導數。
海森矩陣是由損失函數的二階偏導數組成。準牛頓法的主要思想是用另一個矩陣G來估計海森矩陣的逆矩陣,只需要損失函數的一階偏導數。準牛頓法的更新方程可以寫為:
wi+1 = wi - (Gi·gi)·ηi, i=0,1,…
學習率η既可以設為固定值,也可以動態(tài)調整。海森矩陣逆矩陣的估計G有多種不同類型。兩種常用的類型是Davidon–Fletcher–Powell formula (DFP)和Broyden–Fletcher–Goldfarb–Shanno formula (BFGS)。
準牛頓法的流程圖如下所示。參數更新的步驟分為計算準牛頓訓練方向和計算學習率。
?
許多情況下,這是默認選擇的算法:它比梯度下降法和共軛梯度法更快,而不需要準確計算海森矩陣及其逆矩陣。
5. Levenberg-Marquardt算法
Levenberg-Marquardt算法又稱為衰減的最小平方法,它針對損失函數是平方和誤差的形式。它也不需要準確計算海森矩陣,需要用到梯度向量和雅各布矩陣。
假設損失函數f是平方和誤差的形式:
?
?
若衰減因子λ設為0,相當于是牛頓法。若λ設置的非常大,這就相當于是學習率很小的梯度下降法。
參數λ的初始值非常大,因此前幾步更新是沿著梯度下降方向的。如果某一步迭代更新失敗,則λ擴大一些。否則,λ隨著損失值的減小而減小,Levenberg-Marquardt接近牛頓法。這個過程可以加快收斂的速度。
下圖是Levenberg-Marquardt算法訓練過程的流程圖。第一步計算損失值、梯度和近似海森矩陣。然后衰減參數和衰減系數。
由于Levenberg-Marquardt算法主要針對平方和誤差類的損失函數。因此,在訓練這類誤差的神經網絡模型時速度非??臁5沁@個算法也有一些缺點。首先,它不適用于其它類型的損失函數。而且,它也不兼容正則項。最后,如果訓練數據和網絡模型非常大,雅各布矩陣也會變得很大,需要很多內存。因此,當訓練數據或是模型很大時,我們并不建議使用Levenberg-Marquardt算法。
內存使用和速度的比較
下圖繪制了本文討論的五種算法的計算速度和內存需求。如圖所示,梯度下降法往往是最慢的訓練方法,它所需要的內存也往往最少。相反,速度最快的算法一般是Levenberg-Marquardt,但需要的內存也更多。柯西-牛頓法較好地平衡了兩者。
?
總之,如果我們的神經網絡模型有上千個參數,則可以用節(jié)省存儲的梯度下降法和共軛梯度法。如果我們需要訓練很多網絡模型,每個模型只有幾千個訓練數據和幾百個參數,則Levenberg-Marquardt可能會是一個好選擇。其余情況下,柯西-牛頓法的效果都不錯。
評論