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