深度學習中的各種優(yōu)化算法

優(yōu)化算法的目的是為了優(yōu)化損失函數(shù)细燎,損失函數(shù)衡量的是模型與數(shù)據(jù)的偏離程度适滓,主要思想是計算損失函數(shù)關(guān)于參數(shù)的導數(shù)(多個參數(shù)時計算偏導數(shù)),然后沿導數(shù)的負方向迭代更新參數(shù)钠怯,一步步最小化損失函數(shù)佳魔。這類方法就叫做梯度下降法。

一階優(yōu)化算法

一階優(yōu)化算法只計算一階偏導呻疹,寫成矩陣就叫 Jacobian 矩陣吃引。

1.隨機梯度下降法SGD

Stochastic gradient descent

這里的隨機梯度下降法特指 minibatch SGD。這里隨機的意思就是每次隨機從訓練數(shù)據(jù)中選擇一批數(shù)據(jù)計算梯度來更新參數(shù)刽锤。具體流程如下:


Require: 學習率 \epsilon?

Require: 初始參數(shù) \theta?

??while 未滿足停止條件 do

???從訓練集中采樣m?個樣本\{x^{(1)}, ...,x^{(m)}\}?的小批量镊尺,其中x^{(i)}?對應目標為y^{(i)}?

???計算梯度:g=\frac{1}{m} \nabla_\theta \sum_iL(f(x^{(i)}, \theta), y^{(i)}) 其中\sum_iL(f(x^{(i)}, \theta), y^{(i)})?是當前批樣本的損失(誤差)

???應用更新:\theta=\theta-\epsilon g?

??end while


典型的流程如下(計算當前參數(shù)下的梯度并思,沿負梯度方向更新參數(shù)):

sgd

但隨機梯度下降法有個缺點庐氮,由于梯度越大更新不長越大,導致在峽谷類型的函數(shù)上收斂非常慢宋彼,會一直在比較陡的方向來回振蕩弄砍。如圖:

sgd

2.使用動量的隨機梯度下降 momentum

隨機梯度下降法固然有用,但有時候?qū)е率諗克俣缺容^慢输涕,想想一下在一個底比較平的碗里音婶,由于碗底的梯度此時已很小,所以每次參數(shù)更新的幅度也特別小莱坎,導致算法需要很久才能到達極小值處衣式。不過在碗壁處由于梯度大,所以更新幅度也大檐什。所以可以很自然的想碴卧,可以保留在碗壁處的運動趨勢,這樣在碗底就有更快的速度即更大的參數(shù)更新幅度乃正。這里就很容易聯(lián)想到動量住册,動量是物體質(zhì)量和速度的乘積,是物體在運動方向上保持運動的趨勢(牛頓第一定律瓮具,慣性定律)荧飞。

由于有速度的物體都有動量凡人,所以這里我們認為每次更新的參數(shù)的位置都有速度,當前時刻的速度會影響之后時刻的速度叹阔,當然假設(shè)物體是單位質(zhì)量划栓,運動時間是單位時間,而SGD則可以看做在任何位置都沒有速度或者速度只使用一次便消失条获,各時刻互不影響忠荞。我們先看看物理問題中動量的運用。

假設(shè)從山坡上滾下來一個球(光滑無摩擦)帅掘,受重力的影響委煤,會一直加速直到到達水平面,每一時刻它都有山坡切線方向的速度修档,也就是有動量碧绞,這里我們計算在某一位置S_{t-1}經(jīng)過單位時間后可以到達的位置S_t,如圖所示:

momentum

由于模型并不嚴謹吱窝,所以計算不會太考慮細節(jié)讥邻。S_t的計算方式如下:

