各位小伙伴们大家好,这几天我在群里看见了一位小伙伴提出了关于BP神经网络的反向传播算法的梯度维度的问题,我对这个问题也很有兴趣,所以希望通过这篇文章来去和大家探讨下这方面的知识.
在我们学习神经网络的时候,我们为了不断地迭代更新目标函数,我们总是不断地往复更新迭代神经网络中的各个参数和权值,而在实际过程中我们一般都是使用的矩阵向量化的方式去计算量化,但是如果我们能够了解这个矩阵求导的过程的话,我们对于反向传播算法中的梯度问题应该就能够很好的理解.(很多有疑惑的伙伴应该是看过CS231n吧,我记得没有读懂他的那个反向传播算法梯度的代码).
![](https://img.haomeiwen.com/i3070770/bd97a1038015939e.jpg)
神经网络前向传播:
在这里因为上边也提到了,我们都是用的矩阵向量来去表示数据,这里的话每一个变量都是有自己的一个维度的信息的:
![](https://img.haomeiwen.com/i3070770/20b826ab8cdd78e6.jpg)
神经网络的反向传播:
在使用反向传播去更新参数的时候,一般情况下都需要涉及到参数梯度的求解,那么根据上边的神经网络前向传播公式得到,我们求解的变量的话这时候有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的维度都是一致的,那么这时候我们就可以得到这样的条件:
![](https://img.haomeiwen.com/i3070770/105a1942089a0175.jpg)
![](https://img.haomeiwen.com/i3070770/f818a07e22f3e19f.jpg)
那这时候&y/&x的导数就需要计算下了,这个时候我们就需要矩阵的乘法运算来去计算分析:
1:由上文得,dx的维度是N*D,&L/&y的维度是N*M,那个根据矩阵运算公式,我们可以计算出
![](https://img.haomeiwen.com/i3070770/cf2231c9f2a523d2.jpg)
那么这时候我们可以得到&y/&x的矩阵维度是M*D,那么这时候我们回头看一看前边的条件,W的矩阵维度是D*M,那么&y/&x的矩阵维度岂不是W矩阵的转置?其实就是这样.
我们最后得出一个结论:&y/&x的结果是矩阵w的转置,然后得到以下公式:
![](https://img.haomeiwen.com/i3070770/c5a6cf682f2da9e6.jpg)
那这个时候我们再去求dw,db就会变得非常的toy了,因为思路是相同的:
dw的公式表示为:
![](https://img.haomeiwen.com/i3070770/9fb9ea7bf77fb02b.jpg)
再去计算一下:
dw的维度信息如下:
![](https://img.haomeiwen.com/i3070770/1450801f69124734.jpg)
我们这时候可以发现&y/&w的维度是D*N,而x的维度是N*D,这时候其实&y/&w可以看作为一个X的转置,这样的话可以表示为:
![](https://img.haomeiwen.com/i3070770/f490f975c1964d6f.jpg)
那db也就可以更快的推出来了:
链式求导为:
![](https://img.haomeiwen.com/i3070770/7f629a53e191c764.jpg)
再来个矩阵乘法:
![](https://img.haomeiwen.com/i3070770/cabc95b45cb79c6c.jpg)
得到:
![](https://img.haomeiwen.com/i3070770/b2282e87514e19f3.jpg)
另外这里有几篇比较好的文章推荐给大家:
http://cs231n.github.io/optimization-2/
http://blog.csdn.net/han_xiaoyang/article/details/50321873
https://zhuanlan.zhihu.com/p/25496760
希望大家可以能够有所收获,也请各位多多指教
网友评论