一、 緣起
之前根據目前所學(看《遊戲編程中的人工智能》以及網上的各種博客文章等等資料),寫了一篇關於神經網絡實現手寫數字識別的文章,但隨着繼續學習(尤其是後來報了CSDN的《機器學習:機器學習40天精英計劃》課程),發覺之前的文章對反向傳播以及神經網絡的演化(或者說學習)論述的還很牽強,不夠到位,於是就想着再次整理一下關於反向傳播相關的知識,就權當做學習筆記吧。
二、分解神經元(人工神經細胞)
前面《神經網絡實現手寫數字識別(MNIST)》一文中展示了一個人工神經細胞的模型結構圖,如下所示:
從上圖中可以看出一個人工神經細胞其實是由多個函數複合而成的,詳細一點的分解就是如下所示:
以很色豎線爲界,左邊爲上面人工神經細胞模型的黃色部分:
右邊部分就是人工神經細胞的激活函數部分:
如果將兩個公式合二爲一可以寫爲:
三、數學原理
3.1 偏導數
在百度百科中對偏導數的解釋爲:
在數學中,一個多變量的函數的偏導數,就是它關於其中一個變量的導數而保持其他變量恆定(相對於全導數,在其中所有變量都允許變化)。偏導數在向量分析和微分幾何中是很有用的。
比如這裏有個二元函數
如果要求在
(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的偏導數。記作f′y(x0,y0) ,也就是:∂f∂y∣∣∣y=y0x=x0
偏導數反映的是函數沿座標軸正方向的變化率
3.2 鏈式法則
在百度百科中的解釋爲:
鏈式法則(英文chain rule)是微積分中的求導法則,用於求一個複合函數的導數,是在微積分的求導運算中一種常用的方法。
然後也舉了例子來說明,大概就是:
如果有這麼一個複合函數
其他形式:
拿一個具體的函數來說,比如:
這裏就是一個複合函數,
g(x)=x2+1 f(x)=sin(x) 既 f(g(x))=sin(g(x))
根據鏈式法則,對此函數求導爲:
鏈式法則用文字描述,就是“由兩個函數湊起來的複合函數,其導數等於裏邊函數代入外邊函數的值之導數,乘以裏邊函數的導數
3.3 反向傳播原理
簡單來說,反向傳播原理(或者說作用)就是,將神經細胞的輸出誤差反向傳播到神經細胞的輸入端,並以此(當然還會加上)來更新神經細胞輸入端的權重。
在詳細說明反向傳播原理之前,需要先理解幾個概念:
- 輸出誤差,既神經細胞的期望輸出與實際輸出之間的差值,其表達式爲:
δ=Ot−Or ,其中Ot 爲期望輸出,Or 爲實際輸出 - 學習率,用以控制神經網絡的學習速度的,實際就是用於控制神經細胞輸入權重調整幅度的
接下來就來詳細說說反向傳播原理,如神經細胞分解一章所示,我們可以將一個神經細胞分爲兩個部分
其一(前半部分:累加部分):
其二(後半部分:激活部分)
現在複合函數有了,輸出誤差的概念也有了,那這個反向傳播該如何傳呢?
前面介紹了求偏導和鏈式法則,在這裏就該是它們表演的時候了。
這裏也就分成兩個部分來看:
- 激活部分
從上面可以看出,激活部分是一個一元函數,其波形圖如下所示:
如上圖所示,假設點A就是我們期望的點,對應的y軸上的點
當一個神經細胞被激活,得到輸出之後(也就是完成正向傳播之後),我們將知道
但是在這裏,我們並不是要去求
具體的要如何來求這個變化率呢?
既然前面介紹偏導的時候已經說到“偏導數反映的是函數沿座標軸正方向的變化率”,而這裏的函數是一元函數,也就是說其導數(因是一元所以就不存在“偏”)反應的就是其變化率。
所以,這裏就可以使用激活部分的一元函數的導數來求解(傳播)從點A到點B的變化率。
因爲這裏的激活部分的一元函數是sigmoid函數,所以其導數爲(省略推導過程,直接看結果):
換一種形式如下:
這個函數就代表了將神經細胞輸出誤差反向傳播回來時的變化率,其中的x就是神經細胞的實際輸出
- 累加部分
如下是一個簡單的神經網絡:
上圖中神經綠色部分爲整個神經網絡的輸入數據,藍色部分爲隱含層神經細胞層,紅色部分爲輸出層神經細胞層。
這一部分和激活部分有點不一樣的是,這裏是一個複合函數,如下所示:
對這個函數進行第一步分解可得到:
也就是說,一個神經細胞包含n(
同理,累加部分輸出的誤差也是所有輸入共同貢獻的結果,所以在這裏我們就需要使用前面介紹的“鏈式法則”分別對每一個輸入求偏導數來獲得每一個輸入部分誤差貢獻,進而可以將誤差反向傳播到反向的下一層神經細胞層,也能進行權重更新。
以上面的簡單神經網絡爲例,假如這裏就是圖中神經細胞“
換一種形式(將
按照鏈式法則的規則,如果要求神經細胞
換一種形式:
同理可得:
當然,這裏其實仍然是一個複合函數,因爲不管是
具體的,對
對
因爲神經細胞的複合函數是由激活部分和累加部分組成的,也就是說根據鏈式法則神經細胞最終的輸出反向傳播的輸入端就是兩者函數的導數乘積,即:
其中:
所以終上所述,對於神經細胞
神經細胞
神經細胞
其中:
δ1 : 神經細胞f1(e) 的輸出誤差δ2 : 神經細胞f2(e) 的輸出誤差δx:神經細胞 f_3(e)$從最終輸出透過激活部分反向傳播到累加部分的誤差:δx=δ3∙O3r(1−O3r) ,其中:δ3=O3t−O3r 是$f_3(e)的最終輸出誤差w5,w7 : 是函數h1(O,w) 和函數h2(O,w) 分別對O1 和O2 求偏導數
注意:這裏神經細胞
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)
同理可得神經細胞
其中:
δx :和上面一樣η :學習率,控制神經網絡學習速度(或者說權重更新幅度)的係數
接下來就是在原有的權重基礎上對權重進行調整了。先來看一下神經網絡的正向傳播過程,在累加部分,因爲是所有輸入相加,所以權重值越大,最後得到的累加和也就越大。而在激活部分,從上面的sigmoid函數波形圖可以看出,也是輸入越大輸出就越大。也就是說整個神經細胞的輸出與權重之間近似於“單調遞增”關係。
在前面我們計算神經細胞最終的輸出誤差時,使用的是
注意:上面說,因爲定義的誤差公式爲:
誤差=期望值−實際值 ,所以要使用+ δw ,可能有的人會說,如果“實際值” 大於了“期望值” 怎麼辦呢?
這個沒有關係,如果如果“實際值” 大於了“期望值”了,那這個“誤差” 必然也是負值,而這個+ δw ,其實就相當於− |δw| ,也就是說相當於減小權重值,也能讓實際值逐漸逼近期望值
四、總結
以上是以直觀的方式分析神經細胞的輸入權重該如何更新調整(也就是反向傳播訓練神經網絡的過程),其實一般都是以“梯度下降法”來分析的。但是筆者對這一塊不太熟悉,網上搜索了很久,基本上都是說,使用梯度下降法,然後啪啪的拿出一堆公式,也不說明,神經網絡的梯度是啥? 與權重更新這些有啥關係,這個“下降”是如何下降的? 幾乎都是說就是沿着梯度下降的方向如何如何,有些不知所云。暫且就這樣吧,後續如果這塊搞明白了再單獨寫一篇梯度下降的內容或者更新到本篇內容當中。