這篇文章主要討論神經網絡的反向傳播的細節,“誤差”是如何反向傳播的,我們又是如何利用梯度來優化參數的。
在學吳恩達機器學習視頻的神經網絡那節時,給出了許多公式,比如計算每層的誤差,每層參數的梯度,但並沒有給出推導過程,可能也是考慮入門級,大多人並不要知道其中含義就可以運用算法了。接下來我會給出詳細的推導過程,幫助大家理解。
注意接下來所講是未正則化的神經網絡。
1 計算公式
1.1 正向傳遞
假設現在有一個三層的神經網絡,如圖:
參數含義:
- θ(i) 第 i 層的參數矩陣
- z(l) 第 l 層的輸入
- a(l) 第 l 層的輸出
傳遞過程:
- a(1)=x
- z(2)=θ(1)a(1)
- a(2)=g(z(2))(adda0(2))
- z(3)=θ(2)a(2)
- h=a(3)=g(z(3))
其中g 爲sigmoid激活函數。
1.2 反向傳播
我們用δ(l) 表示每層的”誤差“,y 爲每個樣本的標籤,h 爲每個樣本的預測值。
吳恩達在課裏面提到,”誤差“的實質是 δ(l)=∂z(l)∂J ,沒錯,後面詳細說明。
先來從後往前計算每層的“誤差“。注意到這裏的誤差用雙引號括起來,因爲並不是真正的誤差。
- δ(3)=h−y (1)
- δ(2)=(θ(2))Tδ(3)g′(z(2)) (2)
注意第一層是沒有誤差的,因爲是輸入層。
然後來計算每層參數矩陣的梯度,用Δ(l) 表示
- Δ(2)=a(2)δ(3) (3)
- Δ(1)=a(1)δ(2) (4)
最後網絡的總梯度爲:
- D=m1(Δ(1)+Δ(2)) (5)
到這裏反向傳播就完成了,接着就可以利用梯度下降法或者更高級的優化算法來訓練網絡。
2 推導
這裏只推導 δ和Δ 是怎麼來的,其餘的比較好理解。
首先明確我們要優化的參數有 θ(1),θ(2) ,利用梯度下降法的思想,我們只需要求解出代價函數對參數的梯度即可。
假設只有一個輸入樣本,則代價函數是:
J(θ)=−ylogh(x)−(1−y)log(1−h)
回顧下正向傳遞的過程,理解其中函數的嵌套關係:
- a(1)=x
- z(2)=θ(1)a(1)
- a(2)=g(z(2))(adda0(2))
- z(3)=θ(2)a(2)
- h=a(3)=g(z(3))
然後我們來求解代價函數對參數的梯度,∂θ(2)∂J(θ) ,∂θ(1)∂J(θ) 。
根據鏈式求導法則,可以計算得到:
把我畫紅線的地方令爲δ(3) ,是不是就得到了反向傳播中的公式(1)?
把畫綠線的部分令爲Δ(2) ,就得到了公式(3)。我們接着算:
同樣把紅線部分令爲δ(3) ,紫色部分令爲δ(2) ,就得到了公式(2)。
綠線部分令爲Δ(1) ,就得到了公式(4)。
至此,推導完畢。得到這個規律後,便可以應用到深層次的網絡中,計算反向傳播時就很方便了。
上面的公式因爲書寫麻煩,便只寫了結果。如果你用筆去慢慢推幾分鐘,會發現其實很簡單。
下面是大半年前給實驗室做報告做的PPT,沒想到現在重新學到這裏,感覺許多小細節記不清,故溫故一遍。