從梯度下降到擬牛頓法:詳解訓練神經網絡的五大學習算法
在神經網絡中,系統的學習過程一般是由訓練算法所主導。而現如今有許多不同的學習算法,它們每一個都有不同的特征和表現。因此本文力圖描述清楚五大學習算法的基本概念及優缺點,給讀者們闡明***化在神經網絡中的應用。
問題形式化
神經網絡中的學習過程可以形式化為最小化損失函數問題,該損失函數一般是由訓練誤差和正則項組成。誤差項會衡量神經網絡擬合數據集的好壞,也就是擬合數據所產生的誤差。正則項主要就是通過給特征權重增加罰項而控制神經網絡的有效復雜度,這樣可以有效地控制模型過擬合問題。
訓練損失函數取決于神經網絡中的自適應參數(偏置項和突觸權重)。我們很容易地將神經網絡的權重組合成一個 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在我們將采用如下表示: f(wi) = fi、ᐁf(wi) = gi 和 Hf(wi) = Hi。在 w0 點使用泰勒級數展開式二次逼近函數 f。
H0 為函數 f 在點 w0 的海塞矩陣。通過將 g 設定為 0,我們就可以找到 f(w) 的極小值,也就得到了以下方程式。
因此,從參數向量 w0 開始,牛頓法服從以下方式進行迭代:
向量 Hi-1·gi(參考上式)也就是所說的牛頓下降步(Newton's step)。注意,參數的這些變化將朝著極大值而不是極小值逼近,出現這樣的情況是因為海塞矩陣非正定。因此在不能保證矩陣正定的情況下,損失函數并不能保證在每一次迭代中都是減少的。為了防止上述問題,牛頓法的方程式通常可以修改為:
學習速率η同樣可是設定為固定常數或通過單變量優化取值。向量 d=Hi-1·gi(參考上式)現在就稱為牛頓訓練方向(Newton's 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 算法。而其余的情況,擬牛頓法都能很好地應對。
原文:https://www.neuraldesigner.com/blog/5_algorithms_to_train_a_neural_network
【本文是51CTO專欄機構機器之心的原創譯文,微信公眾號“機器之心( id: almosthuman2014)”】