【梯度下降法】二:沖量(momentum)的原理與Python實現(xiàn)

前言

梯度下降法(Gradient Descent)是機器學(xué)習(xí)中最常用的優(yōu)化方法之一,常用來求解目標(biāo)函數(shù)的極值膜眠。

其基本原理非常簡單:沿著目標(biāo)函數(shù)梯度下降的方向搜索極小值(也可以沿著梯度上升的方向搜索極大值)拗踢。

但是如何調(diào)整搜索的步長(也叫學(xué)習(xí)率脚牍,Learning Rate)、如何加快收斂速度以及如何防止搜索時發(fā)生震蕩卻是一門值得深究的學(xué)問巢墅。

在上篇博客《【梯度下降法】一:快速教程诸狭、Python簡易實現(xiàn)以及對學(xué)習(xí)率的探討》中我們簡單分析了學(xué)習(xí)率大小對搜索過程的影響券膀,發(fā)現(xiàn):

  • 學(xué)習(xí)率較小時,收斂到極值的速度較慢驯遇。
  • 學(xué)習(xí)率較大時芹彬,容易在搜索過程中發(fā)生震蕩。

因此本篇博客將簡單講解“沖量”的原理以及如何用“沖量”來解決上述兩個問題叉庐。

全部源代碼可在本人的GitHub:monitor1379中下載舒帮。

沖量:momentum

“沖量”這個概念源自于物理中的力學(xué),表示力對時間的積累效應(yīng)陡叠。

在普通的梯度下降法x += v中玩郊,每次x的更新量vv = - dx * lr,其中dx為目標(biāo)函數(shù)func(x)x的一階導(dǎo)數(shù)匾竿,瓦宜。
當(dāng)使用沖量時,則把每次x的更新量v考慮為本次的梯度下降量- dx * lr與上次x的更新量v乘上一個介于[0, 1]的因子momentum的和岭妖,即v = - dx * lr + v * momemtum
從公式上可看出:

  • 當(dāng)本次梯度下降- dx * lr的方向與上次更新量v的方向相同時反璃,上次的更新量能夠?qū)Ρ敬蔚乃阉髌鸬揭粋€正向加速的作用昵慌。
  • 當(dāng)本次梯度下降- dx * lr的方向與上次更新量v的方向相反時,上次的更新量能夠?qū)Ρ敬蔚乃阉髌鸬揭粋€減速的作用淮蜈。

使用沖量的梯度下降法的Python代碼如下:

import numpy as np
import matplotlib.pyplot as plt


# 目標(biāo)函數(shù):y=x^2
def func(x):
    return np.square(x)


# 目標(biāo)函數(shù)一階導(dǎo)數(shù):dy/dx=2*x
def dfunc(x):
    return 2 * x

def GD_momentum(x_start, df, epochs, lr, momentum):
    """
    帶有沖量的梯度下降法斋攀。
    :param x_start: x的起始點
    :param df: 目標(biāo)函數(shù)的一階導(dǎo)函數(shù)
    :param epochs: 迭代周期
    :param lr: 學(xué)習(xí)率
    :param momentum: 沖量
    :return: x在每次迭代后的位置(包括起始點),長度為epochs+1
    """
    xs = np.zeros(epochs+1)
    x = x_start
    xs[0] = x
    v = 0
    for i in range(epochs):
        dx = df(x)
        # v表示x要改變的幅度
        v = - dx * lr + momentum * v
        x += v
        xs[i+1] = x
    return xs

為了查看momentum大小對不同學(xué)習(xí)率的影響梧田,此處設(shè)置學(xué)習(xí)率為lr = [0.01, 0.1, 0.6, 0.9]淳蔼,沖量依次為momentum = [0.0, 0.1, 0.5, 0.9],起始位置為x_start = -5裁眯,迭代周期為6鹉梨。測試以及繪圖代碼如下:


