反向傳播演算法在神經網路中站很大的地位,大多數神經網路都能用反向傳播演算法進行訓練,
但不少初學者不容易弄懂其中的具體公式(比如說我),所以講解公式很有必要
(這裡不講前向傳播,可自行尋找相關資訊)
首先先規定一些巨集:
ls:神經網路的層數nf(n):神經網路第n層的神經元個數
bf(n,a):神經網路第n層第a個神經元的偏置(輸入層沒有偏置)
wf(n,a,p):神經網路第n層第a個神經元的第p個權重(輸入層沒有權重)
netf(n,a):神經網路第n層第a個神經元的加權和(wx+b)
of(n,a):神經網路的第n層第a個神經元的輸出(不包括輸入層,of可有可無,有點話使用某些啟用函式可方便計算)
sf(n,a):神經網路的第n層第a個神經元的誤差
inf(n):神經網路的第n個輸入
outf(n):神經網路的第n個實際輸出(即輸出層第n個輸出)
taf(n):神經網路的第n個理想輸出(即樣本輸出)
ln:學習率
f(x):啟用函式函式
f_(x):啟用函式的導函式
注意:在進行反向傳播之前,首先需要先前向傳播一次,計算好各個層的(加權和)和輸出
首先是計算輸入層的誤差(為了更加容易理解,這裡用文字和符號表述):
sf(ls,1) = (2.0/nf(ls))*(outf(1) - taf(1))輸出層第1個神經元的誤差 = (2.0/輸出層神經元數量)*(實際第1個輸出-理想第1個輸出),以此類推
ps:注意這裡是浮點數2.0不是整數2
更新輸入層的權重和偏置:
bf(ls,1) = bf(ls,1) - ln * sf(ls,1)更新後的輸出層第1個偏置 = 原偏置 - 學習率*輸出層第1個誤差,以此類推
wf(ls,1,2) = wf(ls,1,2) - ln * sf(ls,1) * of(ls-1,2);
更新後的輸出層第1個神經元的第2個權重 = 原權重 - 學習率 * 輸出層第1個誤差 * 上一層第2個輸出
作為參照:
wf(n,1,4) = wf(n,1,4) - ln * sf(n+1,4) * of(n,4);
更新後的第n層第1個神經元的第4個權重 = 原權重 - 學習率 * 下一層層第4個誤差 * 第n層第1個輸出
以此類推
然後是隱藏層的誤差:
sf(n,4) = sf(n+1,1)*wf(n,4,1)*f_(netf(n,4)) + sf(n+1,2)*wf(n,4,2)*f_(netf(n,4)) +sf(n+1,3)*wf(n,4,3)*f_(netf(n,4)) +...........第n層第4個神經元的誤差 = 下一層第1個神經元的誤差 * 第n層第4個神經元第1個權重 * 第n層的第4個神經元的導函式輸出 +
下一層第2個神經元的誤差 * 第n層第4個神經元第2個權重 * 第n層的第4個神經元的導函式輸出 +
下一層第3個神經元的誤差 * 第n層第4個神經元第3個權重 * 第n層的第4個神經元的導函式輸出+
........
ps:這裡之所以用計算第n層第4個神經元的誤差做例,是為了更好的理解
實際上就是個數學表示式:
第n層的誤差陣列 = (下一層的誤差陣列*第n層的權重矩陣)*第n層的加權和的導數陣列
隱藏層的誤差計算 , 權重和偏置的更新與輸出層一樣,這裡就不加贅述了
由於輸入層只有輸入,所以沒有誤差
總之,神經網路搭建完後,就可以開始訓練了,匯入樣本,然後開始前向傳播一次,反向傳播一次,反覆計算
其中需要計算總誤差:
double val = 0;for (int a = 1; a <= nf(ls); a++)
至此,反向傳播的大致公式就完了,具體細節和相關知識可自行查詢(資料挺多的,應該不用擔心)
反向傳播演算法
首先我們對數學符號做一些約定。我們首先考慮簡單的情況 前饋神經網路,如圖 所示。我們先假設任意兩層之間沒有權值共享。方向傳播演算法本質上就是梯度下降演算法,所以我們要對損失函式關於每個引數求導。設單個輸入例項 x 損失函式為 j x 那麼我們要求解 j wi 和 j bi i 1,2,n 對 j 關...
反向傳播演算法
反向傳播演算法的工作機制為對 錯誤的神經元施以懲罰。從輸出層開始,向上層次查詢 錯誤的神經元,微調這些神經元輸入值的權重,以達到修復輸出錯誤的目的。神經元之所以給出錯誤的 原因在於它前面為其提供輸入的神經元,更確切地說是由兩個神經元之間的權重及輸入值決定的。我們可以嘗試對權重進行微調。每次調整的幅度...
反向傳播演算法
看了很多有關神經網路的資料,一直對於反向傳播演算法總是不理解,對於其過程也是覺得很複雜,讓人想放棄,寫一篇部落格來從頭到尾來擼一遍反向傳播,讓這個黑盒子變透明。主要涉及到的數學方法,就是求偏導數,鏈式法則,沒有其他的複雜的數學公式了 當然求偏導的原理,是利用梯度下降法 因為是要將誤差減小,那麼就需要...