作者:匿名用戶
鏈接:https://www.zhihu.com/question/27239198/answer/89853077
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
鏈接:https://www.zhihu.com/question/27239198/answer/89853077
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。
BackPropagation算法是多層神經網絡的訓練中舉足輕重的算法。
簡單的理解,它的確就是復合函數的鏈式法則,但其在實際運算中的意義比鏈式法則要大的多。
要回答題主這個問題“如何直觀的解釋back propagation算法?” 需要先直觀理解多層神經網絡的訓練。
機器學習可以看做是數理統計的一個應用,在數理統計中一個常見的任務就是擬合,也就是給定一些樣本點,用合適的曲線揭示這些樣本點隨着自變量的變化關系。
深度學習同樣也是為了這個目的,只不過此時,樣本點不再限定為(x, y)點對,而可以是由向量、矩陣等等組成的廣義點對(X,Y)。而此時,(X,Y)之間的關系也變得十分復雜,不太可能用一個簡單函數表示。然而,人們發現可以用多層神經網絡來表示這樣的關系,而多層神經網絡的本質就是一個多層復合的函數。借用網上找到的一幅圖[1],來直觀描繪一下這種復合關系。
上面式中的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。
為了求出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
簡單的理解,它的確就是復合函數的鏈式法則,但其在實際運算中的意義比鏈式法則要大的多。
要回答題主這個問題“如何直觀的解釋back propagation算法?” 需要先直觀理解多層神經網絡的訓練。
機器學習可以看做是數理統計的一個應用,在數理統計中一個常見的任務就是擬合,也就是給定一些樣本點,用合適的曲線揭示這些樣本點隨着自變量的變化關系。
深度學習同樣也是為了這個目的,只不過此時,樣本點不再限定為(x, y)點對,而可以是由向量、矩陣等等組成的廣義點對(X,Y)。而此時,(X,Y)之間的關系也變得十分復雜,不太可能用一個簡單函數表示。然而,人們發現可以用多層神經網絡來表示這樣的關系,而多層神經網絡的本質就是一個多層復合的函數。借用網上找到的一幅圖[1],來直觀描繪一下這種復合關系。
其對應的表達式如下:
上面式中的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。
為了求出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