def demo2_GD_momentum():
    line_x = np.linspace(-5, 5, 100)
    line_y = func(line_x)
    plt.figure('Gradient Desent: Learning Rate, Momentum')

    x_start = -5
    epochs = 6

    lr = [0.01, 0.1, 0.6, 0.9]
    momentum = [0.0, 0.1, 0.5, 0.9]

    color = ['k', 'r', 'g', 'y']

    row = len(lr)
    col = len(momentum)
    size = np.ones(epochs+1) * 10
    size[-1] = 70
    for i in range(row):
        for j in range(col):
            x = GD_momentum(x_start, dfunc, epochs, lr=lr[i], momentum=momentum[j])
            plt.subplot(row, col, i * col + j + 1)
            plt.plot(line_x, line_y, c='b')
            plt.plot(x, func(x), c=color[i], label='lr={}, mo={}'.format(lr[i], momentum[j]))
            plt.scatter(x, func(x), c=color[i], s=size)
            plt.legend(loc=0)
    plt.show()

運行結(jié)果如下圖所示,每一行的圖的學(xué)習(xí)率lr一樣穿稳,每一列的momentum一樣存皂,最左列為不使用momentum時的收斂情況:

demo2_GD_momentum運行結(jié)果

簡單分析一下運行結(jié)果:

  • 從第一行可看出:在學(xué)習(xí)率較小的時候,適當(dāng)?shù)膍omentum能夠起到一個加速收斂速度的作用逢艘。
  • 從第四行可看出:在學(xué)習(xí)率較大的時候旦袋,適當(dāng)?shù)膍omentum能夠起到一個減小收斂時震蕩幅度的作用。

從上述兩點來看它改,momentum確實能夠解決在篇頭提到的兩個問題疤孕。

然而在第二行與第三行的最后一列圖片中也發(fā)現(xiàn)了一個問題,當(dāng)momentum較大時央拖,原本能夠正確收斂的時候卻因為剎不住車跑過頭了祭阀。那么怎么繼續(xù)解決這個新出現(xiàn)的問題呢鹉戚?下一篇博客《【梯度下降法】三:學(xué)習(xí)率衰減因子(decay)的原理與Python實現(xiàn)》將介紹如何使用學(xué)習(xí)率衰減因子decay來讓學(xué)習(xí)率隨著迭代周期不斷變小,讓梯度下降法收斂時的“震蕩”與“跑偏”進(jìn)一步減少的方法柬讨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末崩瓤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子踩官,更是在濱河造成了極大的恐慌却桶,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔗牡,死亡現(xiàn)場離奇詭異颖系,居然都是意外死亡,警方通過查閱死者的電腦和手機辩越,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門嘁扼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人黔攒,你說我怎么就攤上這事趁啸。” “怎么了督惰?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵不傅,是天一觀的道長。 經(jīng)常有香客問我赏胚,道長访娶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任觉阅,我火速辦了婚禮崖疤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘典勇。我一直安慰自己劫哼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布痴柔。 她就那樣靜靜地躺著沦偎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咳蔚。 梳的紋絲不亂的頭發(fā)上豪嚎,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音谈火,去河邊找鬼侈询。 笑死,一個胖子當(dāng)著我的面吹牛糯耍,可吹牛的內(nèi)容都是我干的扔字。 我是一名探鬼主播囊嘉,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼革为!你這毒婦竟也來了扭粱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤震檩,失蹤者是張志新(化名)和其女友劉穎琢蛤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抛虏,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡博其,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迂猴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慕淡。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沸毁,靈堂內(nèi)的尸體忽然破棺而出峰髓,到底是詐尸還是另有隱情,我是刑警寧澤息尺,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布儿普,位于F島的核電站,受9級特大地震影響掷倔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜个绍,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一勒葱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巴柿,春花似錦凛虽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钉迷,卻和暖如春至非,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糠聪。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工荒椭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舰蟆。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓趣惠,卻偏偏與公主長得像狸棍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子味悄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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