`

吐槽一下UFLDL上神经网络反向传播算法的公式

阅读更多
在斯坦福的神经网络课件的反向传播算法一节(http://ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm),对于权重更新,有着以下的公式,记为公式(1)

其中,m为样本个数。
首先,这组公式肯定是正确的,而且是很直观。今天重看时还被其直观性所折服!
这种做法也给了我做事儿的一种思路:先针对一个样本的情况,进行公式的推导,得到初步的结果;在对多个样本再取平均,得到直观的结果~最后,再用严谨的数学推导进行证明,得到简化后的公式。
那么,为什么还要吐槽呢?因为UFLDL课件缺少了最后一步——数学证明,及公式的简化!


下面从公式(1)的直观性——也就是其优点说起:
这组公式啥意思呢?对于一个神经网络(参数为各层的权重矩阵W和偏置向量b),给定一个输入样本x(向量),该网络会产生一个输出y(向量),对应有一个误差J


那么,如果该网络只有一个输入,我们可以对W、b求导。也就是上面公式中的Delta W部分。
如果有m个样本呢,很自然的一种想法就是对导数求平均,这也就是公式中的Delta W要除以m的意义所在!很直观,很容易理解。

对应的总体误差函数如下(另外,还多了个weight decay项):



问题定义清楚了,接下来涉及编程实现了,槽点也就来了:
程序该怎么写?是不是直观的写法就是最好的?
答案显然是否定的,否则课件中也就不会讲什么Vectorization了!
这一部分我没有细看,课件中还是按直观的方法来讲的“你看,我们没Vectorization前使用这个循环写的,balabala,嘿,这个循环正好是矩阵相乘!于是我们可以这么写。。。。”

但是,,但是,,其实我们可以有更为严谨的做法——按照求导的链式法则进行公式的推导(只需要针对一层网络进行推导就可以了,剩下的完全一样)。
采用这种做法,我们得到的结果自然就是矢量化的,而且,,直接根据J(W,b)来求导,我们会得到和直观的公式(1)稍有不同的公式

假设最后一层的输出为Y,误差函数J(W,b)对其导数为 dJ_dY
则,我们再通过dJ_dY进行反向传播,后续的公式中是不会出现样本个数m的!


下面用公式来说明(抱歉,误差J的符号改为E,样本个数m之后用N来代替):

也就是说,只要在输出层对网络输出Y求导时除以了样本个数N,之后各层求导时,就不用再除以N了。而在Andrew Ng的课件中,由于在输出层没有除以N(这样一来,其保留了误差的原始意义,也就各个样本的误差),之后的每一层才需要除以N。也就是我们之前所说的对于各个样本产生的误差(的导数)求平均。
后续的求导公式和课件中给的相同:http://ufldl.stanford.edu/wiki/index.php/Neural_Network_Vectorization

如果想自己用矩阵求导进行推导的话,可以看一下我之前的笔记(建议还是看张贤达老师的书吧,感觉自己写的不够清楚):http://cherishlc.iteye.com/blog/1765932
  • 大小: 2.5 KB
  • 大小: 1.5 KB
  • 大小: 7.4 KB
  • 大小: 62.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics