在上篇《CNN卷积神经网络学习笔记2:网络结构》中,已经介绍了CNN的网络结构的详细构成,我们已经可以初始化一个自己的CNN网络了,接下来就是要用训练得到一个确定的CNN的模型,也就是确定CNN的参数。
CNN本质上就是人工神经网络的一种,只是在前几层的处理上有所不同,我们可以把卷积核看成是人工神经网络里的权值W,而采样层实质上也是一种卷积运算。所以可以基于人工神经网络的权值更新的方法来推导CNN里的权值更新公式。人工神经网络里是用反向传播算法将误差层层回传,利用梯度下降法更新每一层的权值,CNN中也是类似的。所以这里先对传统的BP算法做个概述,然后再推广到CNN中。
1,BP算法
1.1 Feedforward Pass前向传播
首先定义平方误差代价函数:
其中N是样本个数,c是label的维度,对于分类问题,意味着这些样本能分为c类。
定义第l层的输出为:
这里f是激活函数,
上式就是前向传播的公式,每一层对输入(也就是上一层的输出)做运算,得到输出结果,这样将样本信息逐层传递,最后输出一个预测值(predict label)。
1.2 Backpropagation Pass反向传播
预测值与真实值(label)之间必然是存在误差的,反向传播就是要把这个误差信息回传给每一层,让这些层修改他们的权值,使得CNN更精准。
BP算法中是用梯度下降法更新权值的,梯度下降法的更新公式如下:
梯度下降法细节可以参考这里:
http://ufldl.stanford.edu/wiki/index.php/Gradient_checking_and_advanced_optimization
其中
为了求取单个样本的误差代价函数对参数的偏导,这里定义节点灵敏度(sensitivities)
其中的u是
对于参数中的偏置b,因为
每层的灵敏度是不一样的,可以算得:
注意这里y也是b的函数,
进一步求得误差代价函数E对参数中的权值W的偏导:
至此,我们得到了每一层利用梯度下降进行权值更新时需要的梯度,也就是(2),(4),可以看到他们都和灵敏度有关,而灵敏度可由(3)式计算。
在(3)式中,
从灵敏度下手:
所以反向传播其实是通过灵敏度层层回传误差信息,如下就是反向传播的核心公式:
以上是对经典的BP算法做一个概述,CNN中把权值W换成卷积核k,按照(1)(2)(3)(4)(5)式就可以得到CNN的权值更新公式。
2,CNN中卷积层权值更新推导
2.1 对照(1)式计算l层的输出
在CNN中,对于卷积层的每一种输出的特征图
其中,Mj表示选择的输入特征图组合,
2.2 对照(5)式计算灵敏度
因为l+1层是采样层,所以相当于也是做卷积,例如做scale=2的下采样,就是用2*2的每个值为1/4的卷积核卷积图像,所以这里的权值W实际上就是这个2*2的卷积核,它的值是
2.3 对照(2)式计算误差代价函数对偏置b的偏导
也就是对层l中的灵敏度中所有节点求和,这里(u,v)代表灵敏度矩阵中的元素位置:
2.4 对照(4)式计算误差代价函数对卷积核k的偏导:
这里
3,CNN中下采样层权值更新推导
3.1 对照(1)式计算l层的输出
在CNN中,对于采样层的每一种输出特征图
down表示下采样,这里的
3.2 对照(5)式计算灵敏度
3.3 对照(2)式计算误差代价函数对偏置b的偏导
这里和卷积层的b是一样的:
至此我们就得到了CNN的权值更新公式。
下一篇中讨论一个简单的CNN实现。
Reference
《Notes on Convolutional Neural Networks》
http://cogprints.org/5869/1/cnn_tutorial.pdf
以及它的中文翻译:
http://blog.csdn.net/zouxy09/article/details/9993371