前言
之前寫過單層前饋神經網絡,但是其中的推導是針對sigmoid函數的,本篇博客使用矩陣向量求導方式進行反向傳播算法的推導
符號約定
符號 |
含義 |
Sini |
第i層神經元的輸入,若一層有n個神經元,則Sini是一個n∗1的向量 |
Souti |
第i層神經元的輸出,若一層有n個神經元,則Souti是一個n∗1的向量 |
Wi |
第i層神經元對應的權重矩陣,若i−1層有m個神經元,第i層有n個神經元,則Wi爲n∗m的矩陣 |
Bi |
第i層的偏移矩陣,若一層有n個神經元,則Bi是一個n∗1的向量 |
cost |
損失函數值 |
若x表示⎣⎢⎢⎡x1x2....xn⎦⎥⎥⎤,第i層的激活函數向量fi(x)表示爲⎣⎢⎢⎡f(x1)f(x2)....f(xn)⎦⎥⎥⎤,f(x)爲激活函數,(fi(x))′表示爲⎣⎢⎢⎢⎡∂x1∂f(x1)∂x2∂f(x2)....∂xn∂f(xn)⎦⎥⎥⎥⎤
基於上述符號約定,對於第i層的神經元,我們有
Souti−1=Sini=fi(Sini−1)WiSouti−1+Bi
標量對向量求導的鏈式法則
對於n層前饋神經網絡,我們有
cost←Sinn←Sinn−1.....←Sin1
左箭頭表示映射,對於前饋神經網絡,映射即爲
Sini+1=Wi+1fi(Sini)+Bi+1
損失函數與最後一層的映射需要依據損失函數的類型決定(例如均方誤差、交叉熵),在上述映射關係的基礎上,標量對向量求導的鏈式法則定義爲
∂Sini∂cost=(∂Sinn−1∂Sinn∗∂Sinn−2∂Sinn−1∗.......∗∂Sini∂Sini+1)T∗∂Sinn∂cost=(∂Sini∂Sini+1)T∗.....∗(∂Sinn−2∂Sinn−1)T∗(∂Sinn−1∂Sinn)T∗∂Sinn∂cost=(∂Sini∂Sini+1)T∗.....∗(∂Sinn−2∂Sinn−1)T∗∂Sinn−1∂cost=.......=(∂Sini∂Sini+1)T∂Sini+1∂cost
常用向量對向量求導的公式
若Y=AX+B,Y、X、B爲向量,A爲矩陣,使用分子佈局,則有∂X∂Y=A
反向傳播算法推導
假設有一個n層前饋神經網絡,則第i層的梯度爲
∂Sini∂cost=(∂Sini∂Sini+1)T∗∂Sini+1∂cost=(Wi+1)T∗∂Sini+1∂cost☉(fi(Sini))′(式1)
☉爲Hadamard乘積,用於矩陣或向量之間點對點的乘法運算,即相同位置的元素相乘,對於最後一步,具體的理解如下,假設第i層有n個神經元
(Wi+1)T∗∂Sini+1∂cost☉(fi(Sini))′=======(∂f(Sini)∂Sini+1)T∗∂Sini+1∂cost☉(fi(Sini))′∂f(Sini)∂cost☉(fi(Sini))′⎣⎢⎢⎢⎡∂f((Sini)1)∂cost∂f((Sini)2)∂cost......∂f((Sini)n)∂cost⎦⎥⎥⎥⎤☉(fi(Sini))′⎣⎢⎢⎢⎡∂f((Sini)1)∂cost∂f((Sini)2)∂cost......∂f((Sini)n)∂cost⎦⎥⎥⎥⎤☉⎣⎢⎢⎢⎢⎡∂((Sini)1)∂f((Sini)1)∂((Sini)2)∂f((Sini)2)......∂((Sini)n)∂f((Sini)n)⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡∂f((Sini)1)∂cost∗∂((Sini)1)∂f((Sini)1)∂f((Sini)2)∂cost∗∂((Sini)2)∂f((Sini)2)......∂f((Sini)n)∂cost∗∂((Sini)n)∂f((Sini)n)⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎡∂((Sini)1)∂cost∂((Sini)2)∂cost......∂((Sini)n)∂cost⎦⎥⎥⎥⎤∂Sini∂cost
接下來就是權重更新的梯度,推出第i層的梯度後,對權重梯度與偏移的求導可以使用定義法求得到:
∂Wi∂cost=∂Sini∂cost∗(Souti−1)T(式2)
∂Bi∂cost=∂Sini∂cost(式3)
∂Sinn∂cost需要依據矩陣求導的定義法自己求出,求出後,即可依據式1、2、3求出各參數的梯度,關於矩陣求導的定義法,可以查看快,快點我,我等不及了