v_t = v_{t-1} + a\Delta t =v_{t-1}+F\\ S_t = S_{t-1} + \Delta S \\ \begin{aligned} \Delta S &= v_{t-1}\Delta t + \frac{1}{2}a{\Delta t}^2 \\ &\approx v_{t-1}\Delta t + a{\Delta t}^2 \\ &= v_{t-1}+a \\ &= v_{t-1}+F \\ &=v_t \end{aligned} \\
所以:
S_t = S_{t-1} + v_t \\ v_t = v_{t-1} + F
如果把上面的 S 看做 \theta ,把 F 看做 -g 即負梯度院峡,就有:
\theta_t = \theta_{t-1} + v_t \\ v_t = v_{t-1}-g
這就是動量算法的基本思路兴使,也可以從簡單的角度理解,每次更新時都考慮歷史更新值照激,歷史更新值一直在累加发魄,所以如果遇到每次更新值方向一致(近似)的情況,那即是當前梯度很小俩垃,由于歷史累加也會在當前時間有較大的更新幅度励幼,也就是說在碗底運動時使用了碗壁處積攢的動能,收斂速度更快口柳,而且如果遇到峽谷類型的損失函數(shù)苹粟,也會一定程度上遏制在梯度大的方向上來回擺動,比如當前計算了梯度向左跃闹,而上一步計算的梯度是向右嵌削,兩個梯度向加就可以減小當前更新的幅度,保持穩(wěn)定辣卒,如圖所示:

momentum

在具體實現(xiàn)階段掷贾,需要考慮歷史累積梯度和當前梯度的權(quán)重睛榄,整體流程如下:


Require: 學習率 \epsilon荣茫, 動量參數(shù) \alpha

Require: 初始參數(shù) \theta ,初始速度 v

??while 未滿足停止條件 do

???從訓練集中采樣m個樣本\{x^{(1)}, ...,x^{(m)}\}的小批量场靴,其中x^{(i)}對應目標為y^{(i)}啡莉。

???計算梯度:g=\frac{1}{m} \nabla_\theta \sum_iL(f(x^{(i)}, \theta), y^{(i)})

???計算速度:v=\alpha v -\epsilon g?

???應用更新:\theta=\theta+v

??end while


具體流程參考下圖:

momentum

由于動量算法考慮了之前的速度港准,所以它有可能沖過局部極小值,但是也有可能沖過全局最優(yōu)值咧欣,在損失函數(shù)曲面情況較復雜的情況下浅缸,可能會多次沖過極小值又折返回來,使收斂不穩(wěn)定魄咕,也會浪費時間衩椒。

3.自適應學習率算法Adagrad

前面的 SGD 和 Momentum 算法都是手動設(shè)置學習率 \epsilon ,但是學習率往往難以設(shè)置卻對訓練過程影響很大,動量算法在一定程度上影響了學習率(\theta =\theta +v 而不是 \theta=\theta-\epsilon g ) 但是卻引入了新的動量參數(shù)哮兰。以上這些算法在所有參數(shù)上都使用了同一個學習率毛萌,但直觀上來說,每個參數(shù)的學習率應該是獨立的喝滞,應該在訓練階段自適應的調(diào)整每個參數(shù)的學習率阁将。Adagrad就是一種實現(xiàn)方法,基本思想是右遭,如果每個權(quán)重方向歷史梯度很大做盅,那么就該在這個方向減小學習率,以免越過極小點窘哈,同樣吹榴,如果某個權(quán)重方向歷史梯度較小,那么就可以在該方向使用大的學習率滚婉,加快收斂腊尚。Adagrad 使用所有歷史梯度的平方和的平方根,所以在設(shè)定初始學習率的情況下满哪,梯度較大的參數(shù)方向的學習率減小的很快婿斥,反之梯度較小的參數(shù)方向的學習率減小的比較慢,具體算法如下:


Require: 全局學習率 \epsilon

Require: 初始參數(shù) \theta

Require: 小常數(shù) \delta 哨鸭,為了數(shù)值穩(wěn)定使用民宿,大約設(shè)為10^{-7}

