【梯度下降法】三:學(xué)習(xí)率衰減因子(decay)的原理與Python實(shí)現(xiàn)

前言

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

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

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

上兩篇博客《【梯度下降法】一:快速教程蔚出、Python簡(jiǎn)易實(shí)現(xiàn)以及對(duì)學(xué)習(xí)率的探討》《【梯度下降法】二:沖量(momentum)的原理與Python實(shí)現(xiàn)》分別介紹了學(xué)習(xí)率大小對(duì)搜索過(guò)程的影響以及“沖量”的原理以及如何用“沖量”來(lái)解決收斂速度慢與收斂時(shí)發(fā)生震蕩的問題弟翘。接下來(lái)本篇博客將介紹梯度下降法中的第三個(gè)超參數(shù):decay虫腋。

PS:本系列博客全部源代碼可在本人的GitHub:monitor1379中下載。

學(xué)習(xí)率衰減因子:decay

首先先回顧一下不同學(xué)習(xí)率下梯度下降法的收斂過(guò)程(示例代碼在GitHub上可下載):

demo1_GD_lr運(yùn)行結(jié)果

從上圖可看出稀余,學(xué)習(xí)率較大時(shí)悦冀,容易在搜索過(guò)程中發(fā)生震蕩,而發(fā)生震蕩的根本原因無(wú)非就是搜索的步長(zhǎng)邁的太大了睛琳。

回顧一下問題本身盒蟆,在使用梯度下降法求解目標(biāo)函數(shù)func(x) = x * x的極小值時(shí),更新公式為x += v师骗,其中每次x的更新量vv = - dx * lr历等,dx為目標(biāo)函數(shù)func(x)對(duì)x的一階導(dǎo)數(shù)”侔可以想到寒屯,如果能夠讓lr隨著迭代周期不斷衰減變小,那么搜索時(shí)邁的步長(zhǎng)就能不斷減少以減緩震蕩黍少。學(xué)習(xí)率衰減因子由此誕生:

lr_i = lr_start * 1.0 / (1.0 + decay * i)

上面的公式即為學(xué)習(xí)率衰減公式寡夹,其中lr_i為第i次迭代時(shí)的學(xué)習(xí)率,lr_start為原始學(xué)習(xí)率厂置,decay為一個(gè)介于[0.0, 1.0]的小數(shù)菩掏。
從公式上可看出:

  • decay越小,學(xué)習(xí)率衰減地越慢农渊,當(dāng)decay = 0時(shí)患蹂,學(xué)習(xí)率保持不變或颊。
  • decay越大砸紊,學(xué)習(xí)率衰減地越快,當(dāng)decay = 1時(shí)囱挑,學(xué)習(xí)率衰減最快醉顽。

使用decay的梯度下降法Python實(shí)現(xiàn)代碼如下:


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_decay(x_start, df, epochs, lr, decay):
    """
    帶有學(xué)習(xí)率衰減因子的梯度下降法。
    :param x_start: x的起始點(diǎn)
    :param df: 目標(biāo)函數(shù)的一階導(dǎo)函數(shù)
    :param epochs: 迭代周期
    :param lr: 學(xué)習(xí)率
    :param decay: 學(xué)習(xí)率衰減因子
    :return: x在每次迭代后的位置(包括起始點(diǎn))平挑,長(zhǎng)度為epochs+1
    """
    xs = np.zeros(epochs+1)
    x = x_start
    xs[0] = x
    v = 0
    for i in range(epochs):
        dx = df(x)
        # 學(xué)習(xí)率衰減
        lr_i = lr * 1.0 / (1.0 + decay * i)
        # v表示x要改變的幅度
        v = - dx * lr_i
        x += v
        xs[i+1] = x
    return xs

使用以下測(cè)試與繪圖代碼demo3_GD_decay來(lái)看一下當(dāng)學(xué)習(xí)率依次為lr = [0.1, 0.3, 0.9, 0.99]decay = [0.0, 0.01, 0.5, 0.9]時(shí)的效果如何:

