神經網絡表示
讓我們來看一個最簡單的神經網絡,該神經網絡只有三層,分別是輸入層,隱藏層和輸出層。
爲了表示方便,我們把線性函數和非線性函數分開,神經網絡可以畫成如下:
其中φ(x)表示激活函數,我們知道神經網絡算法就是爲了擬合一個函數從而實現分類或迴歸等任務。由於前面只使用了線性函數,只能擬合線性函數,但在實際上很多任務的函數形態都是非線性的,所以激活函數的作用就是爲了增加函數的非線性,這樣就可以擬合任意函數了。
言歸正傳,整個函數可以寫成:
a1a2z1z2y=w11x1+w12x2+b1=w21x1=w22x2+b2=φ(a1)=φ(a2)=w1z1+w2z2+b
梯度下降法
然後定義損失函數:E=21(y−Y)2。其中Y爲真實的label,y爲預測值,現在我們的任務就是希望通過數據集,不斷訓練學習到一個函數使得這個損失函數最小。也就是要求minE時的w,b參數。
要求minE時的w,b參數,在神經網絡算法中分爲兩個步驟,前向誤差傳播和反向誤差傳播,其中核心都是使用了梯度下降法。
使用梯度下降法,可以求解最小二乘問題,這還得從Taylor級數多起,對於多元函數f(x)=f(x1,x2,x3...)而言,它的梯度(也就是所有偏導數寫成向量的形式),可以寫成
f(x)′=(∂x1∂f,∂x2∂f,∂x3∂f...)
該函數的Taylor級數爲:
f(x)=f(x0)+f(x0)′(x−x0)+21(x−x0)TH(x−x0)+O(∣x−x0∣3)
其中H爲Hessian矩陣,由於二次項以及之後的高次項影響較小,求導麻煩,一般計算時會忽略。所以可寫成這樣:
f(x)=f(x0)+f(x0)′(x−x0)
上述式子表示在x=x0這個位置上,f(x)函數可以近似寫成右側形式。
由於梯度方向是函數增長最快的方向,目標函數f(x)往往是誤差函數,往往我們還會定義學習率η,每次下降一點點,若η太大會導致當前位置跳到另一側較高點,迭代多次出現震盪,無法收斂。
於是,我們可以把剛剛的泰勒級數寫成更新式:
x1k+1=x1k−η∂x1∂fxk
∂x1∂f爲當前點對所有需要學習參數的偏導的集合。
隨機定義需要學習的9個參數值:{w11,w12,w21,w22,w1,w2,b1,b2,b}
採用sigmoid作爲非線性激活函數。
f(net)=1+e−net1
其導數爲:
f(net)′=f(net)(1−f(net))
前向誤差傳播
神經網絡根據輸入x1,x2得到輸出y,可以列出以下式子:
y=f(w11x1+w21x2+b1)∗w1+f(w12x1+w22x2+b2)∗w2+b
由於隨機定義了需要學習的參數,輸出y與真實標籤Y有一定的差距。
令E(w)=21(y−Y)2=21(f(w11x1+w21x2+b1)∗w1+f(w12x1+w22x2+b2)∗w2+b−Y)2,要求得E(x)最小。
使用F(x)對各個參數求偏導令爲0,再進行迭代,定義一個學習率,進行迭代。
∂w11∂E,∂w12∂E,∂w21∂E,∂w22∂E,∂b1∂E,∂b2∂E,∂b∂E
比如說
∂b1∂E=f(w11x1+w21x2+b1)(1−f(w11x1+w21x2+b1))∗w1=0
再使用梯度下降法更新:
參考sigmoid的導數:f(net)′=f(net)(1−f(net)),以此類推。
反向誤差傳播
回到剛纔的誤差準則函數:E(w)=21(y−Y)2。這一次,要進行反向傳播,那麼先從輸出開始看。
後向傳播要做的事情,實際還是求出偏導數∂w∂E,∂b∂E,來進行迭代。
怕大家忘了,重新搬出這張圖:
下面涉及到公式就比較複雜了,但是不要慌,實際就是使用了鏈式法則來求,只要根據上圖來,耐心地看完,就應該能看懂。
根據神經網絡圖,有:
∂y∂E=(y−Y)
∂a1∂E=dydE∂z1∂y∂a1∂z1=(y−Y)∗w1∗f(a1)′
∂a2∂E=dydE∂z2∂y∂a2∂z2=(y−Y)∗w1∗f(a2)′
於是可以算出所有待求偏導數:
∂b∂E=∂y∂E∂b∂y=(y−Y)∗1
∂w1∂E=∂y∂E∂w1∂y=(y−Y)∗z1
∂w2∂E=∂y∂E∂w2∂y=(y−Y)∗z2
∂w11∂E=∂y∂E∂z1∂y∂a1∂z1∂w11∂a1=(y−Y)∗w1∗f(a1)′∗x1
∂w12∂E=∂y∂E∂z1∂y∂a1∂z1∂w12∂a1=(y−Y)∗w1∗f(a1)′∗x1
∂b1∂E=∂y∂E∂z1∂y∂a1∂z1∂b1∂a1=(y−Y)∗w1∗f(a1)′∗1
∂w21∂E=∂y∂E∂z1∂y∂a1∂z1∂w21∂a1=(y−Y)∗w1∗f(a1)′∗x2
∂w22∂E=∂y∂E∂z2∂y∂a2∂z2∂w22∂a2=(y−Y)∗w2∗f(a2)′∗x2
∂b2∂E=∂y∂E∂z2∂y∂a2∂z2∂b2∂a2=(y−Y)∗w1∗f(a2)′∗1
求出偏導數之後,進行迭代就完事了。
上面顯示了一個簡單的三層神經網絡的前向傳播與後向傳播的公式推導,一般進行學習的時候,會把一個batch的數據往學習器裏送,先進行一次前向傳播,再進行一次後向傳播,當訓練完所有訓練集,稱之爲一個epoch。有機會給大家推導一下一般形式的三層BP神經網絡~