深度學(xué)習(xí)之參數(shù)更新方法

參數(shù)的更新

神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)目的是找到使損失函數(shù)的值盡可能小的參數(shù),解決這個問題的過程稱為最優(yōu)化(optimization)

梯度下降法在每次迭代時,需要使用所有的訓(xùn)練數(shù)據(jù),這給求解大規(guī)模數(shù)據(jù)的優(yōu)化問題帶來了挑戰(zhàn)。

1.SGD

使用參數(shù)的梯度,沿梯度方向更新參數(shù),并重復(fù)這個步驟多次,從而逐漸靠
近最優(yōu)參數(shù),這個過程稱為隨機(jī)梯度下降法(stochastic gradient descent),
簡稱SGD。SGD是一個簡單的方法,不過比起胡亂地搜索參數(shù)空間,也算是“聰
明”的方法。

隨機(jī)梯度下降用單個訓(xùn)練樣本的損失來近似平均損失。隨機(jī)梯度下降法用單個訓(xùn)練數(shù)據(jù)即可對模型參數(shù)進(jìn)行一次更新,大大加快了收斂速率。該方法也非常適用于數(shù)據(jù)源源不斷到來的在線更新場景。

SGD的策略是:朝著當(dāng)前所在位置的坡度最大的方向前進(jìn)。
w=w-\eta\frac{\partial{L}}{\partial{W}}
用右邊的值更新左邊的值。

SGD是朝著梯度方向只前進(jìn)一定距離的方法。

class SGD:
    def __init__(self,lr=0.01):
        self.lr = lr
    def update(self, params, grads):
        for key in params.keys():
            params[key] -= self.lr*grads[key]

參數(shù) params 和 grads (與之前的神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)一樣)是字典型變量,按 params['W1'] 、 grads['W1'] 的形式,分別保存了權(quán)重參數(shù)和它們的梯度。

SGD的缺點(diǎn)

如果函數(shù)的形狀非均向,比如呈延伸狀,搜索的路徑就會非常低效。SGD低效的根本原因是,梯度的方向并沒有指向最小值的方向。

1.1 小批量梯度下降法

為了降低隨機(jī)梯度的方差,從而使得迭代算法更加穩(wěn)定,也為了充分利用高度優(yōu)化的矩陣運(yùn)算操作,在實(shí)際應(yīng)用中我們會同時處理若干訓(xùn)練數(shù)據(jù),該方法被稱為小批量梯度下降法(Mini-Batch Gradient Descent)。

注意:

(1)如何選取參數(shù)批量數(shù)據(jù)的個數(shù)m?在不同的應(yīng)用中,最優(yōu)的m通常會不一樣,需要通過調(diào)參選取。一般m取2的冪次時能充分利用矩陣運(yùn)算操作,所以可以在2的冪次中挑選最優(yōu)的取值,例如32、64、128、256等。

(2)如何挑選m個訓(xùn)練數(shù)據(jù)?為了避免數(shù)據(jù)的特定順序給算法收斂帶來的影
響,一般會在每次遍歷訓(xùn)練數(shù)據(jù)之前,先對所有的數(shù)據(jù)進(jìn)行隨機(jī)排序,然后在每
次迭代時按順序挑選m個訓(xùn)練數(shù)據(jù)直至遍歷完所有的數(shù)據(jù)。

(3)如何選取學(xué)習(xí)速率α?為了加快收斂速率,同時提高求解精度,通常會
采用衰減學(xué)習(xí)速率的方案:一開始算法采用較大的學(xué)習(xí)速率,當(dāng)誤差曲線進(jìn)入平
臺期后,減小學(xué)習(xí)速率做更精細(xì)的調(diào)整。最優(yōu)的學(xué)習(xí)速率方案也通常需要調(diào)參才
能得到。

隨機(jī)梯度下降無法準(zhǔn)確察覺出梯度的微笑變化,就很可能繞彎路或者停下來。

解決之道:慣性保持和環(huán)境感知

2.Momentum

