【梯度下降法】一:快速教程佳簸、Python簡(jiǎn)易實(shí)現(xiàn)以及對(duì)學(xué)習(xí)率的探討

前言

梯度下降法(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ā)生震蕩卻是一門(mén)值得深究的學(xué)問(wèn)眼虱。接下來(lái)本文將分析第一個(gè)問(wèn)題:學(xué)習(xí)率的大小對(duì)搜索過(guò)程的影響喻奥。全部源代碼可在本人的GitHub:monitor1379中下載。

快速教程

前言啰嗦完了捏悬,接下來(lái)直接上干貨:如何編寫(xiě)梯度下降法撞蚕。代碼運(yùn)行環(huán)境為Python 2.7.11 + NumPy 1.11.0 + Matplotlib 1.5.1

首先先假設(shè)現(xiàn)在我們需要求解目標(biāo)函數(shù)func(x) = x * x的極小值过牙,由于func是一個(gè)凸函數(shù)诈豌,因此它唯一的極小值同時(shí)也是它的最小值仆救,其一階導(dǎo)函數(shù) 為dfunc(x) = 2 * x

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

接下來(lái)編寫(xiě)梯度下降法函數(shù):

# Gradient Descent
def GD(x_start, df, epochs, lr):
    """
    梯度下降法矫渔。給定起始點(diǎn)與目標(biāo)函數(shù)的一階導(dǎo)函數(shù)彤蔽,求在epochs次迭代中x的更新值
    :param x_start: x的起始點(diǎn)
    :param df: 目標(biāo)函數(shù)的一階導(dǎo)函數(shù)
    :param epochs: 迭代周期
    :param lr: 學(xué)習(xí)率
    :return: x在每次迭代后的位置(包括起始點(diǎn)),長(zhǎng)度為epochs+1
    """
    xs = np.zeros(epochs+1)
    x = x_start
    xs[0] = x
    for i in range(epochs):
        dx = df(x)
        # v表示x要改變的幅度
        v = - dx * lr
        x += v
        xs[i+1] = x
    return xs

需要注意的是參數(shù)df是一個(gè)函數(shù)指針庙洼,即需要傳進(jìn)我們的目標(biāo)函數(shù)一階導(dǎo)函數(shù)顿痪。

測(cè)試代碼如下,假設(shè)起始搜索點(diǎn)為-5油够,迭代周期為5蚁袭,學(xué)習(xí)率為0.3:

def demo0_GD():
    x_start = -5
    epochs = 5
    lr = 0.3
    x = GD(x_start, dfunc, epochs, lr=lr)
    print x
    # 輸出:[-5.     -2.     -0.8    -0.32   -0.128  -0.0512]

繼續(xù)修改一下demo0_GD函數(shù)以更加直觀地查看梯度下降法的搜索過(guò)程:

def demo0_GD():
    """演示如何使用梯度下降法GD()"""
    line_x = np.linspace(-5, 5, 100)
    line_y = func(line_x)

    x_start = -5
    epochs = 5

    lr = 0.3
    x = GD(x_start, dfunc, epochs, lr=lr)

    color = 'r'
    plt.plot(line_x, line_y, c='b')
    plt.plot(x, func(x), c=color, label='lr={}'.format(lr))
    plt.scatter(x, func(x), c=color, )
    plt.legend()
    plt.show()

從運(yùn)行結(jié)果來(lái)看,當(dāng)學(xué)習(xí)率為0.3的時(shí)候石咬,迭代5個(gè)周期似乎便能得到蠻不錯(cuò)的結(jié)果了揩悄。


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

梯度下降法確實(shí)是求解非線性方程極值的利器之一,但是如果學(xué)習(xí)率沒(méi)有調(diào)整好的話會(huì)發(fā)生什么樣的事情呢鬼悠?

學(xué)習(xí)率對(duì)梯度下降法的影響

在上節(jié)代碼的基礎(chǔ)上編寫(xiě)新的測(cè)試代碼demo1_GD_lr删性,設(shè)置學(xué)習(xí)率分別為0.1、0.3與0.9:


def demo1_GD_lr():
    # 函數(shù)圖像
    line_x = np.linspace(-5, 5, 100)
    line_y = func(line_x)
    plt.figure('Gradient Desent: Learning Rate')

    x_start = -5
    epochs = 5

    lr = [0.1, 0.3, 0.9]

    color = ['r', 'g', 'y']
    size = np.ones(epochs+1) * 10
    size[-1] = 70
    for i in range(len(lr)):
        x = GD(x_start, dfunc, epochs, lr=lr[i])
        plt.subplot(1, 3, i+1)
        plt.plot(line_x, line_y, c='b')
        plt.plot(x, func(x), c=color[i], label='lr={}'.format(lr[i]))
        plt.scatter(x, func(x), c=color[i])
        plt.legend()
    plt.show()

從下圖輸出結(jié)果可以看出兩點(diǎn)焕窝,在迭代周期不變的情況下:

  • 學(xué)習(xí)率較小時(shí)蹬挺,收斂到正確結(jié)果的速度較慢。
  • 學(xué)習(xí)率較大時(shí)它掂,容易在搜索過(guò)程中發(fā)生震蕩巴帮。
demo1_GD_lr運(yùn)行結(jié)果

綜上可以發(fā)現(xiàn),學(xué)習(xí)率大小對(duì)梯度下降法的搜索過(guò)程起著非常大的影響虐秋,為了解決上述的兩個(gè)問(wèn)題榕茧,接下來(lái)的博客《【梯度下降法】二:沖量(momentum)的原理與Python實(shí)現(xiàn)》將講解沖量(momentum)參數(shù)是如何在梯度下降法中起到加速收斂與減少震蕩的作用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末客给,一起剝皮案震驚了整個(gè)濱河市雪猪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌起愈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译仗,死亡現(xiàn)場(chǎng)離奇詭異抬虽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纵菌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)阐污,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人咱圆,你說(shuō)我怎么就攤上這事笛辟」Π保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵手幢,是天一觀的道長(zhǎng)捷凄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)围来,這世上最難降的妖魔是什么跺涤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮监透,結(jié)果婚禮上桶错,老公的妹妹穿的比我還像新娘。我一直安慰自己胀蛮,他們只是感情好院刁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著粪狼,像睡著了一般退腥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸳玩,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天阅虫,我揣著相機(jī)與錄音,去河邊找鬼不跟。 笑死颓帝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窝革。 我是一名探鬼主播购城,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虐译!你這毒婦竟也來(lái)了瘪板?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漆诽,失蹤者是張志新(化名)和其女友劉穎侮攀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厢拭,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兰英,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了供鸠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畦贸。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薄坏,到底是詐尸還是另有隱情趋厉,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布胶坠,位于F島的核電站君账,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏涵但。R本人自食惡果不足惜杈绸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矮瘟。 院中可真熱鬧瞳脓,春花似錦、人聲如沸澈侠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哨啃。三九已至烧栋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拳球,已是汗流浹背审姓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祝峻,地道東北人魔吐。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像莱找,于是被迫代替她去往敵國(guó)和親酬姆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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