AI學(xué)習(xí)筆記:[3]梯度下降和反向傳播

上一篇回顧:《AI學(xué)習(xí)筆記:[2]神經(jīng)網(wǎng)絡(luò)向量化和成本函數(shù)》

回憶一下:要求解的問題

上一節(jié)學(xué)到成本函數(shù) J(w,b) ,我們的目標(biāo)是:求解 w 和 b 使得全局的成本J(w,b) 最小

回顧一下成本函數(shù) J(w,b):

再回顧一下神經(jīng)網(wǎng)絡(luò)的遞推公式:

這里:

  1. w[l] 的維度為 (n[l], n[l-1])
  2. b[l] 的維度為 (n[l], 1)

因此,對于 L 層神經(jīng)網(wǎng)絡(luò),我們要求出 (n[0] * n[1] + n[1] * n[2] + ... + n[L-1] * n[L]) 個 w[l](i) 以及 (n[1]+...+n[L]) 個 b[l](i),這里的 w[l] 和 b[l](i) 都是實數(shù)。

以如下這個2層的神經(jīng)網(wǎng)絡(luò)為例:

2層神經(jīng)網(wǎng)絡(luò)

其中:

  1. L=2,n[0]=2, n[1]=4, n[2]=1
  2. 要求解的對象 w[1] 為 (2, 4) 的矩陣,w[2] 為 (4, 1) 的矩陣,共 8 個 w;
  3. 要求解的對象 b[1] 為 (4, 1) 的列向量,b[2] 為 (1, 1) 的列向量,共 5 個 b。

梯度下降法

梯度下降法是一種求最優(yōu)解(但并不一定是真正的解,只是無限接近真正解)的算法。用負(fù)梯度方向為搜索方向,最速下降法越接近目標(biāo)值,步長越小,前進越慢。詳見 維基百科-梯度下降法

舉個例子可能更好理解。

比如函數(shù):f(x)=x2-2x,高中數(shù)學(xué)告訴我們,這個函數(shù)的頂點為 (1, -1),其最小值為-1。

f(x)=x^2-2x

首先求解f '(x):

我們嘗試用梯度下降法求解其最小值的方法 Python 代碼為:

def f(x):
  return x**2 - 2*x

def df(x):
  return 2*x - 2

def gd(start_x, step_x, iter_cnt, df):
    """
    Args:
        start_x  起點
        step_x   迭代步長,也稱為learing rate
        iter_cnt 迭代次數(shù)
        df       函數(shù)f(x)的導(dǎo)數(shù)
    """
    x = start_x
    for i in range(iter_cnt):
        g = df(x)
        x -= g * step_x
        print('[%2d] x=%f df(x)=%f f(%f)=%f' %(i, x, g, x, f(x)))
        if abs(g) < 1e-6:
            break;
    return x

# 從x=5起步,每次往前走0.05,迭代100次,前面定義的df當(dāng)做導(dǎo)數(shù)函數(shù)傳入
gd(5, 0.05, 100, df)

輸出結(jié)果為:

[ 0] x=4.600000 df(x)=8.000000 f(4.600000)=11.960000
[ 1] x=4.240000 df(x)=7.200000 f(4.240000)=9.497600
[ 2] x=3.916000 df(x)=6.480000 f(3.916000)=7.503056
[ 3] x=3.624400 df(x)=5.832000 f(3.624400)=5.887475
[ 4] x=3.361960 df(x)=5.248800 f(3.361960)=4.578855
[ 5] x=3.125764 df(x)=4.723920 f(3.125764)=3.518873
[ 6] x=2.913188 df(x)=4.251528 f(2.913188)=2.660287
[ 7] x=2.721869 df(x)=3.826375 f(2.721869)=1.964832
...
[24] x=1.287159 df(x)=0.638132 f(1.287159)=-0.917540
...
[35] x=1.090114 df(x)=0.200252 f(1.090114)=-0.991880
...
[99] x=1.000106 df(x)=0.000236 f(1.000106)=-1.000000

可以看到,開始的時候,梯度較大,因此下降速度很快,0到24步就逼近了1.9,而后面的35到99步才緩慢逼近到1.0,f(x) 找到的點(1.000106, -1.0) 非常接近于(1, -1)。

在神經(jīng)網(wǎng)絡(luò)中,由于變量 w 和 b 都是多維度的,因此問題從“求一個自變量函數(shù)的導(dǎo)數(shù)”轉(zhuǎn)變成“多變量函數(shù)的偏導(dǎo)數(shù)”。如下圖所示:

梯度下降法

用三維的圖形表示就是,實際上神經(jīng)網(wǎng)絡(luò)遠遠比三維圖形要復(fù)雜,用直觀的方式無法表達。