想象一下紙團(tuán)在山谷和鞍點(diǎn)處的運(yùn)動軌跡,在山谷中紙團(tuán)受重力作用沿山道滾下,兩邊是不規(guī)則的山壁,紙團(tuán)不可避免地撞在山壁,由于質(zhì)量小受山壁彈力的干擾大,從一側(cè)山壁反彈回來撞向另一側(cè)山壁,結(jié)果來回震蕩地滾下;如果當(dāng)紙團(tuán)來到鞍點(diǎn)的一片平坦之地時,還是由于質(zhì)量小,速度很快減為零。紙團(tuán)的情況和隨機(jī)梯度下降法遇到的問題簡直如出一轍。直觀地,如果換成一個鐵球,當(dāng)沿山谷滾下時,不容易受到途中旁力的干擾,軌跡會更穩(wěn)更直;當(dāng)來到鞍點(diǎn)中心處,在慣性作用下繼續(xù)前行,從而有機(jī)會沖出這片平坦的陷阱。因此,有了動量方法,模型參數(shù)的迭代公式為
(6.3)v\leftarrow\alpha{v}-\eta\frac{\partial{L}}{\partial{W}}

(6.4)W\leftarrow W+v
當(dāng)前梯度相當(dāng)于加速度,當(dāng)前的v要依賴于上一時刻的v和加速度。這里新出現(xiàn)了一個變量v,對應(yīng)物理上的速度。式(6.3)表示了物體在梯度方向上受力,在這個力的作用下,物體的速度增加這一物理法則。

class Momentum:
def __init__(self, lr=0.01, momentum=0.9):
    self.lr = lr
    self.momentum = momentum
    self.v = None
def update(self, params, grads):
    if self.v is None:
        self.v = {}
        for key, val in params.items():
        self.v[key] = np.zeros_like(val)
    for key in params.keys():
        self.v[key] = self.momentum*self.v[key] - self.lr*grads[key]
        params[key] += self.v[key]

沿山谷滾下的鐵球,會受到沿坡道向下的力和與左右山壁碰撞的彈力。向下的力
穩(wěn)定不變,產(chǎn)生的動量不斷累積,速度越來越快;左右的彈力總是在不停切換,
動量累積的結(jié)果是相互抵消,自然減弱了球的來回震蕩。

3.AdaGrad

慣性的獲得基于歷史信息,除了從歷史信息獲得慣性,還能對周圍環(huán)境進(jìn)行感知。

我們希望更新頻率低的參數(shù)可以擁有較大的更新步幅,而更新頻率高的參數(shù)的步幅可以減小。

AdaGrad采用了學(xué)習(xí)率衰減的思想,為參數(shù)的每個元素適當(dāng)?shù)卣{(diào)整學(xué)習(xí)率。

AdaGrad方法采用“歷史梯度平方和”來衡量不同參數(shù)的梯度的稀疏性,取值越小表明越稀疏。
\theta_{t+1,i}=\theta_{t,i}-\frac{\eta}{\sqrt{\sum^{t}_{k=0}g^{2}_{k,i}+\epsilon}}g_{t,i}
其中θ_{t+1,i} 表示(t+1)時刻的參數(shù)向量θ_{t+1} 的第i個參數(shù),g_{k,i}表示k時刻的梯度向量g_k的第i個維度(方向)。另外,分母中求和的形式實(shí)現(xiàn)了退火過程,這是很多優(yōu)化技術(shù)中常見的策略,意味著隨著時間推移,\sum^{t}_{k=0}g^{2}_{k,i}是以前所有梯度的平方和,也就是說,以前的梯度大的(變動大的),它的學(xué)習(xí)速率 \frac{\eta}{\sqrt{\sum^{t}_{k=0}g^{2}_{k,i}+\epsilon}}越來越小,從而保證了算法的最終收斂。

AdaGrad會記錄過去所有梯度的平方和。因此,學(xué)習(xí)越深入,更新的幅度就越小。實(shí)際上,如果無止境地學(xué)習(xí),更新量就會變?yōu)?,完全不再更新。為了改善這個問題,可以使用RMSProp 方法。RMSProp方法并不是將過去所有的梯度一視同仁地相加,而是逐漸地遺忘過去的梯度,在做加法運(yùn)算時將新梯度的信息更多地反映出來。這種操作從專業(yè)上講,稱為“指數(shù)移動平均”,呈指數(shù)函數(shù)式地減小過去的梯度的尺度。
h\leftarrow h+\frac{\partial{L}}{\partial W} \cdot \frac{\partial L}{\partial W} \\ W \leftarrow W - \eta \frac{1}{\sqrt h}\frac{\partial L}{\partial W}
h保存了以前的所有梯度值的平方和。