??初始化梯度累積變量 r=0

??while 未滿足停止條件 do

???從訓練集中采樣m個樣本\{x^{(1)}, ...,x^{(m)}\}的小批量,其中x^{(i)}對應目標為y^{(i)}像鸡。

???計算梯度:g=\frac{1}{m} \nabla_\theta \sum_iL(f(x^{(i)}, \theta), y^{(i)})

???累積平方梯度:r=r+g\bigodot g? (對應元素相乘)

???計算更新:\Delta \theta = \frac{\epsilon}{\delta+\sqrt{r}} \bigodot g 活鹰,只看其中一個參數(shù)更新就是:\Delta \theta^i=\frac{\epsilon}{\delta+\sqrt{\sum^t_{t=0}(g^i_t)^2}}g^i

???應用更新:\theta=\theta+\Delta \theta

??end while


Adagrad算法還可以從二階梯度分析,待續(xù)只估,主要參考李宏毅的Gradient Descent

雖然Adagrad效果不錯志群,但是從一開始就累積梯度平方會導致有效學習率過早和過量的減小。

4.自適應學習率算法RMSProp

RMSProp是Adagrad的修改版蛔钙,由于Adagrad使用了歷史所有的梯度锌云,所以很容易被歷史梯度影響難以做出快速調(diào)整,這點與Momentum比較像吁脱,但是Momentum有動量參數(shù)參數(shù)來控制歷史梯度的權(quán)重而Adagrad沒有這個機制桑涎,增加了這個機制就是RMSProp了彬向,控制歷史梯度的權(quán)重可以更快的對梯度變化做出調(diào)整。

具體算法如下:


Require: 全局學習率 \epsilon 攻冷,衰減速率 \rho

Require: 初始參數(shù) \theta

Require: 小常數(shù) \delta? 娃胆,為了數(shù)值穩(wěn)定使用,通常設(shè)為10^{-6}?

??初始化梯度累積變量 r=0?

??while 未滿足停止條件 do

???從訓練集中采樣m個樣本\{x^{(1)}, ...,x^{(m)}\}的小批量等曼,其中x^{(i)}對應目標為y^{(i)}里烦。

???計算梯度:g=\frac{1}{m} \nabla_\theta \sum_iL(f(x^{(i)}, \theta), y^{(i)})

???累積平方梯度:r=\rho r+(1-\rho)g\bigodot g? (對應元素相乘)

???計算更新:\Delta \theta = \frac{\epsilon}{\delta+\sqrt{r}} \bigodot g ,只看其中一個參數(shù)更新就是:\Delta \theta^i=\frac{\epsilon}{\delta+\sqrt{\sum^t_{t=0}(g^i_t)^2}}g^i

???應用更新:\theta=\theta+\Delta \theta

??end while


5.自適應學習率算法Adam

Adam 結(jié)合了RMSProp和Momentum 禁谦, 可以參考Adam的論文

具體算法如下:


Require: 全局學習率 \epsilon (建議默認為0.001)

Require: 矩估計的指數(shù)衰減速率招驴,\rho_1\rho_2 在區(qū)間 [0,1) 內(nèi)(建議默認分別為0.9和0.999)

Require: 初始參數(shù) \theta?

Require: 小常數(shù) \delta ,為了數(shù)值穩(wěn)定使用枷畏,通常設(shè)為10^{-6}

??初始化一階和二階矩變量 s=0 别厘, r=0

??初始化時間步 t=0

??while 未滿足停止條件 do

???從訓練集中采樣m?個樣本\{x^{(1)}, ...,x^{(m)}\}?的小批量,其中x^{(i)}?對應目標為y^{(i)}?拥诡。

???計算梯度:g=\frac{1}{m} \nabla_\theta \sum_iL(f(x^{(i)}, \theta), y^{(i)})

???t = t+1

???更新有偏一階矩估計(速度):s=\rho_1s+(1-\rho_1)g?