梯度下降法示意圖

數(shù)學(xué)回顧(1):導(dǎo)數(shù)以及鏈?zhǔn)椒▌t

梯度下降法里面很重要的一步是求導(dǎo)數(shù),然而并不是所有的函數(shù)都像x2-2x這么規(guī)范、這么容易求導(dǎo)的,這時候就要用到反向傳播。但在學(xué)習(xí)反向傳播之前,我們先重拾一下 導(dǎo)數(shù) 以及在神經(jīng)網(wǎng)絡(luò)中非常重要的 求導(dǎo)鏈?zhǔn)椒▌t。

  1. 淺談導(dǎo)數(shù)的意義
  2. 如何理解導(dǎo)數(shù)的概念 ?
  3. 微分和導(dǎo)數(shù)的關(guān)系是什么?兩者的幾何意義有什么不同?為什么要定義微分 ?

導(dǎo)數(shù)的計算公式和四則運算法則:

導(dǎo)數(shù)的計算和四則計算

導(dǎo)數(shù)的鏈?zhǔn)椒▌t:

鏈?zhǔn)椒▌t

數(shù)學(xué)回顧(2):偏導(dǎo)數(shù)以及計算方法

偏導(dǎo)數(shù)的定義詳見:偏導(dǎo)數(shù)

偏導(dǎo)數(shù)

正向傳播以及反向傳播

我們再來看一下整個神經(jīng)網(wǎng)絡(luò)的計算過程,先以 Logistic Regression 為例。

始終牢記在心里:我們最終是為了求解 w 和 b,使得 J(w,b) 最小。因此,我們要先求解 dw 和 db,然后通過梯度下降法,每個迭代中通過 w=w-dw,不斷地往前找,一直找到 dw 接近0為止(梯度為0,為最小值)。

再強調(diào)一下,在吳恩達的課程中,dw表示的是dL(a,y)/dw,可以認(rèn)為只取了分母而忽略了分子。

如下圖所示,正向傳播分成三個步驟:

  1. 計算z
  2. 計算a
  3. 計算L(a, y)

相反,我們需要計算的 dw, db,使用鏈?zhǔn)椒▌t可以計算出,如圖所示:

邏輯斯蒂回歸反向傳播

對圖中的公式進行整理,如下:


所以,我們最終需要計算如下四個算子:

da、dz、dw、db的計算步驟如下圖所示,注意其中計算 dσ(z)/dz 的計算過程和前文中的一樣。

邏輯斯蒂回歸反向傳播2

最終得到:

最終,我們得到了 dw 和 db 的計算公式,將其代入到梯度下降算法,當(dāng) dw 趨近于
0 以及 db 趨近于 0 時對應(yīng)的 w 和 b 就是我們要找的值。

不知不覺中又寫了不少了,這里只講解到邏輯斯蒂回歸的反向傳播,多層神經(jīng)網(wǎng)絡(luò)網(wǎng)絡(luò)的反向傳播以及對應(yīng)的偽代碼就留到下次繼續(xù)了。

提到反向傳播,最近有一個比較有意思的新聞是《被Geoffrey Hinton拋棄,反向傳播為何飽受質(zhì)疑?(附BP推導(dǎo))》,至少學(xué)習(xí)完這個課程,你可以看懂這篇新聞了。的確,像Hinton所說的那樣,人類大腦的原理并不是反向傳播,其實吳恩達也在各種各樣的場合反復(fù)撇清深度學(xué)習(xí)和人類大腦的關(guān)系,雖然人工智能的概念被炒作得非?;穑俏覀冞€是應(yīng)該意識到,深度學(xué)習(xí)只是一種更好的機器學(xué)習(xí)方法而已,至于人類大腦是怎么運作的,我們還知之甚少,更不用說去模擬或者仿造了。但是我們也應(yīng)該感到自豪的是,人類已經(jīng)開始往這個方向努力,就和文藝復(fù)興一樣,多年以后回首會認(rèn)為這是一個非常了不起的時代。

下一步

學(xué)到這里,一直是比較枯燥的數(shù)學(xué)推導(dǎo),吳恩達非常講究實戰(zhàn)與理論結(jié)合,因此下一周首先將反向傳播學(xué)習(xí)完,然后開始做課后練習(xí)了。我看GitHub上有人將課后Programming Assignments & Quiz Solutions,也是非常貼心的。

如果你喜歡本文,請不要吝嗇你的點贊或打賞~ 同時,歡迎你通過評論來一起交流或指正文中的錯誤

請關(guān)注我的賬號,預(yù)計會以一周一篇的頻率進行更新~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容