這是典型的三層神經(jīng)網(wǎng)絡(luò)的基本構(gòu)成,Layer L1是輸入層,Layer L2是隱含層族吻,Layer L3是隱輸出,我們現(xiàn)在手里有一堆數(shù)據(jù){x1,x2,x3,...,xn},輸出也是一堆數(shù)據(jù){y1,y2,y3,...,yn},現(xiàn)在要他們在隱含層做某種變換于游,讓你把數(shù)據(jù)灌進去后得到你期望的輸出超歌。如果你希望你的輸出和原始輸入一樣补胚,那么就是最常見的自編碼模型(Auto-Encoder)。如果你的輸出和原始輸入不一樣弹沽,那么就是很常見的人工神經(jīng)網(wǎng)絡(luò)了檀夹,相當(dāng)于讓原始數(shù)據(jù)通過一個映射來得到我們想要的輸出數(shù)據(jù),也就是我們今天要講的話題贷币。
假設(shè)击胜,你有這樣一個網(wǎng)絡(luò)層:
第一層是輸入層亏狰,包含兩個神經(jīng)元i1役纹,i2,和截距項b1暇唾;第二層是隱含層促脉,包含兩個神經(jīng)元h1,h2和截距項b2,第三層是輸出o1,o2策州,每條線上標(biāo)的wi是層與層之間連接的權(quán)重瘸味,激活函數(shù)我們默認(rèn)為sigmoid函數(shù)。
現(xiàn)在對他們賦上初值够挂,如下圖:
其中旁仿,輸入數(shù)據(jù) ?i1=0.05,i2=0.10;
?????????? 輸出數(shù)據(jù) o1=0.01,o2=0.99;
?????????? 初始權(quán)重 ?w1=0.15,w2=0.20,w3=0.25,w4=0.30;
???????????? w5=0.40,w6=0.45,w7=0.50,w8=0.55
目標(biāo):給出輸入數(shù)據(jù)i1,i2(0.05和0.10)孽糖,使輸出盡可能與原始輸出o1,o2(0.01和0.99)接近枯冈。
公式:
??????? 權(quán)重計算:
??????? sigmoid函數(shù):
Step 1 前向傳播
1.輸入層---->隱含層:
計算神經(jīng)元h1的輸入加權(quán)和:
神經(jīng)元h1的輸出o1:(此處用到激活函數(shù)為sigmoid函數(shù)):
同理,可計算出神經(jīng)元h2的輸出o2:
2.隱含層---->輸出層:
?? 計算輸出層神經(jīng)元o1和o2的值:
這樣前向傳播的過程就結(jié)束了办悟,我們得到輸出值為[0.75136079 , 0.772928465]尘奏,與實際值[0.01 , 0.99]相差還很遠,現(xiàn)在我們對誤差進行反向傳播病蛉,更新權(quán)值炫加,重新計算輸出。
Step 2 反向傳播
1.計算總誤差
代價函數(shù)(總誤差):
但是有兩個輸出铺然,所以分別計算o1和o2的誤差俗孝,總誤差為兩者之和:
2.輸出層---->隱含層的權(quán)值更新:
以權(quán)重參數(shù)w5為例,如果我們想知道w5對整體誤差產(chǎn)生了多少影響魄健,可以用整體誤差對w5求偏導(dǎo)求出:(鏈?zhǔn)椒▌t)
下面的圖可以更直觀的看清楚誤差是怎樣反向傳播的:
現(xiàn)在我們來分別計算每個式子的值:
這樣我們就計算出整體誤差E(total)對w5的偏導(dǎo)值赋铝。
3.隱含層---->隱含層的權(quán)值更新:
方法其實與上面說的差不多,但是有個地方需要變一下诀艰,在上文計算總誤差對w5的偏導(dǎo)時柬甥,是從out(o1)---->net(o1)---->w5,但是在隱含層之間的權(quán)值更新時饮六,是out(h1)---->net(h1)---->w1,而out(h1)會接受E(o1)和E(o2)兩個地方傳來的誤差,所以這個地方兩個都要計算苛蒲。
這樣誤差反向傳播法就完成了卤橄,最后我們再把更新的權(quán)值重新計算,不停地迭代臂外,在這個例子中第一次迭代之后窟扑,總誤差E(total)由0.298371109下降至0.291027924。迭代10000次后漏健,總誤差為0.000035085嚎货,輸出為[0.015912196,0.984065734](原輸入為[0.01,0.99]),證明效果還是不錯的。