引言
在神經網絡中,為了更有效的計算梯度,需要用到反向傳播算法。我們先從鍊式求導法則開始。
鍊式求導法
先介紹下鍊式求導法則,在後面的反向傳播算法中會用到。
有
那麼;
有
改變了s會改變x和y,進而改變了z。
注意,如果改變s會改變多個變量,它們的關系也是成立的。
損失函數
假設給定一組參數,把一個訓練資料代入NN(神經網絡)中,會得到輸出。
是輸出和實際距離函數,值越大代表越距離遠,也就是效果越不好。
那在神經網絡訓練算法中,損失函數定義為:
如果把損失函數對參數做微分的話,得到
隻要計算出某一筆資料對的微分,就可以得到對的微分。
假設我們先考慮這個神經元。
假設隻有兩個輸入,計算得到後再代入激活函數,經過多次運算會得到最終的輸出。
現在問題是如何計算損失(距離函數)對的偏微分
利用鍊式求導法
計算的過程叫做正向過程(Forward pass);計算的過程叫做反向過程(Backward pass)。
正向過程
如上圖所示,假設輸入是,上面藍色神經元的參數:,激活函數是
Sigmoid
函數;
下面藍色神經元的參數:
對下面的神經元來說,計算的偏微分,可以很快得出,也就是輸入,随着從前往後計算每個神經元的輸出,整個過程就可以很快結束,是以叫正向過程。
反向過程
困難的是如何計算
假設激活函數是
Sigmoid
函數,然後得到的函數值會乘上某個權重(比如)再加上其他值得到(注意這裡隻是一個符号,不是的導數);也會乘上權重(比如)再加上其他東西得到(注意這裡隻是一個符号,不是的二階導數);
可以這樣了解,通過影響來影響。
而
那就剩下
改變了會改變和,進而改變了
我們先計算簡單的
有
同理
現在難點就是和
我們這裡先假裝我們知道這兩項的值。然後整理下原來的式子:
假設有另外一個特殊的神經元,它是上圖的樣子,輸入就是和,它們分别乘以和,然後求和得到的結果再乘上
就得到了
在正向傳播的過程中已經知道了,是以這裡的是一個常數。
說了這麼多,還是沒說怎麼計算和啊。别急,下面就開始計算。
這裡要分兩種情況考慮:
情形一: 紅色的兩個神經元就是輸出層,它們能直接得到輸出。
根據鍊式法則有:
隻要知道激活函數是啥就能計算出
也可以根據我們選取的損失函數簡單的計算出來。
同理的計算也一樣
情形二:紅色的不是輸出層
紅色的是中間層,它們的激活函數的值會當成下一層的輸入繼續參數計算。
如果我們知道和
同理(回顧一下上面那個特殊的神經元)我們就可以計算
問題就會這樣反複循環下去,我們不停的看下一層,直到遇到了輸出層。然後就可以由輸出層往前計算出整個NN的所有的參數。
那我們為何不換個角度考慮問題,我們直接先算輸出層的偏微分,然後依次往前計算。