天天看點

BP算法詳解預先說明字母說明BP算法細節編碼

預先說明

由于有些人實在太蠢,沒辦法隻能加上這一段。首先,這裡面什麼看成變量,什麼看成常量。

變量:網絡的權值W(偏置b預設在W内。)以及輸入X。

常量:就是target

你可能會說呃呃呃,不是輸入都是有值得嗎,不都是數嗎,怎麼會是變量啊。。我還能說什麼呢?一般來說網絡的反向傳播就是兩種類型。一種是更新網絡權值W,這是屬于正常的,一種是更新輸入X。 不管哪種情況,我們都要把W和X看成變量,才能有反向傳播。

推導過程中,W和X都是變量,輸出是W和X的函數。

字母說明

  • W(l)ij :第 l 層到第 l+1 層的權值,并且是 l 層的第 j 個單元到 l+1 層的第 i 個單元的權值。
  • Z(l)i :第 l 層的第 i 個結點的輸入和。

    顯然 Z(l)i=∑s(l−1)j=0Wl−1ijxj , 其中 sl−1 代表 l−1 層的結點個數(不計算偏置單元)。可以這樣說,第0個單元是偏置,1~ s(n−1) 是權重項。

  • a(l)i :表示第 l 層的第 i 個結點的激活值,就是下面說的out的輸出,或是說 a=f(net) ,寫成 a=f(z) 也是一樣的。
  • δ(l)i : 叫做“殘差”,這裡表示第 l 層的第 i 個節點的殘差。這個非常重要,殘差的定義就是——總的代價函數對于某個節點的“net”的偏導。注意的是這裡的“net”指的是W*x+b這樣的函數結構。可以這樣看網絡:
    BP算法詳解預先說明字母說明BP算法細節編碼
    現在隻需要看每個結點是如何處理資料的。不要看箭頭,可以看到,h1和h2再加上“1”共三個結點輸入,構成輸入 x⃗  , 而相應的權值 W⃗  是 w5 , w6 , b2 , 也就是說 W⃗ ∗x⃗  就是這裡的“net”,然後“out”是指激活後的值,就是 f(net) .殘差就是 ∂E∂net ,*不是 ∂E∂out 哦!

BP算法細節

參數說明:假設有n層。J表示代價函數,和上面的E是同樣的意思,隻不過用不同的字母寫而已。

1: 首先當然是正向計算咯,分别求出 L2,L3,... 直至最後一層 Ln 的激活值。我們這裡把輸入當做第一層。下面是真正的反向傳播。

2: 對于第n層(最後一層是特殊的,必須單獨拿出來)每個輸出單元 i ,下面的 l 的值為 n , 計算每個結點的殘差:

δ(l)i=∂J(W,b;x,y)∂z(l)i=∂∂z(l)i12∥∥y−hW,b(x)∥∥2=−(yi−a(l)i)⋅f′(z(l)i)

注意:這裡最後乘上了對“net”的導,如果是用sigmoid的函數的話,根據 f′(z(l)i)=a(l)i(1−a(l)i) , 最後一層的第 i 個結點的殘差 δ(l)i=−(yi−a(l)i)∙a(l)i(1−a(l)i)

3: 從倒數第二層開始,也就是說 l=n−1,n−2,n−3,...,2 的各層,第 l 層的第 i 個結點的殘差計算:

δ(l)i=⎛⎝∑j=1sl+1W(l)jiδ(l+1)j⎞⎠f′(z(l)i)

分析:要想知道第 l 層的第 i 個結點的殘差,必須知道 該節點所連接配接的下一層的各個結點的權值,以及這些結點的殘差,幸虧第 l+1 層已經計算出來了殘差,你隻要把後面一層的每個結點 j 的殘差乘以該結點與這一層的結點 i 相連的權值,然後加和,最後别忘了乘以這一層的激活方式的導數。 不吹不黑,如果你不太懂得話,這段話可以夠你看10遍,你就懂了。

4: 你可能會說要殘差幹嘛?當然是計算 ∂J∂w 和 ∂J∂b 用的。

隻要:

∂∂W(l)ijJ(W,b;x,y)=a(l)jδ(l+1)i∂∂b(l)iJ(W,b;x,y)=δ(l+1)i

結論:求J對“結點j到i的線路”的導數,求出後者i的殘差,然後乘以這條線路的流量即可。

分析:其實是這樣的, Wlij 是第 l 層到 l+1 層的權值,并且是從結點 j 到結點 i 的權值。根據鍊式法則:

∂J(W,b;x,y)∂w(l)ij=∂J(W,b;x,y)∂outi∗∂outi∂neti∗∂neti∂wij

請仔細看上面的公式,好好了解。

殘差的定義就是 ∂J(W,b;x,y)∂neti ,根據鍊式法則:

δ(l+1)i=∂J(W,b;x,y)∂neti=∂J(W,b;x,y)∂outi∗∂outi∂neti 這下明白了吧,就是說第 l+1 層, ∂J∂w(l)ij=δ(l+1)i∗∂neti∂wij=δ(l+1)ia(l)j

注意,第 l+1 層的 ∂neti∂wij 就是該層的輸入,也就是第 l 層的輸出 a(l)j .

最後一個問題,為啥

δ(l)i=⎛⎝∑j=1sl+1W(l)jiδ(l+1)j⎞⎠f′(z(l)i) 呢?

δ(l−1)i=∂∂z(l−1)iJ(W,b;x,y)=∂∂z(l−1)i12∥∥y−hW,b(x)∥∥2=∂∂z(l−1)i12∑j=1Sl(yj−a(l)j)2=12∑j=1Sl∂∂z(l−1)i(yj−a(l)j)2=12∑j=1Sl∂∂z(l−1)i(yj−f(z(l)j))2=∑j=1Sl−(yj−f(z(l)j))⋅∂∂z(l−1)if(z(l)j)=∑j=1Sl−(yj−f(z(nl)j))⋅f′(z(l)j)⋅∂z(l)j∂z(l−1)i=∑j=1Slδ(l)j⋅∂z(l)j∂z(l−1)i=∑j=1Sl⎛⎝δ(l)j⋅∂∂z(l−1)i∑k=1S(l−1)f(z(l−1)k)⋅W(l−1)jk⎞⎠=∑j=1Slδ(l)j⋅W(l−1)ji⋅f′(z(l−1)i)=⎛⎝∑j=1SlW(l−1)jiδ(l)j⎞⎠f′(z(l−1)i)

慢慢看,看懂問題不大。

編碼

  1. 進行前饋傳導計算,利用前向傳導公式,得到 L2,L3,… 直到輸出層 Ll 的激活值。
  2. 對輸出層(第 l 層),計算:
    δ(nl)=−(y−a(nl))∙f′(z(nl))
  3. 對于 l=nl−1,nl−2,nl−3,…,2 的各層,計算:
    δ(l)=((W(l))Tδ(l+1))∙f′(z(l))
  4. 計算最終需要的偏導數值:
    ∇W(l)J(W,b;x,y)=δ(l+1)(a(l))T,∇b(l)J(W,b;x,y)=δ(l+1).

最後說明一點,BP傳播,計算各層的各點的殘差是關鍵,殘差是總的代價函數對于該點的net的偏導,從倒數第二層開始,求殘差就要用到其後面的一層的各個殘差,隻要用後面一層的各個結點殘差乘以其與這一層這個的結點所連接配接的權值,再求和,最後乘以這一層這個結點的out對net的偏導就可以了。如此一來,殘差乘以這個結點的輸入,就可以得到整個代價函數對于這個結點的w偏導了。

繼續閱讀