梯度降低是優化中經常使用的一種尋優策略,很天然的被引入NN中。本文只對NN中的梯度降低進行介紹。梯度降低算法的核心就是不斷計算當前損失函數的梯度,在NN中爲了更好的計算梯度,引出了後向傳播算法,其實就是爲了計算梯度而已。html
Ok,假設咱們已經有了一個比較複雜的網絡,其中參數theta是咱們想要求出來的值。git
尋找最好的函數 ,就是爲神經網絡選取一組最好的係數theta使得損失函數最小。但,顯然咱們不能經過遍歷的方式進行尋找係數。例如含有1000個neuron的兩層神經網絡結構中,第一層的輸出爲1000個值,對應第二層的每一個neuron就有1000個weights,因此須要的參數就是1000*1000+1000(偏置)。github
梯度降低算法是最優化求解中經常使用的經典算法,把損失函數做爲所求參數的函數。而後經過利用函數的梯度和學習步長,不斷迭代尋找最優參數,優勢是適用面廣,速度快,缺點是隻能得到局部最優
例如,損失函數爲L,參數集合爲theta,是關於omega的函數。算法
每次沿着負梯度方向移動:網絡
經過不斷迭代,最終獲得一個局部最優解。下面爲一個例子:機器學習
總結: 函數
梯度降低十分經典,相關資料不少,這裏不進行復述。這裏主要講講梯度降低訓練神經網絡和神經網絡中前向,後向傳播算法的關係。post
首先,整個函數的損失函數爲L,對損失函數進行求導,獲得theta的初始導數,而後根據學習步長與導數不斷更新。學習
爲了更新,咱們須要求得損失函數的導數,須要用到鏈式法則,具體以下:優化
損失函數是全部損失的累加。可是損失函數對係數omega的導數不能直接求出,須要傳遞:
例如,求上圖中紅色三角區域內參數(w1和w2),經過鏈式法則咱們能夠獲得該梯度由兩部分組成,具體以下:
全部參數 的導數(z對w的導數),這部分由前向傳播 決定;激活函數輸入 的梯度(c對z的導數),這部分由後向傳播 決定,因此須要配合使用。其中還有其餘層的梯度信息,暫時用問號代替。
驚喜的發現,全部參數的梯度 居然就是與權值相連的輸入值 。問號 是指網絡中全部與權值相連的如輸入值,Amazing!
因此,咱們獲得了所有參數的導數以後,就開始計算激活函數輸入的導數:
計算包含兩部分,一個是激活函數自己的導數,對於一個固定結構的神經網絡,sigma(z)的導數是小於0的,很是小,這點致使了梯度消散的問題。
而損失函數L對a的導數則能夠經過鏈式法則獲得。其中W是已知的,只須要計算C與Z'和Z''的導數。
進一步概括以下:
首先sigma(z)的導數是常數,只須要計算C與Z'和Z''的導數.
記住C對z的導數結構,遞歸執行這個結構獲得全部的結果,例如C對z' 的導數仍然是這個結構。
記住C對z的導數結構,遞歸執行這個結構獲得全部的結果,例如C對z'的導數仍然是這個結構。
如何計算C與Z'和Z''的梯度?第一種狀況 ,該計算髮生在輸出層 ,十分好計算。
如何計算C與Z'和Z''的梯度? 第二種狀況 ,該計算髮生在非 輸出層。
進行遞歸形式的計算便可,直至遞歸至輸出層.
例以下圖中z'的導數,就是由後面兩條紅色線的路徑結果獲得。其格式與下列公式相同:
計算損失函數C與全部激活函數輸入Z 的導數。遞歸地從輸出層開始計算
最後將兩部分結合到一塊兒,獲得損失函數與W的梯度。
這裏面會出現一個問題:在隱層中a是0到1的數,C對z的導數中,導函數的值是0到0.2的值,不斷的連乘,獲得的結果就是梯度過小,出現梯度消失的問題。
總結:
其實,網絡中就有兩個函數:
和激活函數:
因此,在求導的時候,要先對z求導,而後對w求導。這中間用到了鏈式法則。
爲了求得神經網絡的最優係數,咱們須要使用梯度降低算法。而梯度降低算法中的梯度須要經過前向傳播算法 和後向傳播算法 共同計算。神奇的是梯度須要計算的值很是少(大多數已知),因此速度很是快。
看到一個比較直觀的後向傳播介紹:
做者:胡逸夫
連接:https://www.zhihu.com/question/27239198/answer/89853077
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
BackPropagation算法是多層神經網絡的訓練中舉足輕重的算法。
簡單的理解,它的確就是複合函數的鏈式法則,但其在實際運算中的意義比鏈式法則要大的多。
要回答題主這個問題「如何直觀的解釋back propagation算法?」 須要先直觀理解多層神經網絡的訓練。
機器學習能夠看作是數理統計的一個應用,在數理統計中一個常見的任務就是擬合,也就是給定一些樣本點,用合適的曲線揭示這些樣本點隨着自變量的變化關係。
深度學習一樣也是爲了這個目的,只不過此時,樣本點再也不限定爲(x, y)點對,而能夠是由向量、矩陣等等組成的廣義點對(X,Y)。而此時,(X,Y)之間的關係也變得十分複雜,不太可能用一個簡單函數表示。然而,人們發現能夠用多層神經網絡來表示這樣的關係,而多層神經網絡的本質就是一個多層複合的函數。借用網上找到的一幅圖[1],來直觀描繪一下這種複合關係。
其對應的表達式以下:
<img src="https://pic4.zhimg.com/e62889afe359c859e9a6a1ad2a432ebb_b.png" data-rawwidth="474" data-rawheight="128" class="origin_image zh-lightbox-thumb" width="474" data-original="https://pic4.zhimg.com/e62889afe359c859e9a6a1ad2a432ebb_r.png">上面式中的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。
爲了求出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