各位小伙伴們大家好,這幾天我在群里看見了一位小伙伴提出了關于BP神經網絡的反向傳播算法的梯度維度的問題,我對這個問題也很有興趣,所以希望通過這篇文章來去和大家探討下這方面的知識.
在我們學習神經網絡的時候,我們為了不斷地迭代更新目標函數,我們總是不斷地往復更新迭代神經網絡中的各個參數和權值,而在實際過程中我們一般都是使用的矩陣向量化的方式去計算量化,但是如果我們能夠了解這個矩陣求導的過程的話,我們對于反向傳播算法中的梯度問題應該就能夠很好的理解.(很多有疑惑的伙伴應該是看過CS231n吧,我記得沒有讀懂他的那個反向傳播算法梯度的代碼).
神經網絡前向傳播:
在這里因為上邊也提到了,我們都是用的矩陣向量來去表示數據,這里的話每一個變量都是有自己的一個維度的信息的:
神經網絡的反向傳播:
在使用反向傳播去更新參數的時候,一般情況下都需要涉及到參數梯度的求解,那么根據上邊的神經網絡前向傳播公式得到,我們求解的變量的話這時候有dw,dx,db.
現在我們不妨設損失函數loss()=L,并且這個損失函數是一個標量(因為標量對于矩陣的求偏導數的話,矩陣的維度不會發生變化).那這時候我們挨個來,求求dx,dw,db的梯度:
1:dx的梯度:
在這里我們要用到鏈式求導法則,如果有不熟悉的小伙伴請去:
http://61.139.105.132/gdsx/dzja/7/4.htm
回憶下知識再來看這篇文章,效果更好.
根據鏈式求導法則,dx的梯度可以表達為:
由神經網絡的前向傳播中我們知道,每一個變量的維度都是一致的,這時候dx,dw,db的維度分別和x,w,b的維度都是一致的,那么這時候我們就可以得到這樣的條件:
那這時候&y/&x的導數就需要計算下了,這個時候我們就需要矩陣的乘法運算來去計算分析:
1:由上文得,dx的維度是N*D,&L/&y的維度是N*M,那個根據矩陣運算公式,我們可以計算出
那么這時候我們可以得到&y/&x的矩陣維度是M*D,那么這時候我們回頭看一看前邊的條件,W的矩陣維度是D*M,那么&y/&x的矩陣維度豈不是W矩陣的轉置?其實就是這樣.
我們最后得出一個結論:&y/&x的結果是矩陣w的轉置,然后得到以下公式:
那這個時候我們再去求dw,db就會變得非常的toy了,因為思路是相同的:
dw的公式表示為:
再去計算一下:
dw的維度信息如下:
我們這時候可以發現&y/&w的維度是D*N,而x的維度是N*D,這時候其實&y/&w可以看作為一個X的轉置,這樣的話可以表示為:
那db也就可以更快的推出來了:
鏈式求導為:
再來個矩陣乘法:
得到:
另外這里有幾篇比較好的文章推薦給大家:
http://cs231n.github.io/optimization-2/
http://blog.csdn.net/han_xiaoyang/article/details/50321873
https://zhuanlan.zhihu.com/p/25496760
希望大家可以能夠有所收獲,也請各位多多指教