干貨|神經(jīng)網(wǎng)絡及理解反向傳播
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
下面開始說神經(jīng)網(wǎng)絡。注意,當我們說N層神經(jīng)網(wǎng)絡的時候,我們沒有把輸入層算入(因為輸入層只是輸入數(shù)據(jù))。因此,單層的神經(jīng)網(wǎng)絡就是沒有隱層的(輸入直接映射到輸出)。而對于輸出層,也和神經(jīng)網(wǎng)絡中其他層不同,輸出層的神經(jīng)元一般是不會有激活函數(shù)的(或者也可以認為它們有一個線性相等的激活函數(shù))。這是因為最后的輸出層大多用于表示分類評分值,因此是任意值的實數(shù),然后用softmax得到分類值,或者直接某種實數(shù)值的目標數(shù)(比如在回歸中)。對于各種激活函數(shù)之后會寫。????
全連接層及其網(wǎng)絡
對于普通神經(jīng)網(wǎng)絡,最普通的層的類型是全連接層(fully-connected layer)。全連接層中的神經(jīng)元與其前后兩層的神經(jīng)元是完全成對連接的,但是在同一個全連接層內(nèi)的神經(jīng)元之間沒有連接。下面是兩個神經(jīng)網(wǎng)絡的圖例,都使用的全連接層:
左邊是一個2層神經(jīng)網(wǎng)絡,隱層由4個神經(jīng)元(也可稱為單元(unit))組成,輸出層由2個神經(jīng)元組成。右邊是一個3層神經(jīng)網(wǎng)絡,兩個含4個神經(jīng)元的隱層。
注意:層與層之間的神經(jīng)元是全連接的,但是層內(nèi)的神經(jīng)元不連接。
其中,用來度量神經(jīng)網(wǎng)絡的尺寸的標準主要有兩個:一個是神經(jīng)元的個數(shù),另一個是參數(shù)的個數(shù),用上面圖示的兩個網(wǎng)絡舉例:
第一個網(wǎng)絡有4+2=6個神經(jīng)元(輸入層不算),[3x4]+[4x2]=20個權(quán)重,還有4+2=6個偏置,共26個可學習的參數(shù)。
第二個網(wǎng)絡有4+4+1=9個神經(jīng)元,[3x4]+[4x4]+[4x1]=32個權(quán)重,4+4+1=9個偏置,共41個可學習的參數(shù)。
值得注意的是:現(xiàn)代神經(jīng)網(wǎng)絡能包含約1億個參數(shù),可由10-20層構(gòu)成(這就是深度學習)。但那么多參數(shù)是很容易學不來的,所以在卷積神經(jīng)網(wǎng)絡中,會使用參數(shù)共享和局部鏈接的方式來減少參數(shù),效果也更加的好。更多知識,后面講卷積神經(jīng)網(wǎng)絡的時候會講到。
首先,反向傳播的數(shù)學原理是“求導的鏈式法則” :

然后舉個簡單的例子說明鏈式求導:
我們以求e=(a+b)*(b+1)的偏導為例。它的復合關系畫出圖可以表示如下:
在圖中,引入了中間變量c,d。為了求出a=2, b=1時,e的梯度,我們可以先利用偏導數(shù)的定義求出不同層之間相鄰節(jié)點的偏導關系,如下圖所示。
利用鏈式法則我們知道:

鏈式法則在上圖中的意義是什么呢?其實不難發(fā)現(xiàn),
的值等于從a到e的路徑上的偏導值的乘積,而
的值等于從b到e的路徑1(b-c-e)上的偏導值的乘積加上路徑2(b-d-e)上的偏導值的乘積。也就是說,對于上層節(jié)點p和下層節(jié)點q,要求得
,需要找到從q節(jié)點到p節(jié)點的所有路徑,并且對每條路徑,求得該路徑上的所有偏導數(shù)之乘積,然后將所有路徑的 “乘積” 累加起來才能得到
的值。
但是,這就有一個比較大的問題,就是這樣做是十分冗余的,很多路徑被重復訪問。比如上圖中,a-c-e和b-c-e就都走了路徑c-e。對于權(quán)值動則數(shù)萬的深度模型中的神經(jīng)網(wǎng)絡,這樣的冗余所導致的計算量是相當大的。
同樣是利用鏈式法則,BP算法則機智地避開了這種冗余,它對于每一個路徑只訪問一次就能求頂點對所有下層節(jié)點的偏導值。(注意,這里他和普通鏈式求導計算方式不同的地方)
具體做法如下:正如反向傳播(BP)算法的名字說的那樣,BP算法是反向(自上往下)來尋找路徑的。從最上層的節(jié)點e開始,初始值為1,以層為單位進行處理。對于e的下一層的所有子節(jié)點,將1乘以e到某個節(jié)點路徑上的偏導值,并將結(jié)果“堆放”在該子節(jié)點中。等e所在的層按照這樣傳播完畢后,第二層的每一個節(jié)點都“堆放"些值,然后我們針對每個節(jié)點,把它里面所有“堆放”的值求和,就得到了頂點e對該節(jié)點的偏導。然后將這些第二層的節(jié)點各自作為起始頂點,初始值設為頂點e對它們的偏導值,以"層"為單位重復上述傳播過程,即可求出頂點e對每一層節(jié)點的偏導數(shù)。
加深理解做法:以上圖為例,節(jié)點c接受e發(fā)送的1*2并堆放起來,節(jié)點d接受e發(fā)送的1*3并堆放起來,至此第二層完畢,求出各節(jié)點總堆放量并繼續(xù)向下一層發(fā)送。節(jié)點c向a發(fā)送2*1并對堆放起來,節(jié)點c向b發(fā)送2*1并堆放起來,節(jié)點d向b發(fā)送3*1并堆放起來,至此第三層完畢,節(jié)點a堆放起來的量為2,節(jié)點b堆放起來的量為2*1+3*1=5, 即頂點e對b的偏導數(shù)為5.
以上例子部分參考知乎胡逸夫回答:如何直觀地解釋 back propagation 算法?
上面講述的是在簡化情況在的BP,下面講述在神經(jīng)網(wǎng)絡中的反向傳播,這里以簡單的多層感知機為例:
如上圖,我們先定義一個三層人工神經(jīng)網(wǎng)絡,layer1至layer3分別是輸入層、隱藏層和輸出層。首先定義說明一些變量:


然后,為了簡單起見,我們定義代價函數(shù)為均方差損失函數(shù)(當然,現(xiàn)在很多不是用這個損失函數(shù),至于為什么,會在下面一篇文章講述):

然后,更為了簡單來算,我們以一個輸入樣本為例進行說明,此時代價函數(shù)表示為:
計算最后一層神經(jīng)網(wǎng)絡產(chǎn)生的錯誤:
其中,表示Hadamard乘積,用于矩陣或向量之間點對點的乘法運算(注意這里的維數(shù)應該相同),推導如下:
由后往前,計算每一層神經(jīng)網(wǎng)絡產(chǎn)生的錯誤,注意這里是反向回傳錯誤的體現(xiàn)(這一步的推導最為關鍵)
所以我們得到:
這一步極為關鍵,需要前后換序、轉(zhuǎn)置等操作,進行維度的適應,當然,知乎也有對這種做法的講解:維數(shù)相容原則在反向傳播的應用,可以一看!
然后,我們應用錯誤計算權(quán)重的梯度
所以得到:
最后,我們計算偏置的梯度
最終得到:
整理一下整體過程如下:
對于訓練集中的每個樣本x,設置輸入層(Input layer)對應的激活值
前向傳播:
反向傳播:
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~
























