從梯度下降到擬牛頓法:盤點訓練神經網路的五大學習演算法
在神經網路中,系統的學習過程一般是由訓練演算法所主導。而現如今有許多不同的學習演算法,它們每一個都有不同的特徵和表現。因此本文力圖描述清楚五大學習演算法的基本概念及優缺點,給讀者們闡明最優化在神經網路中的應用。
問題形式化
神經網路中的學習過程可以形式化為最小化損失函數問題,該損失函數一般是由訓練誤差和正則項組成。誤差項會衡量神經網路擬合數據集的好壞,也就是擬合數據所產生的誤差。正則項主要就是通過給特徵權重增加罰項而控制神經網路的有效複雜度,這樣可以有效地控制模型過擬合問題。
訓練損失函數取決於神經網路中的自適應參數(偏置項和突觸權重)。我們很容易地將神經網路的權重組合成一個 n 維權重向量 w,而訓練損失就是以這些權重為變數的函數。下圖描述了損失函數 f(w)。
如上圖所示,點 w* 是訓練損失函數的極小值點。在任意點 A,損失函數能分別對權重求一階偏導數和二階偏導數。損失函數的一階偏導可以使用梯度算符來表示,其中每一個權重的損失函數梯度表示如下:
同樣,損失函數的二階偏導可以使用海塞矩陣(Hessian matrix)來表示,以下就是損失函數對權重向量每個元素的二階偏導數:
最小化多變數連續可導函數的方法廣泛應用於學習過程中,許多常規方法都將這種最優化方法直接應用於神經網路的訓練中。
單變數函數優化(One-dimensional optimization)
雖然損失函數是由多變數決定的(權重的數量通常十分巨大),但首先理解單變數函數的優化方法是十分重要的。並且實際上單變數優化方法經常應用到神經網路的訓練過程中,超參數的調整就可以使用單變數優化法。
在實際模型中,許多訓練演算法都是首先計算出訓練方向 d,然後確定在此訓練方向上最小化訓練損失 f(η)的學習速率η。下圖就展示了單變數函數 f(η)的優化過程,該優化可求得最優學習速率η*。
點η1 和點η2 定義了包含單變數函數 f(η)最優點η*的子區間
在該案例中,單變數優化法在給定單變數函數的情況下搜尋函數極小值。其中廣泛應用的搜尋演算法有黃金分割法(golden section)和 Brent 法。兩者都是在減少極小值所在的子區間,直到子區間中兩個端點間的距離小於定義的可容忍誤差。
多變數函數優化(Multidimensional optimization)
神經網路的學習過程可以形式化為求將訓練損失函數 f 最小化的參數向量 w*。數學或實際都證明如果神經網路的損失函數達到了極小值,那麼梯度也必定為 0 向量。
通常情況下,損失函數為參數的非線性函數,所以找到一個封閉的訓練演算法(closed training algorithms)求最優解是不可能的。相反,我們考慮通過一系列迭代步在參數空間內搜尋最優解。在每一步迭代中,我們可以通過調整神經網路的參數降低損失函數的值。
通過這種方式,一般我們會由初始參數向量開始(通常為隨機初始化)訓練神經網路。然後,演算法會更新生成一組新參數,訓練損失函數也會在每一次演算法迭代中使用更新的參數進行函數值的降低。兩步迭代之間的的訓練損失減少又稱之為訓練損失衰減率(loss decrement)。最後,當訓練過程滿足特定的條件或停止標準時,訓練演算法就會停止迭代,而這個時候的參數也就是最優參數(神經網路中可能是局部最優解),神經網路的性能也由它們所決定。
下面,本文將描述在神經網路中最重要的學習演算法。
梯度下降
梯度下降,又稱為最速下降法是一種非常簡單和直觀的訓練演算法。該演算法從梯度向量中獲取優化信息,因此其為一階演算法(通過一階偏導求最優權重)。
如果我們指定 f(wi)= fi、?f(wi)= gi,那麼該優化方法由點 w0 開始迭代,在滿足終止條件之前,就在訓練方向 di=-gi 上將 wi 移向 wi+1。因此,梯度下降法就是如下方程式進行迭代。
其中參數 η 是學習速率。該學習速率的值可以設定為一個常量也可以沿著訓練方向使用單變數優化法求得。通常學習速率的最優值可以在連續迭代步(successive step)上通過線最小化(line minimization)獲得。然而,現在還是有很多機器學習模型僅僅只使用固定的學習速率。
下面是一張使用梯度下降演算法進行學習的流程圖。我們可以看到,參數向量通過兩步進行優化:首先,計算梯度下降的訓練方向。其次,尋找合適的學習速率。
梯度下降演算法也有一些缺點,首先就是其迭代方向會呈現一種鋸齒現象,其並不能朝著極小值點徑直優化,所以迭代的次數也就多,收斂的速度也就慢。當它的函數梯度圖又窄又長時(變數沒有歸一化,值處於不同的量級),迭代所需要的步數就會更多了。最速下降法確實沿著最陡的梯度下降,損失函數減少得最迅速,但這並不代表梯度下降法或最速下降法會最快收斂(因為鋸齒現象)。下圖就可以直觀地了解到這種鋸齒現象,因為非線性函數局部的梯度方向並不一定就是朝著最優點。並且該圖還表明,如果橫軸量級與縱軸量級有差別時,損失函數梯度圖會呈現為一種橢圓形,而如果從橢圓長半軸端點開始下降,那麼迭代步數就會很多。
在訓練大規模神經網路時,因為有上萬的參數,所以梯度下降法是比較有效的。因為梯度下降演算法儲存的梯度算符向量規模為 n,而海塞矩陣儲存的規模就為 n^2 了,同時梯度和海塞矩陣的計算量也是天差地別。
牛頓法
牛頓法是二階演算法,因為該演算法使用了海塞矩陣(Hessian matrix)求權重的二階偏導數。牛頓法的目標就是採用損失函數的二階偏導數尋找更好的訓練方向。現在我們將採用如下表示: f(wi) = fi、?f(wi) = gi 和 Hf(wi) = Hi。在 w0 點使用泰勒級數展開式二次逼近函數 f。
H0 為函數 f 在點 w0 的海塞矩陣。通過將 g 設定為 0,我們就可以找到 f(w) 的極小值,也就得到了以下方程式。
因此,從參數向量 w0 開始,牛頓法服從以下方式進行迭代:
向量 Hi-1·gi(參考上式)也就是所說的牛頓下降步(Newtons step)。注意,參數的這些變化將朝著極大值而不是極小值逼近,出現這樣的情況是因為海塞矩陣非正定。因此在不能保證矩陣正定的情況下,損失函數並不能保證在每一次迭代中都是減少的。為了防止上述問題,牛頓法的方程式通常可以修改為:
學習速率η同樣可是設定為固定常數或通過單變數優化取值。向量 d=Hi-1·gi(參考上式)現在就稱為牛頓訓練方向(Newtons training direction)。
使用牛頓法的訓練過程狀態圖就如下圖所示。從此圖可以看出來,系統首先通過獲得牛頓訓練方向,然後獲得合適的學習速率來進行參數的更新優化。
下面的梯度圖展示了牛頓法的性能。因為牛頓法是採用其損失函數的二階偏導數尋找更好的訓練下降方向,所以它相比梯度下降只要更少的迭代次數就能下降到損失函數的極小值,因此函數收斂速度也會大幅度地加快。
然而,牛頓法的困難之處在於其計算量,因為對海塞矩陣及其逆的精確求值在計算量方面是十分巨大的。
共軛梯度法(Conjugate gradient)
共軛梯度法可認為是梯度下降法和牛頓法的中間物。該演算法希望能加速梯度下降的收斂速度,同時避免使用海塞矩陣進行求值、儲存和求逆獲得必要的優化信息。
在共軛梯度訓練演算法中,因為是沿著共軛方向(conjugate directions)執行搜索的,所以通常該演算法要比沿著梯度下降方向優化收斂得更迅速。共軛梯度法的訓練方向是與海塞矩陣共軛的。
我們用 d 表示訓練方向向量,然後從初始參數向量 w0 和初始訓練方向向量 d0=-g0 開始,共軛梯度法所構建的訓練方向序列為:
在上式中,γ 稱之為共軛參數,並且有一些方法計算這個參數。兩種最常用的方法是源自 Fletcher、Reeves 和 Polak 、Ribiere。對於所有的共軛梯度演算法,訓練方向周期性地重置為負梯度向。
參數通過下面的表達式得以更新和優化。通常學習速率η可使用單變數函數優化方法求得。
共軛梯度法的訓練過程流程圖就如下所示。從圖中我們可以看出來模型是通過第一次計算共軛梯度訓練方向而優化參數的,然後再尋找適當的學習速率。
共軛梯度法已經證實其在神經網路中要比梯度下降法有效得多。並且由於共軛梯度法並沒有要求使用海塞矩陣,所以在大規模神經網路中其還是可以做到很好的性能。
擬牛頓法(Quasi-Newton method)
因為需要很多的操作求解海塞矩陣的值還有計算矩陣的逆,應用牛頓法所產生的計算量是十分巨大的。因此有一種稱之為擬牛頓法(quasi-Newton)或變數矩陣法來解決這樣的缺點。這些方法並不是直接計算海塞矩陣然後求其矩陣的逆,擬牛頓法是在每次迭代的時候計算一個矩陣,其逼近海塞矩陣的逆。最重要的是,該逼近值只是使用損失函數的一階偏導來計算。
海塞矩陣由損失函數的二階偏導組成,擬牛頓法背後的思想主要是僅使用損失函數的一階偏導數,通過另一矩陣 G 逼近海塞矩陣的逆。擬牛頓法的公式可以表示為:
學習速率 η可以設定為固定常數,也可以通過單變數函數優化得到。其中矩陣 G 逼近海塞矩陣的逆,且有不同的方式進行逼近。通常,最常用的兩種方式是 Davidon–Fletcher–Powell formula (DFP) 和 the Broyden–Fletcher–Goldfarb–Shanno formula (BFGS)。
擬牛頓法的訓練過程流程圖就如下所示。從圖中我們可以看出來模型是通過第一次計算擬牛頓訓練方向而優化參數的,然後再尋找適當的學習速率。
擬牛頓法適用於絕大多數案例中:它比梯度下降和共軛梯度法收斂更快,並且也不需要確切地計算海塞矩陣及其逆矩陣。
Levenberg-Marquardt 演算法
Levenberg-Marquardt 演算法,也稱之為衰減最小二乘法(damped least-squares method),該演算法的損失函數採用平方誤差和的形式。該演算法的執行也不需要計算具體的海塞矩陣,它僅僅只是使用梯度向量和雅可比矩陣(Jacobian matrix)。
該演算法的損失函數如下方程式所示為平方誤差和的形式:
在上式中,m 是數據集樣本的數量。
我們可以定義損失函數的雅可比矩陣以誤差對參數的偏導數為元素,如下方程式所示:
其中 m 是數據集樣本的數量,n 是神經網路的參數數量。那麼雅可比矩陣就是 m×n 階矩陣。
損失函數的梯度向量就可以按如下計算出來:
e 在這裡是所有誤差項的向量。
最終,我們可以用以下表達式逼近海塞矩陣:
其中λ為衰減因子,它確保了海塞矩陣的正定性(positiveness),I 是單位矩陣。
下面的表達式定義了 Levenberg-Marquardt 演算法中參數的更新和優化過程:
當衰減參數λ為 0 時,Levenberg-Marquardt 演算法就是使用海塞矩陣逼近值的牛頓法。而當 λ很大時,該演算法就近似於採用很小學習速率的梯度下降法。如果進行迭代導致了損失函數上升,衰減因子λ就會增加。如果損失函數下降,那麼λ就會下降,從而 Levenberg-Marquardt 演算法更接近於牛頓法。該過程經常用於加速收斂到極小值點。
使用 Levenberg-Marquardt 法的神經網路訓練過程狀態圖就如下圖所示。第一步就是計算損失函數、梯度和海塞矩陣逼近值,隨後再在每次迭代降低損失中調整衰減參數。
正如我們所了解到的,Levenberg-Marquardt 演算法是為平方誤差和函數所定製的。這就讓使用這種誤差度量的神經網路訓練地十分迅速。然而 Levenberg-Marquardt 演算法還有一些缺點,第一就是其不能用於平方根誤差或交叉熵誤差(cross entropy error)等函數,此外該演算法還和正則項不兼容。最後,對於大型數據集或神經網路,雅可比矩陣會變得十分巨大,因此也需要大量的內存。所以我們在大型數據集或神經網路中並不推薦採用 Levenberg-Marquardt 演算法。
內存與收斂速度的比較
下圖展示了所有上文所討論的演算法,及其收斂速度和內存需求。其中收斂速度最慢的是梯度下降演算法,但該演算法同時也只要求最少的內存。相反,Levenberg-Marquardt 演算法可能是收斂速度最快的,但其同時也要求最多的內存。比較折衷方法是擬牛頓法。
總而言之,如果我們的神經網路有數萬參數,為了節約內存,我們可以使用梯度下降或共軛梯度法。如果我們需要訓練多個神經網路,並且每個神經網路都只有數百參數、數千樣本,那麼我們可以考慮 Levenberg-Marquardt 演算法。而其餘的情況,擬牛頓法都能很好地應對。
選自neural designer機器之心編譯
推薦閱讀:
※Python寫簡單的線性分類器
※3blue1brown的神經網路:part1 筆記
※《A COMPARE-AGGREGATE MODEL FOR MATCHING TEXT SEQUENCES》閱讀筆記
※神經網路知識梳理——從神經元到深度學習