class AdaGrad:
    def __init__(self,lr=0.01):
        self.lr = lr
        self.h = None
        
    def update(self,params,grads):
        if self.h is None:
            self.h = {}
            for key,val in params.items():
                self.h[key] = np.zeros_like(val)
    
    for key in params.keys():
        self.h[key] += grads[key] * grads[key]
        params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)

4. Adam

Momentum參照小球在碗中滾動的物理規(guī)則進(jìn)行移動,AdaGrad為參數(shù)的每個元素適當(dāng)?shù)卣{(diào)整更新步伐。Adam 方法將兩者結(jié)合。

一方面,Adam記錄梯度的一階矩(first moment),即過往梯度與當(dāng)前梯度的平均,這體現(xiàn)了慣性保持;另一方面,Adam還記錄梯度的二階矩(second moment),即過往梯度平方與當(dāng)前梯度平方的平均,這類似AdaGrad方法,體現(xiàn)了環(huán)境感知能力,為不同參數(shù)產(chǎn)生自適應(yīng)的學(xué)習(xí)速率。一階矩和二階矩采用類似于滑動窗口內(nèi)求平均的思想進(jìn)行融合,即當(dāng)前梯度和近一段時間內(nèi)梯度的平均值,時間久遠(yuǎn)的梯度對當(dāng)前平均值的貢獻(xiàn)呈指數(shù)衰減。
m_t = \beta_1m_{t-1}+(1-\beta_1)g_t \\ v_t = \beta_2v_{t-1}+(1-\beta_2)g^2_t
其中β 1 ,β 2 為衰減系數(shù),m t 是一階矩,v t 是二階矩。

如何理解一階矩和二階矩呢?一階矩相當(dāng)于估計(jì) :由于當(dāng)下梯度g_t 是隨機(jī)
采樣得到的估計(jì)結(jié)果,因此更關(guān)注它在統(tǒng)計(jì)意義上的期望;二階矩相當(dāng)于估計(jì)E[g^2_t]
,這點(diǎn)與AdaGrad方法不同,不是g^2_t 從開始到現(xiàn)在的加和,而是它的期望。它
們的物理意義是,當(dāng)||m t ||大且v t 大時,梯度大且穩(wěn)定,這表明遇到一個明顯的大
坡,前進(jìn)方向明確;當(dāng)||m t ||趨于零且v t 大時,梯度不穩(wěn)定,表明可能遇到一個峽
谷,容易引起反彈震蕩;當(dāng)||m t ||大且v t 趨于零時,這種情況不可能出現(xiàn);當(dāng)||m t ||趨于零且v t 趨于零時,梯度趨于零,可能到達(dá)局部最低點(diǎn),也可能走到一片坡度極緩的平地,此時要避免陷入平原(plateau)。另外,Adam方法還考慮了m t ,v t 在零初始值情況下的偏置矯正。具體來說,Adam的更新公式為
\theta_{t+1} = \theta_t-\frac{\eta*\hat{m_t}}{\sqrt{\hat{v_t}+\epsilon}}
其中,\hat{m_t}=\frac{m_t}{1-\beta^t_1},\hat{v_t}=\frac{v_t}{1-\beta^t_2}

參考書籍:《百面機(jī)器學(xué)習(xí)》、《深度學(xué)習(xí)入門 基于Python的理論與實(shí)現(xiàn)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,743評論 2 370