再談神經網絡反向傳播原理

一、 緣起

之前根據目前所學(看《遊戲編程中的人工智能》以及網上的各種博客文章等等資料),寫了一篇關於神經網絡實現手寫數字識別的文章,但隨着繼續學習(尤其是後來報了CSDN的《機器學習:機器學習40天精英計劃》課程),發覺之前的文章對反向傳播以及神經網絡的演化(或者說學習)論述的還很牽強,不夠到位,於是就想着再次整理一下關於反向傳播相關的知識,就權當做學習筆記吧。

二、分解神經元(人工神經細胞)

前面《神經網絡實現手寫數字識別(MNIST)》一文中展示了一個人工神經細胞的模型結構圖,如下所示:

人工神經細胞

從上圖中可以看出一個人工神經細胞其實是由多個函數複合而成的,詳細一點的分解就是如下所示:

神經細胞分解

以很色豎線爲界,左邊爲上面人工神經細胞模型的黃色部分:

y=g(x,w)=j=0j=nwjxj

右邊部分就是人工神經細胞的激活函數部分:

f(x)=11+e(x)

如果將兩個公式合二爲一可以寫爲:

O=11+e((j=nj=0wjxj))

三、數學原理

3.1 偏導數

在百度百科中對偏導數的解釋爲:

在數學中,一個多變量的函數的偏導數,就是它關於其中一個變量的導數而保持其他變量恆定(相對於全導數,在其中所有變量都允許變化)。偏導數在向量分析和微分幾何中是很有用的。

比如這裏有個二元函數 z=f(x,y)

  • 如果要求在(x0,y0) 處對x的偏導,就需要將y固定在y0 處,將其看着常數,這個時候二元函數也就可以看做一個一元函數z=f(x,y0) ,然後就可以求出z=f(x,y0)x0 處的導數,也就是z=f(x,y)(x0,y0) 處對x的偏導數

  • 同理,將x固定x0 處,讓y有增量y ,如果極限存在 那麼此極限稱爲函數z=f(x,y)(x0,y0) 處對y的偏導數。記作fy(x0,y0) ,也就是:fyy=y0x=x0

偏導數反映的是函數沿座標軸正方向的變化率

3.2 鏈式法則

在百度百科中的解釋爲:

鏈式法則(英文chain rule)是微積分中的求導法則,用於求一個複合函數的導數,是在微積分的求導運算中一種常用的方法。

然後也舉了例子來說明,大概就是:

如果有這麼一個複合函數 f(g(x)) ,如果此函數對x求導,根據鏈式法則就應該是:

(f(g(x)))=f(g(x))g(x)

其他形式:yx=yz.zx

拿一個具體的函數來說,比如: y=sin(x2+1)

這裏就是一個複合函數,

  • g(x)=x2+1
  • f(x)=sin(x) 既 f(g(x))=sin(g(x))

根據鏈式法則,對此函數求導爲:

(f(g(x)))=f(g(x))g(x)=[sin(x2+1)]2x=2(cos(x2+1))x

鏈式法則用文字描述,就是“由兩個函數湊起來的複合函數,其導數等於裏邊函數代入外邊函數的值之導數,乘以裏邊函數的導數

3.3 反向傳播原理

簡單來說,反向傳播原理(或者說作用)就是,將神經細胞的輸出誤差反向傳播到神經細胞的輸入端,並以此(當然還會加上)來更新神經細胞輸入端的權重。

在詳細說明反向傳播原理之前,需要先理解幾個概念:

  • 輸出誤差,既神經細胞的期望輸出與實際輸出之間的差值,其表達式爲: δ=OtOr ,其中Ot 爲期望輸出,Or 爲實際輸出
  • 學習率,用以控制神經網絡的學習速度的,實際就是用於控制神經細胞輸入權重調整幅度的

接下來就來詳細說說反向傳播原理,如神經細胞分解一章所示,我們可以將一個神經細胞分爲兩個部分

其一(前半部分:累加部分):

g(xw)=j=0j=nwjxj

其二(後半部分:激活部分)

O=f(x)=11+e(x)

現在複合函數有了,輸出誤差的概念也有了,那這個反向傳播該如何傳呢?

