深度学习之Backpropagation算法(二)

上一篇讲了一些基本概念,这里继续讲feed forward网络学习的基本过程。

所谓学习,其实是先准备好训练数据(以及测试数据),然后反复对训练数据进行计算并同预期的结果比较, 然后在适当地时刻调整参数。训练是分很多次的, 每一次称为一个epoch。一个epoch会用到所有的训练数据。每个epoch中, 会对数据随机分组, 每个小组成为mini batch。对于一个mini batch, 每个数据计算完之后,都会求出一个对应的对参数调整的值(delta w和delta b)。但是并不会立即调整参数(w, b),而是等到一个mini batch结束之后, 再整体调整参数。之后下一个mini batch, 就会用到更新好的w,b了。
经过很多轮这样的过程之后(也可以每轮之后都检测一下,及时发现问题),可以在测试数据上进行检测,看最终计算的w,b是否能达到需求。

对于每个数据如何计算呢?假如输入为x, 预计的输出为d。有了w和b之后,可以比较简单的计算出结果y(矩阵加法和乘法)。这个过程是forward过程。
然后算d和y之间的差距,并且根据这个差距的大小,来计算w和b应该改动多少。这个过程是backward过程,而这个过程中运用到的算法,就是大名鼎鼎的backpropagation了。

back propagation的推导在很多文章里面都有写,并且写得非常详细,我这里并不会把每个具体步骤都写下来。而是主要对我看到的文章中说的不清楚的地方做一个重点说明。这段话基本是废话, 下面是干货,帮助很久之后的我或者其他倒霉的读者从头到尾理解算法。

我个人真正初步弄懂算法的过程,得益于《Neural Networks - A Comprehensive Foundation Second Edition》一书。此书从183页开始,有细致的推导步骤。
作者将backpropagation的推导过程分为两种,一种是当神经元是最后一层(输出层)的时候,另一种神经元在隐藏层的时候。
两种推导都没啥毛病。除了一点。。。对于神经元在隐藏层的情况,他的证明过程基本上只能应用在倒数第二层上。虽然结论是正确的,但我实在不能理解他是如何推广到所有隐藏层的。

v与y之间的关系

比如上面这个公式,明显在k是输出层的时候,j只有在输出层之前的一个隐藏层,才是合理的。

因此我之后又在网上找其他的证明方式, 发现大多数地方居然证明跟此书上的一样的。。。很费解。终于,让我找到了这篇文章,并没有用损失函数对最后一层的error求导, 而是直接对下一层的z进行了求导:

Paste_Image.png

为啥能这样呢? 前一篇有讲到神经元输出的公式,从头到尾的计算其实就是这个公式不断地迭代。而最终的损失函数中的每个e其实都可以写成最后一层a的函数。求导时不断应用chain rule,展开到i+2层时应该就可以转化成该公式写的样子。
而这个公式基本上使用于任何隐藏层。

好了, 理论就是这样的。但是编程起来,并不能每个具体的w,b进行单一计算,而是应该写成矩阵,代码会简洁而明确。
关于具体的代码,这里推荐《neural networks and deep learning》。地址在此。第一章就有代码,不过代码是运行于python 2.x的,我自己写的时候,是按python 3.x的语法写的。内容基本上一样,就是range,xrange的一些改变, 以及我自己随机生成了一些数据,方便直接运行看结果。稍后会整理一下,如果可能的话,把代码的链接发出来。

你可能感兴趣的:(深度学习之Backpropagation算法(二))