def demo3_GD_decay():
    line_x = np.linspace(-5, 5, 100)
    line_y = func(line_x)
    plt.figure('Gradient Desent: Decay')

    x_start = -5
    epochs = 10

    lr = [0.1, 0.3, 0.9, 0.99]
    decay = [0.0, 0.01, 0.5, 0.9]

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

    row = len(lr)
    col = len(decay)
    size = np.ones(epochs + 1) * 10
    size[-1] = 70
    for i in range(row):
        for j in range(col):
            x = GD_decay(x_start, dfunc, epochs, lr=lr[i], decay=decay[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={}, de={}'.format(lr[i], decay[j]))
            plt.scatter(x, func(x), c=color[i], s=size)
            plt.legend(loc=0)
    plt.show()

運(yùn)行結(jié)果如下圖所示游添,其中每行圖片的學(xué)習(xí)率一樣、decay依次增加通熄,每列圖片decay一樣唆涝,學(xué)習(xí)率依次增加:

demo3_GD_decay運(yùn)行結(jié)果

簡(jiǎn)單分析一下結(jié)果:

  • 在所有行中均可以看出,decay越大唇辨,學(xué)習(xí)率衰減地越快廊酣。
  • 在第三行與第四行可看到,decay確實(shí)能夠?qū)φ鹗幤鸬綔p緩的作用赏枚。

那么亡驰,不同decay下學(xué)習(xí)率的衰減速度到底有多大的區(qū)別呢晓猛?接下來(lái)設(shè)置起始學(xué)習(xí)率為1.0,decay依次為[0.0, 0.001, 0.1, 0.5, 0.9, 0.99]凡辱,迭代周期為300時(shí)學(xué)習(xí)率衰減的情況戒职,測(cè)試與繪圖代碼如下:

def demo4_how_to_chose_decay():
    lr = 1.0
    iterations = np.arange(300)

    decay = [0.0, 0.001, 0.1, 0.5, 0.9, 0.99]
    for i in range(len(decay)):
        decay_lr = lr * (1.0 / (1.0 + decay[i] * iterations))
        plt.plot(iterations, decay_lr, label='decay={}'.format(decay[i]))

    plt.ylim([0, 1.1])
    plt.legend(loc='best')
    plt.show()

運(yùn)行結(jié)果如下圖所示⊥盖可以看到洪燥,當(dāng)decay為0.1時(shí),50次迭代后學(xué)習(xí)率已從1.0急劇降低到了0.2乳乌。如果decay設(shè)置得太大蚓曼,則可能會(huì)收斂到一個(gè)不是極值的地方呢∏张ぃ看來(lái)調(diào)參真是任重而道遠(yuǎn):

demo4_how_to_chose_decay運(yùn)行結(jié)果

后記

關(guān)于【梯度下降法】的三個(gè)超參數(shù)的原理纫版、實(shí)現(xiàn)以及優(yōu)缺點(diǎn)已經(jīng)介紹完畢。對(duì)機(jī)器學(xué)習(xí)客情、深度學(xué)習(xí)與計(jì)算機(jī)視覺感興趣的童鞋可以關(guān)注本博主的簡(jiǎn)書博客以及GitHub:monitor1379哦~后續(xù)將繼續(xù)上更多的硬干貨其弊,謝謝大家的支持:P

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膀斋,隨后出現(xiàn)的幾起案子梭伐,更是在濱河造成了極大的恐慌,老刑警劉巖仰担,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糊识,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡摔蓝,警方通過(guò)查閱死者的電腦和手機(jī)赂苗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贮尉,“玉大人拌滋,你說(shuō)我怎么就攤上這事〔卵瑁” “怎么了败砂?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)魏铅。 經(jīng)常有香客問我昌犹,道長(zhǎng),這世上最難降的妖魔是什么览芳? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任斜姥,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疾渴。我一直安慰自己千贯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布搞坝。 她就那樣靜靜地躺著搔谴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桩撮。 梳的紋絲不亂的頭發(fā)上敦第,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音店量,去河邊找鬼芜果。 笑死,一個(gè)胖子當(dāng)著我的面吹牛融师,可吹牛的內(nèi)容都是我干的右钾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼旱爆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼舀射!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起怀伦,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脆烟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后房待,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邢羔,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年桑孩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拜鹤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洼怔,死狀恐怖署惯,靈堂內(nèi)的尸體忽然破棺而出左驾,到底是詐尸還是另有隱情镣隶,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布诡右,位于F島的核電站安岂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帆吻。R本人自食惡果不足惜域那,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧次员,春花似錦败许、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刹衫,卻和暖如春醋寝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背带迟。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工音羞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仓犬。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓嗅绰,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親搀继。 傳聞我的和親對(duì)象是個(gè)殘疾皇子办陷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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