從梯度下降到擬牛頓法:詳解訓(xùn)練神經(jīng)網(wǎng)絡(luò)的五大學(xué)習(xí)算法
在神經(jīng)網(wǎng)絡(luò)中,系統(tǒng)的學(xué)習(xí)過(guò)程一般是由訓(xùn)練算法所主導(dǎo)。而現(xiàn)如今有許多不同的學(xué)習(xí)算法,它們每一個(gè)都有不同的特征和表現(xiàn)。因此本文力圖描述清楚五大學(xué)習(xí)算法的基本概念及優(yōu)缺點(diǎn),給讀者們闡明***化在神經(jīng)網(wǎng)絡(luò)中的應(yīng)用。
問(wèn)題形式化
神經(jīng)網(wǎng)絡(luò)中的學(xué)習(xí)過(guò)程可以形式化為最小化損失函數(shù)問(wèn)題,該損失函數(shù)一般是由訓(xùn)練誤差和正則項(xiàng)組成。誤差項(xiàng)會(huì)衡量神經(jīng)網(wǎng)絡(luò)擬合數(shù)據(jù)集的好壞,也就是擬合數(shù)據(jù)所產(chǎn)生的誤差。正則項(xiàng)主要就是通過(guò)給特征權(quán)重增加罰項(xiàng)而控制神經(jīng)網(wǎng)絡(luò)的有效復(fù)雜度,這樣可以有效地控制模型過(guò)擬合問(wèn)題。
訓(xùn)練損失函數(shù)取決于神經(jīng)網(wǎng)絡(luò)中的自適應(yīng)參數(shù)(偏置項(xiàng)和突觸權(quán)重)。我們很容易地將神經(jīng)網(wǎng)絡(luò)的權(quán)重組合成一個(gè) n 維權(quán)重向量 w,而訓(xùn)練損失就是以這些權(quán)重為變量的函數(shù)。下圖描述了損失函數(shù) f(w)。
如上圖所示,點(diǎn) w* 是訓(xùn)練損失函數(shù)的極小值點(diǎn)。在任意點(diǎn) A,損失函數(shù)能分別對(duì)權(quán)重求一階偏導(dǎo)數(shù)和二階偏導(dǎo)數(shù)。損失函數(shù)的一階偏導(dǎo)可以使用梯度算符來(lái)表示,其中每一個(gè)權(quán)重的損失函數(shù)梯度表示如下:
同樣,損失函數(shù)的二階偏導(dǎo)可以使用海塞矩陣(Hessian matrix)來(lái)表示,以下就是損失函數(shù)對(duì)權(quán)重向量每個(gè)元素的二階偏導(dǎo)數(shù):
最小化多變量連續(xù)可導(dǎo)函數(shù)的方法廣泛應(yīng)用于學(xué)習(xí)過(guò)程中,許多常規(guī)方法都將這種***化方法直接應(yīng)用于神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中。
單變量函數(shù)優(yōu)化(One-dimensional optimization)
雖然損失函數(shù)是由多變量決定的(權(quán)重的數(shù)量通常十分巨大),但首先理解單變量函數(shù)的優(yōu)化方法是十分重要的。并且實(shí)際上單變量?jī)?yōu)化方法經(jīng)常應(yīng)用到神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程中,超參數(shù)的調(diào)整就可以使用單變量?jī)?yōu)化法。
在實(shí)際模型中,許多訓(xùn)練算法都是首先計(jì)算出訓(xùn)練方向 d,然后確定在此訓(xùn)練方向上最小化訓(xùn)練損失 f(η)的學(xué)習(xí)速率η。下圖就展示了單變量函數(shù) f(η)的優(yōu)化過(guò)程,該優(yōu)化可求得***學(xué)習(xí)速率η*。
點(diǎn)η1 和點(diǎn)η2 定義了包含單變量函數(shù) f(η)***點(diǎn)η*的子區(qū)間
在該案例中,單變量?jī)?yōu)化法在給定單變量函數(shù)的情況下搜尋函數(shù)極小值。其中廣泛應(yīng)用的搜尋算法有黃金分割法(golden section)和 Brent 法。兩者都是在減少極小值所在的子區(qū)間,直到子區(qū)間中兩個(gè)端點(diǎn)間的距離小于定義的可容忍誤差。
多變量函數(shù)優(yōu)化(Multidimensional optimization)
神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過(guò)程可以形式化為求將訓(xùn)練損失函數(shù) f 最小化的參數(shù)向量 w*。數(shù)學(xué)或?qū)嶋H都證明如果神經(jīng)網(wǎng)絡(luò)的損失函數(shù)達(dá)到了極小值,那么梯度也必定為 0 向量。
通常情況下,損失函數(shù)為參數(shù)的非線性函數(shù),所以找到一個(gè)封閉的訓(xùn)練算法(closed training algorithms)求***解是不可能的。相反,我們考慮通過(guò)一系列迭代步在參數(shù)空間內(nèi)搜尋***解。在每一步迭代中,我們可以通過(guò)調(diào)整神經(jīng)網(wǎng)絡(luò)的參數(shù)降低損失函數(shù)的值。
通過(guò)這種方式,一般我們會(huì)由初始參數(shù)向量開始(通常為隨機(jī)初始化)訓(xùn)練神經(jīng)網(wǎng)絡(luò)。然后,算法會(huì)更新生成一組新參數(shù),訓(xùn)練損失函數(shù)也會(huì)在每一次算法迭代中使用更新的參數(shù)進(jìn)行函數(shù)值的降低。兩步迭代之間的的訓(xùn)練損失減少又稱之為訓(xùn)練損失衰減率(loss decrement)。***,當(dāng)訓(xùn)練過(guò)程滿足特定的條件或停止標(biāo)準(zhǔn)時(shí),訓(xùn)練算法就會(huì)停止迭代,而這個(gè)時(shí)候的參數(shù)也就是***參數(shù)(神經(jīng)網(wǎng)絡(luò)中可能是局部***解),神經(jīng)網(wǎng)絡(luò)的性能也由它們所決定。
下面,本文將描述在神經(jīng)網(wǎng)絡(luò)中最重要的學(xué)習(xí)算法。
梯度下降
梯度下降,又稱為最速下降法是一種非常簡(jiǎn)單和直觀的訓(xùn)練算法。該算法從梯度向量中獲取優(yōu)化信息,因此其為一階算法(通過(guò)一階偏導(dǎo)求***權(quán)重)。
如果我們指定 f(wi)= fi、ᐁf(wi)= gi,那么該優(yōu)化方法由點(diǎn) w0 開始迭代,在滿足終止條件之前,就在訓(xùn)練方向 di=-gi 上將 wi 移向 wi+1。因此,梯度下降法就是如下方程式進(jìn)行迭代。
其中參數(shù) η 是學(xué)習(xí)速率。該學(xué)習(xí)速率的值可以設(shè)定為一個(gè)常量也可以沿著訓(xùn)練方向使用單變量?jī)?yōu)化法求得。通常學(xué)習(xí)速率的***值可以在連續(xù)迭代步(successive step)上通過(guò)線最小化(line minimization)獲得。然而,現(xiàn)在還是有很多機(jī)器學(xué)習(xí)模型僅僅只使用固定的學(xué)習(xí)速率。
下面是一張使用梯度下降算法進(jìn)行學(xué)習(xí)的流程圖。我們可以看到,參數(shù)向量通過(guò)兩步進(jìn)行優(yōu)化:首先,計(jì)算梯度下降的訓(xùn)練方向。其次,尋找合適的學(xué)習(xí)速率。
梯度下降算法也有一些缺點(diǎn),首先就是其迭代方向會(huì)呈現(xiàn)一種鋸齒現(xiàn)象,其并不能朝著極小值點(diǎn)徑直優(yōu)化,所以迭代的次數(shù)也就多,收斂的速度也就慢。當(dāng)它的函數(shù)梯度圖又窄又長(zhǎng)時(shí)(變量沒(méi)有歸一化,值處于不同的量級(jí)),迭代所需要的步數(shù)就會(huì)更多了。最速下降法確實(shí)沿著最陡的梯度下降,損失函數(shù)減少得最迅速,但這并不代表梯度下降法或最速下降法會(huì)最快收斂(因?yàn)殇忼X現(xiàn)象)。下圖就可以直觀地了解到這種鋸齒現(xiàn)象,因?yàn)榉蔷€性函數(shù)局部的梯度方向并不一定就是朝著***點(diǎn)。并且該圖還表明,如果橫軸量級(jí)與縱軸量級(jí)有差別時(shí),損失函數(shù)梯度圖會(huì)呈現(xiàn)為一種橢圓形,而如果從橢圓長(zhǎng)半軸端點(diǎn)開始下降,那么迭代步數(shù)就會(huì)很多。
在訓(xùn)練大規(guī)模神經(jīng)網(wǎng)絡(luò)時(shí),因?yàn)橛猩先f(wàn)的參數(shù),所以梯度下降法是比較有效的。因?yàn)樘荻认陆邓惴▋?chǔ)存的梯度算符向量規(guī)模為 n,而海塞矩陣儲(chǔ)存的規(guī)模就為 n^2 了,同時(shí)梯度和海塞矩陣的計(jì)算量也是天差地別。
牛頓法
牛頓法是二階算法,因?yàn)樵撍惴ㄊ褂昧撕H仃?Hessian matrix)求權(quán)重的二階偏導(dǎo)數(shù)。牛頓法的目標(biāo)就是采用損失函數(shù)的二階偏導(dǎo)數(shù)尋找更好的訓(xùn)練方向。現(xiàn)在我們將采用如下表示: f(wi) = fi、ᐁf(wi) = gi 和 Hf(wi) = Hi。在 w0 點(diǎn)使用泰勒級(jí)數(shù)展開式二次逼近函數(shù) f。
H0 為函數(shù) f 在點(diǎn) w0 的海塞矩陣。通過(guò)將 g 設(shè)定為 0,我們就可以找到 f(w) 的極小值,也就得到了以下方程式。
因此,從參數(shù)向量 w0 開始,牛頓法服從以下方式進(jìn)行迭代:
向量 Hi-1·gi(參考上式)也就是所說(shuō)的牛頓下降步(Newton's step)。注意,參數(shù)的這些變化將朝著極大值而不是極小值逼近,出現(xiàn)這樣的情況是因?yàn)楹H仃嚪钦?。因此在不能保證矩陣正定的情況下,損失函數(shù)并不能保證在每一次迭代中都是減少的。為了防止上述問(wèn)題,牛頓法的方程式通??梢孕薷臑椋?/p>
學(xué)習(xí)速率η同樣可是設(shè)定為固定常數(shù)或通過(guò)單變量?jī)?yōu)化取值。向量 d=Hi-1·gi(參考上式)現(xiàn)在就稱為牛頓訓(xùn)練方向(Newton's training direction)。
使用牛頓法的訓(xùn)練過(guò)程狀態(tài)圖就如下圖所示。從此圖可以看出來(lái),系統(tǒng)首先通過(guò)獲得牛頓訓(xùn)練方向,然后獲得合適的學(xué)習(xí)速率來(lái)進(jìn)行參數(shù)的更新優(yōu)化。
下面的梯度圖展示了牛頓法的性能。因?yàn)榕nD法是采用其損失函數(shù)的二階偏導(dǎo)數(shù)尋找更好的訓(xùn)練下降方向,所以它相比梯度下降只要更少的迭代次數(shù)就能下降到損失函數(shù)的極小值,因此函數(shù)收斂速度也會(huì)大幅度地加快。
然而,牛頓法的困難之處在于其計(jì)算量,因?yàn)閷?duì)海塞矩陣及其逆的精確求值在計(jì)算量方面是十分巨大的。
共軛梯度法(Conjugate gradient)
共軛梯度法可認(rèn)為是梯度下降法和牛頓法的中間物。該算法希望能加速梯度下降的收斂速度,同時(shí)避免使用海塞矩陣進(jìn)行求值、儲(chǔ)存和求逆獲得必要的優(yōu)化信息。
在共軛梯度訓(xùn)練算法中,因?yàn)槭茄刂曹椃较?conjugate directions)執(zhí)行搜索的,所以通常該算法要比沿著梯度下降方向優(yōu)化收斂得更迅速。共軛梯度法的訓(xùn)練方向是與海塞矩陣共軛的。
我們用 d 表示訓(xùn)練方向向量,然后從初始參數(shù)向量 w0 和初始訓(xùn)練方向向量 d0=-g0 開始,共軛梯度法所構(gòu)建的訓(xùn)練方向序列為:
在上式中,γ 稱之為共軛參數(shù),并且有一些方法計(jì)算這個(gè)參數(shù)。兩種最常用的方法是源自 Fletcher、Reeves 和 Polak 、Ribiere。對(duì)于所有的共軛梯度算法,訓(xùn)練方向周期性地重置為負(fù)梯度向。
參數(shù)通過(guò)下面的表達(dá)式得以更新和優(yōu)化。通常學(xué)習(xí)速率η可使用單變量函數(shù)優(yōu)化方法求得。
共軛梯度法的訓(xùn)練過(guò)程流程圖就如下所示。從圖中我們可以看出來(lái)模型是通過(guò)***次計(jì)算共軛梯度訓(xùn)練方向而優(yōu)化參數(shù)的,然后再尋找適當(dāng)?shù)膶W(xué)習(xí)速率。
共軛梯度法已經(jīng)證實(shí)其在神經(jīng)網(wǎng)絡(luò)中要比梯度下降法有效得多。并且由于共軛梯度法并沒(méi)有要求使用海塞矩陣,所以在大規(guī)模神經(jīng)網(wǎng)絡(luò)中其還是可以做到很好的性能。
擬牛頓法(Quasi-Newton method)
因?yàn)樾枰芏嗟牟僮髑蠼夂H仃嚨闹颠€有計(jì)算矩陣的逆,應(yīng)用牛頓法所產(chǎn)生的計(jì)算量是十分巨大的。因此有一種稱之為擬牛頓法(quasi-Newton)或變量矩陣法來(lái)解決這樣的缺點(diǎn)。這些方法并不是直接計(jì)算海塞矩陣然后求其矩陣的逆,擬牛頓法是在每次迭代的時(shí)候計(jì)算一個(gè)矩陣,其逼近海塞矩陣的逆。最重要的是,該逼近值只是使用損失函數(shù)的一階偏導(dǎo)來(lái)計(jì)算。
海塞矩陣由損失函數(shù)的二階偏導(dǎo)組成,擬牛頓法背后的思想主要是僅使用損失函數(shù)的一階偏導(dǎo)數(shù),通過(guò)另一矩陣 G 逼近海塞矩陣的逆。擬牛頓法的公式可以表示為:
學(xué)習(xí)速率 η可以設(shè)定為固定常數(shù),也可以通過(guò)單變量函數(shù)優(yōu)化得到。其中矩陣 G 逼近海塞矩陣的逆,且有不同的方式進(jìn)行逼近。通常,最常用的兩種方式是 Davidon–Fletcher–Powell formula (DFP) 和 the Broyden–Fletcher–Goldfarb–Shanno formula (BFGS)。
擬牛頓法的訓(xùn)練過(guò)程流程圖就如下所示。從圖中我們可以看出來(lái)模型是通過(guò)***次計(jì)算擬牛頓訓(xùn)練方向而優(yōu)化參數(shù)的,然后再尋找適當(dāng)?shù)膶W(xué)習(xí)速率。
擬牛頓法適用于絕大多數(shù)案例中:它比梯度下降和共軛梯度法收斂更快,并且也不需要確切地計(jì)算海塞矩陣及其逆矩陣。
Levenberg-Marquardt 算法
Levenberg-Marquardt 算法,也稱之為衰減最小二乘法(damped least-squares method),該算法的損失函數(shù)采用平方誤差和的形式。該算法的執(zhí)行也不需要計(jì)算具體的海塞矩陣,它僅僅只是使用梯度向量和雅可比矩陣(Jacobian matrix)。
該算法的損失函數(shù)如下方程式所示為平方誤差和的形式:
在上式中,m 是數(shù)據(jù)集樣本的數(shù)量。
我們可以定義損失函數(shù)的雅可比矩陣以誤差對(duì)參數(shù)的偏導(dǎo)數(shù)為元素,如下方程式所示:
其中 m 是數(shù)據(jù)集樣本的數(shù)量,n 是神經(jīng)網(wǎng)絡(luò)的參數(shù)數(shù)量。那么雅可比矩陣就是 m×n 階矩陣。
損失函數(shù)的梯度向量就可以按如下計(jì)算出來(lái):
e 在這里是所有誤差項(xiàng)的向量。
最終,我們可以用以下表達(dá)式逼近海塞矩陣:
其中λ為衰減因子,它確保了海塞矩陣的正定性(positiveness),I 是單位矩陣。
下面的表達(dá)式定義了 Levenberg-Marquardt 算法中參數(shù)的更新和優(yōu)化過(guò)程:
當(dāng)衰減參數(shù)λ為 0 時(shí),Levenberg-Marquardt 算法就是使用海塞矩陣逼近值的牛頓法。而當(dāng) λ很大時(shí),該算法就近似于采用很小學(xué)習(xí)速率的梯度下降法。如果進(jìn)行迭代導(dǎo)致了損失函數(shù)上升,衰減因子λ就會(huì)增加。如果損失函數(shù)下降,那么λ就會(huì)下降,從而 Levenberg-Marquardt 算法更接近于牛頓法。該過(guò)程經(jīng)常用于加速收斂到極小值點(diǎn)。
使用 Levenberg-Marquardt 法的神經(jīng)網(wǎng)絡(luò)訓(xùn)練過(guò)程狀態(tài)圖就如下圖所示。***步就是計(jì)算損失函數(shù)、梯度和海塞矩陣逼近值,隨后再在每次迭代降低損失中調(diào)整衰減參數(shù)。
正如我們所了解到的,Levenberg-Marquardt 算法是為平方誤差和函數(shù)所定制的。這就讓使用這種誤差度量的神經(jīng)網(wǎng)絡(luò)訓(xùn)練地十分迅速。然而 Levenberg-Marquardt 算法還有一些缺點(diǎn),***就是其不能用于平方根誤差或交叉熵誤差(cross entropy error)等函數(shù),此外該算法還和正則項(xiàng)不兼容。***,對(duì)于大型數(shù)據(jù)集或神經(jīng)網(wǎng)絡(luò),雅可比矩陣會(huì)變得十分巨大,因此也需要大量的內(nèi)存。所以我們?cè)诖笮蛿?shù)據(jù)集或神經(jīng)網(wǎng)絡(luò)中并不推薦采用 Levenberg-Marquardt 算法。
內(nèi)存與收斂速度的比較
下圖展示了所有上文所討論的算法,及其收斂速度和內(nèi)存需求。其中收斂速度最慢的是梯度下降算法,但該算法同時(shí)也只要求最少的內(nèi)存。相反,Levenberg-Marquardt 算法可能是收斂速度最快的,但其同時(shí)也要求最多的內(nèi)存。比較折衷方法是擬牛頓法。
總而言之,如果我們的神經(jīng)網(wǎng)絡(luò)有數(shù)萬(wàn)參數(shù),為了節(jié)約內(nèi)存,我們可以使用梯度下降或共軛梯度法。如果我們需要訓(xùn)練多個(gè)神經(jīng)網(wǎng)絡(luò),并且每個(gè)神經(jīng)網(wǎng)絡(luò)都只有數(shù)百參數(shù)、數(shù)千樣本,那么我們可以考慮 Levenberg-Marquardt 算法。而其余的情況,擬牛頓法都能很好地應(yīng)對(duì)。
原文:https://www.neuraldesigner.com/blog/5_algorithms_to_train_a_neural_network
【本文是51CTO專欄機(jī)構(gòu)機(jī)器之心的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】