原文鏈接:這里
介紹
反向傳播算法可以說是神經網絡最基礎也是最重要的知識點。基本上所以的優化算法都是在反向傳播算出梯度之后進行改進的。同時,也因為反向傳播算法是一個遞歸的形式,一層一層的向后傳播誤差即可,很容易實現(這部分聽不懂沒關系,下面介紹)。不要被反向傳播嚇到,掌握其核心思想就很容易自己手推出來。
思想
我們知道神經網絡都是有一個loss函數的。這個函數根據不同的任務有不同的定義方式,但是這個loss函數的目的就是計算出當前神經網絡建模出來輸出的數據和理想數據之間的距離。計算出loss之后,根據反向傳播算法就可以更新網絡中的各種參數以此使loss不斷下降,即可使輸出的數據更加理想。
所以,現在的任務是,已知一個網絡的loss之后,如何根據loss來更新參數呢?具體點即如何更新網絡節點中的權重w和偏差b的值呢?
定義元素
這里我們采用的是全連接神經網絡進行說明。
要想把這個過程說清楚,首先需要將神經網絡中各個參數用文字表達清楚。定義的就是w和b在網絡中的准確位置。
w標記說明
對於表示的是神經網絡中第
層第k個節點到神經網絡中第
層第j個節點之間的權重。注意w的下標是首位表示的是節點后層節點的位置,末尾表示是前層節點的位置。理解這樣的表達方式在后面的計算中會很好理解。
同理,對於b的表示:
b,a符號說明
b的表示相比於w要簡單一些,符號表示第l層網絡在第j個節點的偏置。無論w還是b的表示,上標都是表示層數。並且
和
表示都是第l層網絡第j個節點的參數。所以該節點的輸出可以表示為:
神經網絡輸出之后會經過一個激活函數,這用激活函數用表示,則經過激活函數輸出為:
至此,根據上面符號、
、
、
。我們可以對於神經網絡里面每一個數據准確的表示了。
損失函數對參數的偏導
給定一個損失函數之后,用表示,說白了反向傳播就是求∂C/∂w和∂C/∂b,然后將這個值乘以和對應的w,b進行相減就可以實現一次的參數更新了。為什么這樣的操作就可以優化網絡,減小loss值呢?
來源於導數的概念和速度相關。∂C/∂w和∂C/∂b相當於loss值C相對於w和v變化的速度。如果∂C/∂w是正的,則增大w,C也會增大,如果希望C減小的話,應該減小w;並且∂C/∂w的絕對值越大,表示w對C的值影響越大,w稍微有一點變化,C就會有大幅變化。如果要優化C變小,w應該對應的減少多少呢?也沒有一個確定的答案。這里通過變化的速度和學習率相乘作為一個減小的值。通過多輪迭代。最終是希望c達到最小點。而當函數落入最小值的時候,無論是局部最小還是全局最小,其周圍一定是平滑的。所以此時∂C/∂w和∂C/∂b將會變得很小甚至為0,即參數不在更新了。當函數在局部最小點處參數不在更新出現梯度消失的問題時,目前也有各種trick進行解決。不是這里的重點。
為了好說明,這里定義一個很簡單的損失函數C:
損失函數
即:網絡輸出的值和label之間的均方差。
求導
接下來就是有意思的階段了。這里還是利用上一節中∂C/∂w和∂C/∂b的解釋。如果我們想要求出∂C/∂w和∂C/∂b的值,即具體的、
對C影響速率的值,我們找一個中間變量∂C/∂
。因為我們知道:
我們定義:
當我們知道了值之后,我們根據
式子可以很容易求出
。
利用導數的鏈式法則:
很容易推出來不是?同理可以求出:
可以看出通過媒介 很容易求出∂C/∂w和∂C/∂b。那么我們現在來理解一下
到底是什么意思,以及如何求出來每一個l層j節點的
值。
根據定義:
可以看出來就是
對於C的影響大小(聯系之前說的導數和速率的關系)。而
是第
層第
個神經元未進過激活函數之前的輸出。所以我們可以理解
為網絡中第
層第
個神經元對loss的影響。所以很直觀的看法就是我們先求出單個神經元對loss值得影響,然后再計算該神經元內部參數對於loss的影響。
ok,如果我們已經理解了為什么要引入變量以及如何利用該變量計算具體參數的梯度后,接下來我們就可以看看如何獲得
值。反向傳播的名字我想也就是通過計算
的方式而來的。是一層一層遞歸而來的。
既然說是遞歸的方式,我們來思考一下和
之間有什么關系,如果找到這個關系之后,我們就可以默認我們如果知道最后一層網絡節點的
值,我們就可以獲得倒數第二層網絡節點的
值,倒數第三層,倒數第四層,……以此推類即可獲得整個網絡的每個節點的
值。至此我們的反向傳播也基本完成了。
所以最重要的有兩點:
和
之間有什么關系
- 假設最后一層網絡是L,最后一層
如何計算得出
先看問題1,直接根據求導的鏈式法則就可以找出兩個的關系,具體公式如下,可以多看看手寫一下,思路上也很簡單。
覺得這樣的鏈式公式還是很直觀的,如果不好理解,可以自己畫一個神經網絡圖,連上節點與節點之間的線,標上參數,然后推一下應該就能理解了。
這里的都表示的未經過激活函數的神經元的輸出。
表示激活函數。因為:
所以:
帶入上式就可以得出:
至此就找出了和
之間的關系了。
(還能簡化,根據最開始我們定義的)。
理解起來就是網絡中前面一層某一個神經元對於loss的影響與該層的后一層所有的神經元對loss的影響、該神經元的輸出大小、該神經元與后一層神經元連接的權重有關系的,並且是一個累加的效應。這樣的理解也是非常直觀合乎常理的。
現在萬事具備,只差問題2了。即假設最后一層網絡是L,最后一層如何計算得出。最后一層的
值就像一個導火索,一旦有了開始,就可以利用我們之前推出來的:
公式進行反向傳播了(反向傳播還是很形象的不是?)。現在解決這個問題。這個問題就是和損失函數具體怎么定義有關系了。不過我們先不考慮C的具體形式,根據通用的鏈式法則我們可以得到:
這里需要注意的是最后一層激活函數使用的是哪種。最后一層激活函數在計算某一個神經元的輸出時可能會結合其他節點的輸出來計算。比如softmax激活函數,其輸出的是一個概率值【0,1】。輸出大小就是結合輸出所有的值。
現在我們來考慮兩個具體的損失函數,並且采用之前定義的均方誤差損失函數:
-
sigmoid損失函數
形式:
函數曲線:
sigmoid function
求導為:
因為sigmoid輸出的值僅僅和輸入的x值有關 。所以當
時值為0.所以:
-
softmax損失函數
形式:
函數形式:輸出也是【0,1】的值,不過需要依賴最后一層所有的數來計算分母
求導:所以
總結
根據上面,BP推導有三部曲,先求出,再根據
分別求出
、
。總結公式如下:
啟動上面反傳的導火索是最后一層的值,計算公式為:
根據最后一層不同類型的激活函數不同對待。
博主你好,文章中間 那塊兒 第l+1層Zk的 對l層Zj的求導那兒 沒太明白 不應該是激活函數的導數么?
2019.10.18 14:35
我也是這個問題,應該是w*激活函數導數才對啊
2019.11.07 00:40
中間有少許錯誤,但不失為一篇好文章,估計是作者筆誤。其一在原文&[l,j]=&[l+1,k]w[l+1,k,j]a[l,j],應把a[l,j]修正為a[l,j]對z[l,j]的偏導