???更新有偏二階矩估計(累積平方梯度):r=\rho_2 r+(1-\rho_2)g\bigodot g (對應元素相乘)

???修正一階矩的偏差:\hat{s}=\frac{s}{1-\rho_1^t}?

???修正二階矩的偏差:\hat{r}=\frac{r}{1-\rho_2^t}?

???計算更新:\Delta \theta =- \epsilon \frac{\hat{s}}{\delta+\sqrt{\hat{r}}}? (逐元素應用操作)

???應用更新:\theta=\theta+\Delta \theta?

??end while


Adam論文中給出的與其他優(yōu)化算法的比較:

adam

6.各算法比較

optimization- imgur

image

optimizer2

二階優(yōu)化算法

二階優(yōu)化算法只計算二階偏導触趴,寫成矩陣就叫 Hessian 矩陣。

最簡單的二階優(yōu)化算法 牛頓法 渴肉,尋找函數(shù)的臨界點冗懦,臨界點有可能是極大極小點,也可能是鞍點仇祭,但是鞍點是不可取的披蕉,只有是極小點也就是Hessian矩陣正定時牛頓法才是適用的,不然牛頓法很可能找到鞍點而停止乌奇。

由于牛頓法這種尋找梯度為零(臨界點)的點的性質(zhì)没讲,導致無法成功運用在神經(jīng)網(wǎng)絡的訓練中。因為高維空間中有更多的鞍點礁苗。而低維空間的局部極小值更普遍爬凑。直觀上來理解:假設(shè)某個點每個二階偏導都大于零說明這個點事極小點,假設(shè)由拋硬幣決定二階導數(shù)的正負试伙,那在二維空間中某個點是極小點的概率就是1/2*1/2=1/4? 那在高維如五維空間中這個點是極小點的條件就是各個偏導都大于零嘁信,概率是1/2*1/2*1/2*1/2*1/2=1/32? 而只有其中一個偏導大于零的情況就比較常見。

高維空間中鞍點的激增或許就解釋了在神經(jīng)網(wǎng)絡訓練中為什么二階方法無法成功取代梯度下降法疏叨。(《深度學習》8.2)

參考資料

  1. 《深度學習》
  2. 李宏毅的在線課程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潘靖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚤蔓,更是在濱河造成了極大的恐慌卦溢,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異既绕,居然都是意外死亡,警方通過查閱死者的電腦和手機涮坐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門凄贩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人袱讹,你說我怎么就攤上這事疲扎。” “怎么了捷雕?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵椒丧,是天一觀的道長。 經(jīng)常有香客問我救巷,道長壶熏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任浦译,我火速辦了婚禮棒假,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘精盅。我一直安慰自己帽哑,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布叹俏。 她就那樣靜靜地躺著妻枕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粘驰。 梳的紋絲不亂的頭發(fā)上屡谐,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音蝌数,去河邊找鬼康嘉。 笑死,一個胖子當著我的面吹牛籽前,可吹牛的內(nèi)容都是我干的亭珍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼枝哄,長吁一口氣:“原來是場噩夢啊……” “哼肄梨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挠锥,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤众羡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蓖租,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粱侣,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡羊壹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了齐婴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片油猫。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖柠偶,靈堂內(nèi)的尸體忽然破棺而出情妖,到底是詐尸還是另有隱情,我是刑警寧澤诱担,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布毡证,位于F島的核電站,受9級特大地震影響蔫仙,放射性物質(zhì)發(fā)生泄漏料睛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一摇邦、第九天 我趴在偏房一處隱蔽的房頂上張望秦效。 院中可真熱鬧,春花似錦涎嚼、人聲如沸阱州。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苔货。三九已至,卻和暖如春立哑,著一層夾襖步出監(jiān)牢的瞬間夜惭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工铛绰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诈茧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓捂掰,卻偏偏與公主長得像敢会,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子这嚣,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容