前面介紹了求偏導和鏈式法則,在這裏就該是它們表演的時候了。

這裏也就分成兩個部分來看:

  • 激活部分

從上面可以看出,激活部分是一個一元函數,其波形圖如下所示:
sigmoid函數波形圖

如上圖所示,假設點A就是我們期望的點,對應的y軸上的點Ot 就是神經細胞的期望輸出值,對應的x軸上的點Xt 就是我們期望的神經細胞的累加部分能夠輸出的期望值。同理點B就是神經細胞實際輸出點。

當一個神經細胞被激活,得到輸出之後(也就是完成正向傳播之後),我們將知道OrXr 的值,又因爲是訓練,所以我們也會知道Ot 的值,然後根據這些已知的值又可以計算出神經細胞的期望輸出與實際輸出之間的誤差:δo=OtOr ,最後就只有Xt 是未知的。

但是在這裏,我們並不是要去求Xt 的值,既然是要講神經細胞的輸出誤差反向傳播回去,那麼我們要求的就是神經細胞累加部分的輸出誤差,也就是:δx=XtXr

具體的要如何來求這個變化率呢?

既然前面介紹偏導的時候已經說到“偏導數反映的是函數沿座標軸正方向的變化率”,而這裏的函數是一元函數,也就是說其導數(因是一元所以就不存在“偏”)反應的就是其變化率。

所以,這裏就可以使用激活部分的一元函數的導數來求解(傳播)從點A到點B的變化率。

因爲這裏的激活部分的一元函數是sigmoid函數,所以其導數爲(省略推導過程,直接看結果):

f(x)=f(x)(1f(x))

換一種形式如下:

h(x)=x(1x)

這個函數就代表了將神經細胞輸出誤差反向傳播回來時的變化率,其中的x就是神經細胞的實際輸出Or ,也就是說實際的輸出誤差δo 乘上這個變化率就能得到反向傳播回來的真實誤差.因此累加部分的輸出誤差爲:

δx=δoh(x)=δoOr(1Or)
  • 累加部分

如下是一個簡單的神經網絡:
簡單神經網絡

上圖中神經綠色部分爲整個神經網絡的輸入數據,藍色部分爲隱含層神經細胞層,紅色部分爲輸出層神經細胞層。

這一部分和激活部分有點不一樣的是,這裏是一個複合函數,如下所示:

g(xw)=j=0j=nwjxj

對這個函數進行第一步分解可得到:

g(xw)j=wjxj(0jn)

也就是說,一個神經細胞包含n(n>=1 )個輸入。所以神經細胞累加部分的輸出就是這n個輸入的累加和,也就是說,對於累加部分的輸出,這n個輸入均有各自的貢獻,其程度也受到各自權重w的影響。

同理,累加部分輸出的誤差也是所有輸入共同貢獻的結果,所以在這裏我們就需要使用前面介紹的“鏈式法則”分別對每一個輸入求偏導數來獲得每一個輸入部分誤差貢獻,進而可以將誤差反向傳播到反向的下一層神經細胞層,也能進行權重更新。

以上面的簡單神經網絡爲例,假如這裏就是圖中神經細胞“f3(e) ”的累加部分,由圖可知,f3(e) 的輸入包含f1(e)f2(e) 兩個神經細胞,其對應權重分別是w5w7 ,以公式表示f3(e) 的累加部分爲:

e3(O,w)=f1(e)w5+f2(e)w7

換一種形式(將fj(e)Oj 表示):

e3(O,w)=O1w5+O2w7

f3(e) 神經細胞的最終輸出表示爲:

O3=f3(e3(O,w))=f3(f1(e)w5+f2(e)w7)

按照鏈式法則的規則,如果要求神經細胞f1(e) 對神經細胞f3(e) 的輸出誤差的貢獻,就可以先將神經細胞f2(e) 的輸出和對應權重固定,也就是看着一個常數,因此在求導時,這個相加的常數項就直接爲0而忽略掉了,這時的函數形式變爲。

e3(O,w)w7=w70O2=O20=O1w5

換一種形式:

h1(O,w)=O1w5

同理可得:

h2(O,w)=O2w7

