BP算法是关于误差的反向传播算法,就是从输出层开始,将结果与预期结果相比较,求出误差,然后按照梯度最大下降方向,调整神经元的联接权值,然后依次逐层调整各层之间的连接权值,对于批量学习方式而言,不断重复上述过程,直到误差达到足够小时为止。
对于输出层而言,我们可以直接使用在上一篇博文中关于感知器模型的算法,BP算法的难点在于,如何处理隐藏层,因为隐藏层没有正确的输出信息用来计算误差。
下面我们将从输出层开始,推导出BP算法。在rwy推导算法之前,我们先来定义一下表示方法,和原来一样,我们用i来表示输入(前一层)信号的序号,我们用上标n来是第n个训练样本,我们用下标j来表示输出层(后一层)的神经元编号,当前层用l来表示,前一层用l-1来表示。
我们先来看输出层,对于输出层,由于我们知道每个训练样本对应的希望输出,所以我们可以很容易定义出对于每个训练样本的误差:
式8.1
式中j为输出层神经元序号,L为输出层神经元数量。我们假设输出层为l层,其前一层为隐藏层记为l-1层,则从l-1层第i个节点到l层(输出层)第j个节点的连接权值记为,我们的目标就是根据误差值士求出的调整量。
对输出层每个神经元,我们先求误差对于每个节点的偏导:
式8.2
求误差对每个输出节点输入量的偏导:
式8.3
求误差对每个连接权值的偏导:
式8.4
可以通过将式8.3带入到式8.4求出其值,因为有公式:
式8.5
即可以求出所有输出层相关的连接权值的调整值。
这样我们就完成了输出层的处理,下面我们来看与输出层直接相连的前一层l-1,其神经元序号为i,我们也首先对每个神经元求误差对于输出量的偏导:
式8.6
式8.6中的最后一项,在我们处理输出层时已经计算出来了,这时可以直接使用。
接下来我们求误差对于输入量的偏导:
式8.7
其中最后一项已经由式8.6式计算出来。
求误差对每个连接权值的偏导:
式8.8
式8.8中最后一项在式8.7中已经计算完成,因此权值调整公式为:
式8.9
将式8.8代入到式8.9中,即可计算出输出层前一层l-1层所有连接权值的调整量。
其实上述公式已经完全导出了BP算法,但是为了直观起见,我们再求一下l-2层的计算公式,这是隐藏层的最典型形式。假设l-2层神经元的序号为h。
首先对l-2层每个神经元,求出误差对输出量的偏导:
式8.10
式8.10中的最后一项,在第l-1层时已经计算完成,在这里可以直接使用。
接着我们求出误差对l-2层的输入量的偏导:
式8.11
式8.11的最后一项可以通过式8.10计算得到。
接着求误差对第个连接权值的偏导:在这里我们假设l-3层的神经元序号为g
式8.12
式8.12的最后一项可以通过式8.11计算得到,因此权值调整公式为:
式8.13
至此,我们已经将多层网络的BP算法推导过程完全做完了,可以看出,既使是最简单的神经网络算法,也需要复杂的推导过程。而且,细心的读者也许可以发现,我们上面的推导过程,实际上只针对在线学习方式,既针对每个训练样本的误差调整网络连接权值。我们知道这种方式可能会有权值调整太随机而且低效,因此需要采用批量学习方式,那么上棕推导过程还会更加复杂,在这里就不进行推导了,因为数学并不是我们关注的焦点。
其实这里还没完,对于数学家来说,这个算法虽然出来了,还需要证明采用这种方法,在有限次迭代内,可以达到全局最优解,既需要证明其收敛性,太难了,就不涉及了。
在下一篇博文中,我们将采用Theano框架,实现一个简单的多层前向网络,大家来可以看一下,理论与实际是如何结合在一起的。