深度學習之momentum,RMSprop,Adam優化算法

momentum算法:
除了batch/mini-batch/stochastic gradient descent 梯度下降法,還有一種算法叫做momentum梯度下降法,運行速度幾乎總是快於標準的地圖下降法,簡而言之,基本的思想就是計算梯度的指數加權平均數,並利用該梯度更新權重 ,以下是batch/mini-batch gradient descent以及momentum梯度下降法走勢圖。
這裏寫圖片描述

藍線表示batch梯度下降法 ,紅線是momentum梯度下降法

我們會發現梯度下降法需要很多計算步驟,慢慢擺動到最小值,這種上下波動減慢了梯度下降法的速度,導致我們無法使用更大的學習率,結果可能會偏離函數的範圍,爲了避免擺動過大,我們需要使用較小的學習率,另一個看待問題的角度是在縱軸上,我們希望慢一點,但是在橫軸上,我們希望快一點,所以使用momentum梯度下降法,我們需要做的是,在每次迭代中,確切的說是在第t次迭代中,我麼要計算微分dw,db,注意是利用現有的mini-batch計算dw,db,如果使用batch梯度下降法,則現在的mini-batch就是全部的batch,對於batch梯度下降法的效果是一樣的。momentum的算法流程如下:
momentum
on iteration t:
compute dw,db on current mini-batch
V_dw=βV_dw+(1β)dw{\rm{V}}\_{\rm{dw}} = {\rm{\beta*V}}\_{\rm{dw}} + \left( {1 - \beta } \right)*dw
V_db=βV_db+(1β)db{\rm{V}}\_{\rm{db}} = {\rm{\beta*V}}\_{\rm{db}} + \left( {1 - \beta } \right)*db
w=wαVdw{\rm{w}} = {\rm{w}} - {\rm{\alpha Vdw}}
b=bαVdb{\rm{b}} = {\rm{b}} - {\rm{\alpha Vdb}}
在這裏β{\rm{\beta }}相當於摩擦力,db,dw相當於加速度,這樣就可以減緩梯度下降的幅度,如果平均這些梯度,就會發現這些縱軸上的擺動,平均值接近於零。因此用算法幾次迭代之後,發現momentum梯度下降法,最終以縱軸方向擺動小了,橫軸方向運動更快,因此算法走了一條更加直接的路徑。
在上述算法中,有兩個超參數,學習率α{\rm{\alpha }}以及參數β{\rm{\beta }},在這裏β{\rm{\beta }}控制着指數加權平均數,β{\rm{\beta }}最常用的值是0.9。

RMSprop算法:
上面講到momentum可以加快學習算法,還有一個叫做RMSprop算法,全稱是(root mean square prop)算法,他也可以加速梯度下降,算法流程如下:
on iteration t:
compute dw,db on current mini-batch
Sdw=βSdw+{1β}dw2{\rm{Sdw}} = {\rm{\beta Sdw}} + \left\{ {1- \beta } \right\}d{w^2}
Sdb=βSdb+{1β}db2{\rm{Sdb}} = {\rm{\beta Sdb}} + \left\{ {1- \beta } \right\}d{b^2}
w=wαdwSdw+ε{\rm{w}} = {\rm{w}} - {\rm{\alpha}}\frac{{dw}}{{\sqrt {Sdw + \varepsilon } }}
b=bαdbSdb+ε{\rm{b}} = {\rm{b}} - {\rm{\alpha}}\frac{{db}}{{\sqrt {Sdb + \varepsilon } }}
這裏需要說明的是,上面平方的操作是針對整個符號的,這樣做能夠保留微分平方的加權平均數。
我們來理解一下其原理,記得在w方向,我們希望學習速度快,而在垂直方向我們希望減小在縱軸上的擺動,所以有了Sdw和Sdb,我們希望Sdw相對較小,Sdb相對較大,所以我們要除以較大的數,從而減緩縱軸上的變化,在這裏,另一個影響是可以用一個更大的學習率,然後加快學習,從而無須擔心其在縱軸上的偏離。注意,這裏選擇加上ε{\rm{\varepsilon }},是爲了防止分母爲0,其實ε{\rm{\varepsilon }}對算法的真正意義不大,我們一般將ε{\rm{\varepsilon }}設置爲108{10^{ - 8}}.

Adam算法:
RMSprop以及Adam優化算法是少有的經受住考驗的兩種算法,他們已被證明適用於不同的深度學習結構。
Adam優化算法基本上就是將momentum和RMSprop結合在一起,我們來看看Adam算法的流程。使用Adam算法首先需要初始化
vdw=0,Sdw=0,Vdb=0,Sdb=0
on iteration t:
compute dw,db, using current mini-batch
V_dw=β1V_dw+(1β1)dw{\rm{V}}\_{\rm{dw}} = {\beta_1}{\rm{*V}}\_{\rm{dw}} + \left( {1 - {\beta _1}} \right)*dw
V_db=β1V_db+(1β1)db{\rm{V}}\_{\rm{db}} = {\beta_1}{\rm{*V}}\_{\rm{db}} + \left( {1 - {\beta _1}} \right)*db
momentum更新了β1{\beta _1}
Sdw=β2Sdw+{1β2}dw2{\rm{Sdw}} = {\beta _2}{\rm{Sdw}} +\left\{ {1 - {\beta _2}} \right\}d{w^2}
Sdb=β2Sdb+{1β2}db2{\rm{Sdb}} = {\beta _2}{\rm{Sdb}} +\left\{ {1 - {\beta _2}} \right\}d{b^2}
RMSprop更新了超參數β2{\beta _2} 注意:一般計算Adam優化算法的時候要計算偏差修正。
Vdw=β1Vdw+(1β1)dw{\rm{Vdw}} = {\beta _1}{\rm{Vdw}} + \left({1 - {\beta _1}} \right)dw
Vdb=β1Vdb+(1β1)db{\rm{Vdb}} = {\beta _1}{\rm{Vdb}} + \left({1 - {\beta _1}} \right)db
Vdwcorreted=Vdw(1β1t)V_{dw}^{correted} =\frac{{{\rm{Vdw}}}}{{\left( {1 - \beta _1^t} \right)}}
Vdbcorreted=Vdb(1β1t)V_{db}^{correted} =\frac{{{\rm{Vdb}}}}{{\left( {1 - \beta _1^t} \right)}}
Sdwcorreted=Sdw(1β2t)S_{dw}^{correted} = \frac{{{\rm{Sdw}}}}{{\left({1 - \beta _2^t} \right)}}
Sdbcorreted=Sdb(1β2t)S_{db}^{correted} = \frac{{{\rm{Sdb}}}}{{\left({1 - \beta _2^t} \right)}}
w=wαVdwcorrectedSdwcorrected+ε{\rm{w}} = {\rm{w}} - {\rm{\alpha}}\frac{{V_{dw}^{corrected}}}{{\sqrt {S_{dw}^{corrected} + \varepsilon } }}
b=bαVdbcorrectedSdbcorrected+εb = {\rm{b}} - {\rm{\alpha }}\frac{{V_{db}^{corrected}}}{{\sqrt{S_{db}^{corrected} + \varepsilon } }}
基本流程就是這樣,這裏有很多超參數,超參α{\rm{\alpha }}很重要,經常需要調整,β1{\rm{\beta_1 }}的常用缺省值爲0.9,這是dw的移動平均數,這是momentum涉及的項,至於超參數β2{\rm{\beta_2 }},Adam論文的作者給出的推薦值是0.998.
最後談談爲什麼叫Adam算法,Adam代表的事Adaptive Moment Estimation。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章