當然,這裏其實仍然是一個複合函數,因爲不管是O1 還是w5 都是變量,所以,如果我們對O1 求偏導數,就等於是將輸出誤差反向傳播到反向的下一層神經細胞層,如果對w5 求偏導數,就是獲得需要調整的權重w的變化量(當然這裏會需要加入學習率的控制)。

具體的,對O1 求偏導數的結果爲:

h1(O,w)Ow=w5=w5

w5 求偏導數的結果爲:

h1(O,w)wO=O1=O1

因爲神經細胞的複合函數是由激活部分和累加部分組成的,也就是說根據鏈式法則神經細胞最終的輸出反向傳播的輸入端就是兩者函數的導數乘積,即:

O=(f(g(x,w)))=f(g(x,w))g(x,w)

其中:
g(xw)=j=0j=nwjxj f(x)=11+e(x)

所以終上所述,對於神經細胞f3(e) ,其反向傳播給反向前一層的神經細胞的誤差爲:

神經細胞f3(e) 反向傳給f1(e) 傳給:

δ1=w5δx

神經細胞f3(e) 反向傳給f2(e) 的誤差:

δ2=w7δx

其中:

  • δ1 : 神經細胞f1(e) 的輸出誤差
  • δ2 : 神經細胞f2(e) 的輸出誤差
  • δx f_3(e)$從最終輸出透過激活部分反向傳播到累加部分的誤差:

    δx=δ3O3r(1O3r) ,其中:δ3=O3tO3r 是$f_3(e)的最終輸出誤差

  • w5,w7 : 是函數h1(O,w) 和函數h2(O,w) 分別對O1O2 求偏導數

注意:這裏神經細胞f1(e)f2(e) 的最終輸出誤差,也不僅僅只是上面的兩個公式計算的結果,由上面的網絡結構圖可以看出,這兩個神經細胞的輸出值不但對f3(e) 有貢獻,也同樣對f4(e) 有貢獻。所以f1(e)f2(e) 的最終輸出誤差爲:

δ1=δ1 from f3(e)+δ1 from f4(e) δ2=δ2 from f3(e)+δ2 from f4(e)

同理可得神經細胞f3(e) 的兩個輸入權重的變化量爲:

δw5=O1ηδx δw7=O2ηδx

其中:

  • δx :和上面一樣
  • η :學習率,控制神經網絡學習速度(或者說權重更新幅度)的係數

接下來就是在原有的權重基礎上對權重進行調整了。先來看一下神經網絡的正向傳播過程,在累加部分,因爲是所有輸入相加,所以權重值越大,最後得到的累加和也就越大。而在激活部分,從上面的sigmoid函數波形圖可以看出,也是輸入越大輸出就越大。也就是說整個神經細胞的輸出與權重之間近似於“單調遞增”關係。

在前面我們計算神經細胞最終的輸出誤差時,使用的是 = ,期望值是訓練神經網絡時輸入的標籤,是不變的。 所以要想誤差最小,就必須增大實際值去逼近期望值。而前面我們得出了神經細胞的輸入權重與最終輸出(即實際值)是“單調遞增”的關係,也就是要增大輸入權重。所以新權重w5w7 的值爲:

w5=w5+δw5 w7=w7+δw7

注意:上面說,因爲定義的誤差公式爲:= ,所以要使用 + δw ,可能有的人會說,如果“實際值” 大於了“期望值” 怎麼辦呢?
這個沒有關係,如果如果“實際值” 大於了“期望值”了,那這個“誤差” 必然也是負值,而這個+ δw ,其實就相當於 |δw| ,也就是說相當於減小權重值,也能讓實際值逐漸逼近期望值

四、總結

以上是以直觀的方式分析神經細胞的輸入權重該如何更新調整(也就是反向傳播訓練神經網絡的過程),其實一般都是以“梯度下降法”來分析的。但是筆者對這一塊不太熟悉,網上搜索了很久,基本上都是說,使用梯度下降法,然後啪啪的拿出一堆公式,也不說明,神經網絡的梯度是啥? 與權重更新這些有啥關係,這個“下降”是如何下降的? 幾乎都是說就是沿着梯度下降的方向如何如何,有些不知所云。暫且就這樣吧,後續如果這塊搞明白了再單獨寫一篇梯度下降的內容或者更新到本篇內容當中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章