最近开始接触deep learning,写一些学习心得,毕竟从0开始,理解浅薄。
关于本文,如果你想弄明白BP算法的原理,可以读,如果你只想使用BP算法,请移步到Andrew Ng的讲义:http://ufldl.stanford.edu/wiki/index.php/Backpropagation_Algorithm。
从神经网络最常用的BP算法开始。为了不使问题复杂,我们从一个三层网络开始,下图是来自Andrew Ng(http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity)的讲义:
约定一下符号使用规则:
层数从1开始计数,用表示第L层第i个节点的输入,用表示第L层第i个节点的输出,用
表示第L层的第i个节点与L-1层的第j个节点之间的权重,用表示第L层第i个节点的偏置,假设激活函数用f表示,那么节点有如下关系:
神经网络的核心就是训练权重W和偏置b,因此我们需要一个目标来训练神经网络。设表示最后一层神经网络,假设我们有m个样本,
样本的维度与输入层节点数相同;在上图所示的神经结构中,我们希望输出与输入接近(隐藏层压缩了图像),因此定义如下损失函数(为简单起见,
我忽略了正则项以及很常见的稀疏约束项,我们的重点是推导BP算法):
重申一下,,其中k为输出层节点个数。我们需要训练所有的W和b,因此需要求得J对W,b的偏导,然后通过一种更新规则(比如梯度下降,拟牛顿法等)来迭代更新W,b。无论如何,求得梯度是第一步,注意
对于输出层,直接使用链锁规则:
对于非输出层,偏导与L,L+1,....,n_l层的输出相关,我们使用基于链锁规则的迭代思想计算。在此之前,定义第L层第i个节点的误差项:
假设我们已经计算好了(比如最后输出层的误差项是很容易计算的,这也是需要反向传播的原因),则:
当然,我们希望通过链锁规则以及隐式求导规则给出误差项之间的迭代公式:
补充一句,上式的求和号是因为在全连接中,第L层的节点会影响所有L+1层的节点,如果是卷积神经网络,就不是这样的,所以其实BP算法跟
网络结构相关。
推导到这,原理已经讲清楚了,可以去做Andrew Ng的练习了:http://ufldl.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder。