如何直观的解释back propagation算法?
生活随笔
收集整理的這篇文章主要介紹了
如何直观的解释back propagation算法?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者:Evan Hoo
鏈接:http://www.zhihu.com/question/27239198/answer/89853077
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
BackPropagation算法是多層神經網絡的訓練中舉足輕重的算法。
簡單的理解,它的確就是復合函數的鏈式法則,但其在實際運算中的意義比鏈式法則要大的多。
要回答題主這個問題“如何直觀的解釋back propagation算法?” 需要先直觀理解多層神經網絡的訓練。
機器學習可以看做是數理統計的一個應用,在數理統計中一個常見的任務就是擬合,也就是給定一些樣本點,用合適的曲線揭示這些樣本點隨著自變量的變化關系。
深度學習同樣也是為了這個目的,只不過此時,樣本點不再限定為(x, y)點對,而可以是由向量、矩陣等等組成的廣義點對(X,Y)。而此時,(X,Y)之間的關系也變得十分復雜,不太可能用一個簡單函數表示。然而,人們發現可以用多層神經網絡來表示這樣的關系,而多層神經網絡的本質就是一個多層復合的函數。借用網上找到的一幅圖[1],來直觀描繪一下這種復合關系。
和直線擬合一樣,深度學習的訓練也有一個目標函數,這個目標函數定義了什么樣的參數才算一組“好參數”,不過在機器學習中,一般是采用成本函數(cost function),然后,訓練目標就是通過調整每一個權值Wij來使得cost達到最小。cost函數也可以看成是由所有待求權值Wij為自變量的復合函數,而且基本上是非凸的,即含有許多局部最小值。但實際中發現,采用我們常用的梯度下降法就可以有效的求解最小化cost函數的問題。
梯度下降法需要給定一個初始點,并求出該點的梯度向量,然后以負梯度方向為搜索方向,以一定的步長進行搜索,從而確定下一個迭代點,再計算該新的梯度方向,如此重復直到cost收斂。那么如何計算梯度呢?
假設我們把cost函數表示為, 那么它的梯度向量[2]就等于, 其中表示正交單位向量。為此,我們需求出cost函數H對每一個權值Wij的偏導數。而BP算法正是用來求解這種多層復合函數的所有變量的偏導數的利器。
我們以求e=(a+b)*(b+1)的偏導[3]為例。
它的復合關系畫出圖可以表示如下:
在圖中,引入了中間變量c,d。在圖中,引入了中間變量c,d。
為了求出a=2, b=1時,e的梯度,我們可以先利用偏導數的定義求出不同層之間相鄰節點的偏導關系,如下圖所示。
利用鏈式法則我們知道:利用鏈式法則我們知道:
以及。
鏈式法則在上圖中的意義是什么呢?其實不難發現,的值等于從a到e的路徑上的偏導值的乘積,而的值等于從b到e的路徑1(b-c-e)上的偏導值的乘積加上路徑2(b-d-e)上的偏導值的乘積。也就是說,對于上層節點p和下層節點q,要求得,需要找到從q節點到p節點的所有路徑,并且對每條路徑,求得該路徑上的所有偏導數之乘積,然后將所有路徑的 “乘積” 累加起來才能得到的值。
大家也許已經注意到,這樣做是十分冗余的,因為很多路徑被重復訪問了。比如上圖中,a-c-e和b-c-e就都走了路徑c-e。對于權值動則數萬的深度模型中的神經網絡,這樣的冗余所導致的計算量是相當大的。
同樣是利用鏈式法則,BP算法則機智地避開了這種冗余,它對于每一個路徑只訪問一次就能求頂點對所有下層節點的偏導值。
正如反向傳播(BP)算法的名字說的那樣,BP算法是反向(自上往下)來尋找路徑的。
從最上層的節點e開始,初始值為1,以層為單位進行處理。對于e的下一層的所有子節點,將1乘以e到某個節點路徑上的偏導值,并將結果“堆放”在該子節點中。等e所在的層按照這樣傳播完畢后,第二層的每一個節點都“堆放"些值,然后我們針對每個節點,把它里面所有“堆放”的值求和,就得到了頂點e對該節點的偏導。然后將這些第二層的節點各自作為起始頂點,初始值設為頂點e對它們的偏導值,以"層"為單位重復上述傳播過程,即可求出頂點e對每一層節點的偏導數。
以上圖為例,節點c接受e發送的1*2并堆放起來,節點d接受e發送的1*3并堆放起來,至此第二層完畢,求出各節點總堆放量并繼續向下一層發送。節點c向a發送2*1并對堆放起來,節點c向b發送2*1并堆放起來,節點d向b發送3*1并堆放起來,至此第三層完畢,節點a堆放起來的量為2,節點b堆放起來的量為2*1+3*1=5, 即頂點e對b的偏導數為5.
舉個不太恰當的例子,如果把上圖中的箭頭表示欠錢的關系,即c→e表示e欠c的錢。以a, b為例,直接計算e對它們倆的偏導相當于a, b各自去討薪。a向c討薪,c說e欠我錢,你向他要。于是a又跨過c去找e。b先向c討薪,同樣又轉向e,b又向d討薪,再次轉向e。可以看到,追款之路,充滿艱辛,而且還有重復,即a, b 都從c轉向e。
而BP算法就是主動還款。e把所欠之錢還給c,d。c,d收到錢,樂呵地把錢轉發給了a,b,皆大歡喜。
------------------------------------------------------------------
【參考文獻】
[1] 技術向:一文讀懂卷積神經網絡CNN
[2] Gradient
[3] http://colah.github.io/posts/2015-08-Backprop/
其他推薦網頁:
1. tensorflow.org 的頁面
2. Neural networks and deep learning 編輯于 2016-04-1610 條評論感謝 收藏?沒有幫助?舉報?作者保留權利 達聞西 知乎用戶、雪天、凃杉等人贊同 這大概是題主想要的吧(多圖):源地址:http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html顯示全部 這大概是題主想要的吧(多圖):
源地址:源地址:http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html 編輯于 2015-04-018 條評論感謝 收藏?沒有幫助?舉報?作者保留權利 知乎用戶,THU.CS PhD student 知乎用戶、知乎用戶、Zhaoyang Shao等人贊同 就是一個求導的鏈式法則嘛。。。 就是一個求導的鏈式法則嘛。。。 發布于 2014-12-25添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 Captain Jack 不是歸人贊同 拿紙和筆,定個最簡單的三層網絡,分別對各權值求偏導. 拿紙和筆,定個最簡單的三層網絡,分別對各權值求偏導. 發布于 2014-12-25添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 知乎用戶,working on RL 劍橋橋頭贊同 可以理解為誤差分配。對應于強化學習中的信度分配問題。…… 可以理解為誤差分配。對應于強化學習中的信度分配問題。…… 發布于 2014-12-25添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 土羊羊,加油,2015(? ??_??)? 劉dl、不是歸人贊同 哪個結點對“我”有貢獻,反過來要回報它→_→ 哪個結點對“我”有貢獻,反過來要回報它→_→ 發布于 2015-09-151 條評論感謝 收藏?沒有幫助?舉報?作者保留權利 peng sun,匿名愛好者 叫你三聲敢答應嗎贊同 神經網絡用圖來表示復合函數。所以對復合函數求導時,鏈式法則這一代數運算就能被表示成圖上的消息傳遞。 神經網絡用圖來表示復合函數。所以對復合函數求導時,鏈式法則這一代數運算就能被表示成圖上的消息傳遞。 編輯于 2015-01-13添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 龔禹pangolulu,http://pangolulu.github.io 知乎用戶贊同 我覺得理解BP算法原理最直接與清晰的就是根據computation graph了,話不多說,直接上圖。這里舉了一個三層神經網絡(一個輸入層、一個隱層和一個輸出層)的例子,使用了softmax輸出層,損失函數使用交叉熵。訓練神經網絡可以使用梯度下降的方法,重點是計算…顯示全部 我覺得理解BP算法原理最直接與清晰的就是根據computation graph了,話不多說,直接上圖。
這里舉了一個三層神經網絡(一個輸入層、一個隱層和一個輸出層)的例子,使用了softmax輸出層,損失函數使用交叉熵。訓練神經網絡可以使用梯度下降的方法,重點是計算梯度,也就是損失函數對參數的導數,在圖中可以表示為dloss/dW1,dloss/dW2,dloss/db1和dloss/db2。如何計算這些梯度,使用的就是BP算法,其實也就是求導的鏈式法則。這里舉了一個三層神經網絡(一個輸入層、一個隱層和一個輸出層)的例子,使用了softmax輸出層,損失函數使用交叉熵。訓練神經網絡可以使用梯度下降的方法,重點是計算梯度,也就是損失函數對參數的導數,在圖中可以表示為dloss/dW1,dloss/dW2,dloss/db1和dloss/db2。如何計算這些梯度,使用的就是BP算法,其實也就是求導的鏈式法則。
在每一輪迭代中,首先進行forward propagation,也就是計算computation graph中每個節點的狀態:
mul1 = X * W1 add1 = mul1 + b1 tanh1 = tanh(add1) mul2 = tanh1 * W2 add2 = mul2 + b2 tanh2 = tanh(add2) loss = softmax_loss(tanh2) 之后進行back propagation,也就是計算computation graph中每個節點相對于損失函數(這里表示為loss)的導數,這里面應用了鏈式法則。對于dloss/dtanh2, dloss/dadd2等導數,下面省略分子直接表示為dtanh2等。
dloss = 1 dtanh2 = softmax_loss_diff(tanh2) * dloss dadd2 = tanh_diff(add2) * dtanh2 db2 = 1 * dadd2 dmul2 = 1 * dadd2 dW2 = tanh1 * dmul2 dtanh1 = W2 * dmul2 dadd1 = tanh_diff(add1) * dtanh1 db1 = 1 * dadd1 dmul1 = 1 * dadd1 dW1 = X * dmul1 上面的變量都可以用矩陣表示,直接進行矩陣運算。其中dW1,dW2,db1和db2就是我們需要求的參數的梯度。
在編程實現上,每一個計算節點都可以定義兩個函數,一個是forward,用于給定輸入計算輸出;一個是backward,用于給定反向梯度,計算整個表達式(相當于損失函數)相對于這個節點的輸入的梯度,應用鏈式法則就是:這個節點相對于其輸入的梯度(直接對輸入求導)乘以這個節點接受的反向梯度。
我有一個tutorial,使用Python如何一步一步的實現神經網絡,而且可以自定義網絡的層數和每層的維度,擴展性很強。其中,抽象出來了gate(AddGate,MulGate),layer(Tanh,Sigmoid)和output(Softmax),你也可以自己實現不同的layer比如ReLu,或不同的output(比如Hinge)。
感興趣的請移步
GitHub - pangolulu/neural-network-from-scratch: Implementing Multiple Layer Neural Network from Scratch 發布于 2016-04-14添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 知乎用戶,http://lufo.me 知乎用戶、thomas yin、趙小姐等人贊同 http://colah.github.io/posts/2015-08-Backprop/ 這篇寫的很好懂. http://colah.github.io/posts/2015-08-Backprop/ 這篇寫的很好懂. 發布于 2016-01-21添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 彩虹 Apply the chain rule to compute the gradient of the lossfunction with respect to the inputs.---cs231n Apply the chain rule to compute the gradient of the lossfunction with respect to the inputs.
---cs231n 編輯于 2016-03-30添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 Hua Xiao 知乎用戶贊同 斯坦福的Andrew的公開課中對BP算法的直觀演示。Coursera - Free Online Courses From Top Universities 斯坦福的Andrew的公開課中對BP算法的直觀演示。
Coursera - Free Online Courses From Top Universities 發布于 2015-03-13添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 匿名用戶 Louis、yx愛自由贊同 我感覺最直觀的理解不就是它的名字么,誤差回傳播嘛,不知道你想要多直觀啊... 我感覺最直觀的理解不就是它的名字么,誤差回傳播嘛,不知道你想要多直觀啊... 發布于 2015-02-19添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 知乎用戶,knows nothing 俞造廷贊同 直接上干貨,Neural networks and deep learning(深度學習在線書chap2),把這一篇看完然后可以看看torch7的nn里面隨便一個層的寫法,或者caffe的Backward的實現,這兩種框架都是按照layer-by-layer的方法設計的。另外比較靈活的一種方式是通過定義computa…顯示全部 直接上干貨,Neural networks and deep learning(深度學習在線書chap2),把這一篇看完然后可以看看torch7的nn里面隨便一個層的寫法,或者caffe的Backward的實現,這兩種框架都是按照layer-by-layer的方法設計的。另外比較靈活的一種方式是通過定義computation graph,通過定義節點上基本操作的梯度,然后利用auto differentiation的思路就可以進行BP了(Tensorflow和MXNet的采用的思路)。
z為沒經過激活函數的輸出,a是經過激活函數的輸出。z為沒經過激活函數的輸出,a是經過激活函數的輸出。
定義損失函數(Cost)關于 l 層輸出z的偏導為:
則可以得到BP的4個基本方程:則可以得到BP的4個基本方程:
該在線書上有關于前兩個公式的證明的推導,仿照著利用chain rule,后兩個公式也可以很簡單地證明出來。該在線書上有關于前兩個公式的證明的推導,仿照著利用chain rule,后兩個公式也可以很簡單地證明出來。
另外貼一下BP算法和mini-batch SGD的算法:
BP:
--------
mini-batch SGD:
BP算法最開始的發現是基于每個權重(weight)或者偏置(bias)的微小改變都能引起輸出的改變,于是就進一步產生了用Cost對于這些參數的導數來更新w,b,進而達到改進輸出的目的。
這里一種很直接的思路就是直接求Cost關于每個參數的導數(比如 [C(w+dw)-C(w)]/dw 這種數值微分),但是這種方法需要進行參數個數量次的Backward過程,計算代價很大。BP算法的提出就是為了優雅地解決這一問題,它只需要一次Backward就能將誤差傳到每一個可學的參數(w,b)。
(以上,該在線書的部分搬運,如需進一步閱讀,直接戳原網址。以及進一步可參見相關框架的源碼和實現細節)
PS:最近才比較深入理解BP,歡迎批評指正。 編輯于 2016-04-14添加評論感謝 收藏?沒有幫助?舉報?禁止轉載 JesseFdu,dp 王澤宇贊同 BP算法的思想是:將訓練誤差E看作以權重向量每個元素為變量的高維函數,通過不斷更新權重,尋找訓練誤差的最低點,按誤差函數梯度下降的方向更新權值。 BP算法的思想是:將訓練誤差E看作以權重向量每個元素為變量的高維函數,通過不斷更新權重,尋找訓練誤差的最低點,按誤差函數梯度下降的方向更新權值。 發布于 2016-04-131 條評論感謝 收藏?沒有幫助?舉報?作者保留權利 劉莉莉,怕冷。。。 反向傳播其主要目的是通過將輸出誤差反傳,將誤差分攤給各層所有單元,從而獲得各層單元的誤差信號,進而修正各單元的權值(其過程,是一個權值調整的過程)。忘記出處了 我是看到這句才突然清晰了許多。 反向傳播
其主要目的是通過將輸出誤差反傳,將誤差分攤給各層所有單元,從而獲得各層單元的誤差信號,進而修正各單元的權值(其過程,是一個權值調整的過程)。
忘記出處了 我是看到這句才突然清晰了許多。 發布于 2016-04-21添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 xjsxjtu 誤差函數關于模型參數的偏導數,在神經網絡里逆向逐一求解。wiki上有非常簡練的推導。 誤差函數關于模型參數的偏導數,在神經網絡里逆向逐一求解。wiki上有非常簡練的推導。 發布于 2016-04-14添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 匿名用戶 沒有辦法更直觀了,除非你沒有學過微積分想要理解一個算法,用1+1=2的方式去理解1+1,我想是不行的,希望對你有用 沒有辦法更直觀了,除非你沒有學過微積分
想要理解一個算法,用1+1=2的方式去理解1+1,我想是不行的,希望對你有用 發布于 2014-12-25添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
鏈接:http://www.zhihu.com/question/27239198/answer/89853077
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
BackPropagation算法是多層神經網絡的訓練中舉足輕重的算法。
簡單的理解,它的確就是復合函數的鏈式法則,但其在實際運算中的意義比鏈式法則要大的多。
要回答題主這個問題“如何直觀的解釋back propagation算法?” 需要先直觀理解多層神經網絡的訓練。
機器學習可以看做是數理統計的一個應用,在數理統計中一個常見的任務就是擬合,也就是給定一些樣本點,用合適的曲線揭示這些樣本點隨著自變量的變化關系。
深度學習同樣也是為了這個目的,只不過此時,樣本點不再限定為(x, y)點對,而可以是由向量、矩陣等等組成的廣義點對(X,Y)。而此時,(X,Y)之間的關系也變得十分復雜,不太可能用一個簡單函數表示。然而,人們發現可以用多層神經網絡來表示這樣的關系,而多層神經網絡的本質就是一個多層復合的函數。借用網上找到的一幅圖[1],來直觀描繪一下這種復合關系。
其對應的表達式如下:
上面式中的Wij就是相鄰兩層神經元之間的權值,它們就是深度學習需要學習的參數,也就相當于直線擬合y=k*x+b中的待求參數k和b。上面式中的Wij就是相鄰兩層神經元之間的權值,它們就是深度學習需要學習的參數,也就相當于直線擬合y=k*x+b中的待求參數k和b。和直線擬合一樣,深度學習的訓練也有一個目標函數,這個目標函數定義了什么樣的參數才算一組“好參數”,不過在機器學習中,一般是采用成本函數(cost function),然后,訓練目標就是通過調整每一個權值Wij來使得cost達到最小。cost函數也可以看成是由所有待求權值Wij為自變量的復合函數,而且基本上是非凸的,即含有許多局部最小值。但實際中發現,采用我們常用的梯度下降法就可以有效的求解最小化cost函數的問題。
梯度下降法需要給定一個初始點,并求出該點的梯度向量,然后以負梯度方向為搜索方向,以一定的步長進行搜索,從而確定下一個迭代點,再計算該新的梯度方向,如此重復直到cost收斂。那么如何計算梯度呢?
假設我們把cost函數表示為, 那么它的梯度向量[2]就等于, 其中表示正交單位向量。為此,我們需求出cost函數H對每一個權值Wij的偏導數。而BP算法正是用來求解這種多層復合函數的所有變量的偏導數的利器。
我們以求e=(a+b)*(b+1)的偏導[3]為例。
它的復合關系畫出圖可以表示如下:
在圖中,引入了中間變量c,d。在圖中,引入了中間變量c,d。
為了求出a=2, b=1時,e的梯度,我們可以先利用偏導數的定義求出不同層之間相鄰節點的偏導關系,如下圖所示。
利用鏈式法則我們知道:利用鏈式法則我們知道:
以及。
鏈式法則在上圖中的意義是什么呢?其實不難發現,的值等于從a到e的路徑上的偏導值的乘積,而的值等于從b到e的路徑1(b-c-e)上的偏導值的乘積加上路徑2(b-d-e)上的偏導值的乘積。也就是說,對于上層節點p和下層節點q,要求得,需要找到從q節點到p節點的所有路徑,并且對每條路徑,求得該路徑上的所有偏導數之乘積,然后將所有路徑的 “乘積” 累加起來才能得到的值。
大家也許已經注意到,這樣做是十分冗余的,因為很多路徑被重復訪問了。比如上圖中,a-c-e和b-c-e就都走了路徑c-e。對于權值動則數萬的深度模型中的神經網絡,這樣的冗余所導致的計算量是相當大的。
同樣是利用鏈式法則,BP算法則機智地避開了這種冗余,它對于每一個路徑只訪問一次就能求頂點對所有下層節點的偏導值。
正如反向傳播(BP)算法的名字說的那樣,BP算法是反向(自上往下)來尋找路徑的。
從最上層的節點e開始,初始值為1,以層為單位進行處理。對于e的下一層的所有子節點,將1乘以e到某個節點路徑上的偏導值,并將結果“堆放”在該子節點中。等e所在的層按照這樣傳播完畢后,第二層的每一個節點都“堆放"些值,然后我們針對每個節點,把它里面所有“堆放”的值求和,就得到了頂點e對該節點的偏導。然后將這些第二層的節點各自作為起始頂點,初始值設為頂點e對它們的偏導值,以"層"為單位重復上述傳播過程,即可求出頂點e對每一層節點的偏導數。
以上圖為例,節點c接受e發送的1*2并堆放起來,節點d接受e發送的1*3并堆放起來,至此第二層完畢,求出各節點總堆放量并繼續向下一層發送。節點c向a發送2*1并對堆放起來,節點c向b發送2*1并堆放起來,節點d向b發送3*1并堆放起來,至此第三層完畢,節點a堆放起來的量為2,節點b堆放起來的量為2*1+3*1=5, 即頂點e對b的偏導數為5.
舉個不太恰當的例子,如果把上圖中的箭頭表示欠錢的關系,即c→e表示e欠c的錢。以a, b為例,直接計算e對它們倆的偏導相當于a, b各自去討薪。a向c討薪,c說e欠我錢,你向他要。于是a又跨過c去找e。b先向c討薪,同樣又轉向e,b又向d討薪,再次轉向e。可以看到,追款之路,充滿艱辛,而且還有重復,即a, b 都從c轉向e。
而BP算法就是主動還款。e把所欠之錢還給c,d。c,d收到錢,樂呵地把錢轉發給了a,b,皆大歡喜。
------------------------------------------------------------------
【參考文獻】
[1] 技術向:一文讀懂卷積神經網絡CNN
[2] Gradient
[3] http://colah.github.io/posts/2015-08-Backprop/
其他推薦網頁:
1. tensorflow.org 的頁面
2. Neural networks and deep learning 編輯于 2016-04-1610 條評論感謝 收藏?沒有幫助?舉報?作者保留權利 達聞西 知乎用戶、雪天、凃杉等人贊同 這大概是題主想要的吧(多圖):源地址:http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html顯示全部 這大概是題主想要的吧(多圖):
源地址:源地址:http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html 編輯于 2015-04-018 條評論感謝 收藏?沒有幫助?舉報?作者保留權利 知乎用戶,THU.CS PhD student 知乎用戶、知乎用戶、Zhaoyang Shao等人贊同 就是一個求導的鏈式法則嘛。。。 就是一個求導的鏈式法則嘛。。。 發布于 2014-12-25添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 Captain Jack 不是歸人贊同 拿紙和筆,定個最簡單的三層網絡,分別對各權值求偏導. 拿紙和筆,定個最簡單的三層網絡,分別對各權值求偏導. 發布于 2014-12-25添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 知乎用戶,working on RL 劍橋橋頭贊同 可以理解為誤差分配。對應于強化學習中的信度分配問題。…… 可以理解為誤差分配。對應于強化學習中的信度分配問題。…… 發布于 2014-12-25添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 土羊羊,加油,2015(? ??_??)? 劉dl、不是歸人贊同 哪個結點對“我”有貢獻,反過來要回報它→_→ 哪個結點對“我”有貢獻,反過來要回報它→_→ 發布于 2015-09-151 條評論感謝 收藏?沒有幫助?舉報?作者保留權利 peng sun,匿名愛好者 叫你三聲敢答應嗎贊同 神經網絡用圖來表示復合函數。所以對復合函數求導時,鏈式法則這一代數運算就能被表示成圖上的消息傳遞。 神經網絡用圖來表示復合函數。所以對復合函數求導時,鏈式法則這一代數運算就能被表示成圖上的消息傳遞。 編輯于 2015-01-13添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 龔禹pangolulu,http://pangolulu.github.io 知乎用戶贊同 我覺得理解BP算法原理最直接與清晰的就是根據computation graph了,話不多說,直接上圖。這里舉了一個三層神經網絡(一個輸入層、一個隱層和一個輸出層)的例子,使用了softmax輸出層,損失函數使用交叉熵。訓練神經網絡可以使用梯度下降的方法,重點是計算…顯示全部 我覺得理解BP算法原理最直接與清晰的就是根據computation graph了,話不多說,直接上圖。
這里舉了一個三層神經網絡(一個輸入層、一個隱層和一個輸出層)的例子,使用了softmax輸出層,損失函數使用交叉熵。訓練神經網絡可以使用梯度下降的方法,重點是計算梯度,也就是損失函數對參數的導數,在圖中可以表示為dloss/dW1,dloss/dW2,dloss/db1和dloss/db2。如何計算這些梯度,使用的就是BP算法,其實也就是求導的鏈式法則。這里舉了一個三層神經網絡(一個輸入層、一個隱層和一個輸出層)的例子,使用了softmax輸出層,損失函數使用交叉熵。訓練神經網絡可以使用梯度下降的方法,重點是計算梯度,也就是損失函數對參數的導數,在圖中可以表示為dloss/dW1,dloss/dW2,dloss/db1和dloss/db2。如何計算這些梯度,使用的就是BP算法,其實也就是求導的鏈式法則。
在每一輪迭代中,首先進行forward propagation,也就是計算computation graph中每個節點的狀態:
mul1 = X * W1 add1 = mul1 + b1 tanh1 = tanh(add1) mul2 = tanh1 * W2 add2 = mul2 + b2 tanh2 = tanh(add2) loss = softmax_loss(tanh2) 之后進行back propagation,也就是計算computation graph中每個節點相對于損失函數(這里表示為loss)的導數,這里面應用了鏈式法則。對于dloss/dtanh2, dloss/dadd2等導數,下面省略分子直接表示為dtanh2等。
dloss = 1 dtanh2 = softmax_loss_diff(tanh2) * dloss dadd2 = tanh_diff(add2) * dtanh2 db2 = 1 * dadd2 dmul2 = 1 * dadd2 dW2 = tanh1 * dmul2 dtanh1 = W2 * dmul2 dadd1 = tanh_diff(add1) * dtanh1 db1 = 1 * dadd1 dmul1 = 1 * dadd1 dW1 = X * dmul1 上面的變量都可以用矩陣表示,直接進行矩陣運算。其中dW1,dW2,db1和db2就是我們需要求的參數的梯度。
在編程實現上,每一個計算節點都可以定義兩個函數,一個是forward,用于給定輸入計算輸出;一個是backward,用于給定反向梯度,計算整個表達式(相當于損失函數)相對于這個節點的輸入的梯度,應用鏈式法則就是:這個節點相對于其輸入的梯度(直接對輸入求導)乘以這個節點接受的反向梯度。
我有一個tutorial,使用Python如何一步一步的實現神經網絡,而且可以自定義網絡的層數和每層的維度,擴展性很強。其中,抽象出來了gate(AddGate,MulGate),layer(Tanh,Sigmoid)和output(Softmax),你也可以自己實現不同的layer比如ReLu,或不同的output(比如Hinge)。
感興趣的請移步
GitHub - pangolulu/neural-network-from-scratch: Implementing Multiple Layer Neural Network from Scratch 發布于 2016-04-14添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 知乎用戶,http://lufo.me 知乎用戶、thomas yin、趙小姐等人贊同 http://colah.github.io/posts/2015-08-Backprop/ 這篇寫的很好懂. http://colah.github.io/posts/2015-08-Backprop/ 這篇寫的很好懂. 發布于 2016-01-21添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 彩虹 Apply the chain rule to compute the gradient of the lossfunction with respect to the inputs.---cs231n Apply the chain rule to compute the gradient of the lossfunction with respect to the inputs.
---cs231n 編輯于 2016-03-30添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 Hua Xiao 知乎用戶贊同 斯坦福的Andrew的公開課中對BP算法的直觀演示。Coursera - Free Online Courses From Top Universities 斯坦福的Andrew的公開課中對BP算法的直觀演示。
Coursera - Free Online Courses From Top Universities 發布于 2015-03-13添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 匿名用戶 Louis、yx愛自由贊同 我感覺最直觀的理解不就是它的名字么,誤差回傳播嘛,不知道你想要多直觀啊... 我感覺最直觀的理解不就是它的名字么,誤差回傳播嘛,不知道你想要多直觀啊... 發布于 2015-02-19添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 知乎用戶,knows nothing 俞造廷贊同 直接上干貨,Neural networks and deep learning(深度學習在線書chap2),把這一篇看完然后可以看看torch7的nn里面隨便一個層的寫法,或者caffe的Backward的實現,這兩種框架都是按照layer-by-layer的方法設計的。另外比較靈活的一種方式是通過定義computa…顯示全部 直接上干貨,Neural networks and deep learning(深度學習在線書chap2),把這一篇看完然后可以看看torch7的nn里面隨便一個層的寫法,或者caffe的Backward的實現,這兩種框架都是按照layer-by-layer的方法設計的。另外比較靈活的一種方式是通過定義computation graph,通過定義節點上基本操作的梯度,然后利用auto differentiation的思路就可以進行BP了(Tensorflow和MXNet的采用的思路)。
z為沒經過激活函數的輸出,a是經過激活函數的輸出。z為沒經過激活函數的輸出,a是經過激活函數的輸出。
定義損失函數(Cost)關于 l 層輸出z的偏導為:
則可以得到BP的4個基本方程:則可以得到BP的4個基本方程:
該在線書上有關于前兩個公式的證明的推導,仿照著利用chain rule,后兩個公式也可以很簡單地證明出來。該在線書上有關于前兩個公式的證明的推導,仿照著利用chain rule,后兩個公式也可以很簡單地證明出來。
另外貼一下BP算法和mini-batch SGD的算法:
BP:
--------
mini-batch SGD:
BP算法最開始的發現是基于每個權重(weight)或者偏置(bias)的微小改變都能引起輸出的改變,于是就進一步產生了用Cost對于這些參數的導數來更新w,b,進而達到改進輸出的目的。
這里一種很直接的思路就是直接求Cost關于每個參數的導數(比如 [C(w+dw)-C(w)]/dw 這種數值微分),但是這種方法需要進行參數個數量次的Backward過程,計算代價很大。BP算法的提出就是為了優雅地解決這一問題,它只需要一次Backward就能將誤差傳到每一個可學的參數(w,b)。
(以上,該在線書的部分搬運,如需進一步閱讀,直接戳原網址。以及進一步可參見相關框架的源碼和實現細節)
PS:最近才比較深入理解BP,歡迎批評指正。 編輯于 2016-04-14添加評論感謝 收藏?沒有幫助?舉報?禁止轉載 JesseFdu,dp 王澤宇贊同 BP算法的思想是:將訓練誤差E看作以權重向量每個元素為變量的高維函數,通過不斷更新權重,尋找訓練誤差的最低點,按誤差函數梯度下降的方向更新權值。 BP算法的思想是:將訓練誤差E看作以權重向量每個元素為變量的高維函數,通過不斷更新權重,尋找訓練誤差的最低點,按誤差函數梯度下降的方向更新權值。 發布于 2016-04-131 條評論感謝 收藏?沒有幫助?舉報?作者保留權利 劉莉莉,怕冷。。。 反向傳播其主要目的是通過將輸出誤差反傳,將誤差分攤給各層所有單元,從而獲得各層單元的誤差信號,進而修正各單元的權值(其過程,是一個權值調整的過程)。忘記出處了 我是看到這句才突然清晰了許多。 反向傳播
其主要目的是通過將輸出誤差反傳,將誤差分攤給各層所有單元,從而獲得各層單元的誤差信號,進而修正各單元的權值(其過程,是一個權值調整的過程)。
忘記出處了 我是看到這句才突然清晰了許多。 發布于 2016-04-21添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 xjsxjtu 誤差函數關于模型參數的偏導數,在神經網絡里逆向逐一求解。wiki上有非常簡練的推導。 誤差函數關于模型參數的偏導數,在神經網絡里逆向逐一求解。wiki上有非常簡練的推導。 發布于 2016-04-14添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 匿名用戶 沒有辦法更直觀了,除非你沒有學過微積分想要理解一個算法,用1+1=2的方式去理解1+1,我想是不行的,希望對你有用 沒有辦法更直觀了,除非你沒有學過微積分
想要理解一個算法,用1+1=2的方式去理解1+1,我想是不行的,希望對你有用 發布于 2014-12-25添加評論感謝 收藏?沒有幫助?舉報?作者保留權利 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的如何直观的解释back propagation算法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库的原理
- 下一篇: 人脸识别技术大总结(1)——Face D