卷积神经网络CNN(二)池化、结构、误差反向传播

上一篇介绍了CNN基本概念和卷积的知识,CNN的特征抽取除了包含卷积,还包含池化。

池化

池化又叫子采样,是特殊的卷积。池化比较好理解,还是上篇公司工作交接的例子,每个销售区域有100个老员工,我们可以先推举一个最懂本区域的业务人员参与交接(如各区域的领导),其他人员不必参与交接;或者每个区域内部先开一个会,把100个老员工的经验结合在一起,生成一个会议纪要,根据这份纪要与新员工交接。这实际对应两种池化方式,前一种是最大化池化,后一种是平均池化。

放到图像识别的例子里,池化是为了降维。例如一个250*250像素的图像,从上到下、从左到右用2*2大小的矩阵扫描,也就是说250*250的图像中每个连在一起2*2的小图像,都用这四个点中像素值最大的点代替,其他像素点舍弃;或者用这四个像素值的均值代替,也就完成了池化。注意平均池化实际相当于卷积核元素都是1的矩阵。

卷积神经网络CNN(二)池化、结构、误差反向传播

以上图为例,池化以后图像会变模糊,高、宽变为原来的一半。

结构

之所以没在本篇开头说结构,是因为希望大家一开始有个感性的认识,知道卷积是为了做什么,池化是为了做什么,否则一开始看结构会不知所云,不便于理解。

在了解卷积、池化以后,CNN的结构就比较简单了,首先它依然有输入层和输出层,输入层是一个矩阵,接收图像的二维矩阵信息(此处图像只考虑一个通道),经过卷积、池化、卷积、池化……得到的依然是矩阵。但是输出层与BPNN一样,并非一个矩阵,而是一个向量,例如(1, 0, 0)代表图像是狗,(0, 1, 0)代表图像是猫, (0, 0, 1)代表图像是鸟,(0.9, 0.1, 0)代表图像很大概率是狗,小概率是猫,所以CNN在最后的结构需要把矩阵展开,然后类似BPNN那样全连接神经网络,输出到一个一维向量中。

误差反向传播

首先了解前向传播。前向传播的过程是,图像的原始像素值输入到CNN中,经过卷积操作,得到特征平面,特征平面经过**函数**,输出到池化层,池化层经过简单的最大值池化或均值池化,再输出给下一层卷积,经过N次这样反复处理,即可完成从识别简单的轮廓、线到识别抽象物体的飞跃。以上过程存续的结果都是二维的矩阵。最后连接到一个全连接层,输出成一个一维向量。最后经过**函数即可得到图像属于每个类的概率。

卷积层的**函数可以选择ReLU函数(线性整流函数),池化层没有**函数,池化的结果直接传递给下一层,输出层的**函数可以选择Softmax,Softmax是专门处理多分类的**函数,可以输出样本分别属于各个类的概率。

ReLU函数见下图

卷积神经网络CNN(二)池化、结构、误差反向传播

ReLU函数有一定生物学道理,即信号到达一定阈值以后才**

Softmax函数见下式

卷积神经网络CNN(二)池化、结构、误差反向传播

其中Z是一个k维向量,各个分量用e做指数,占指数之和的比例,即为Z属于该类的概率。

需要训练的参数是卷积核矩阵中的值以及偏置。训练好的卷积核矩阵理论上可以表示物体的相关特征(如针对汽车的轮胎形状)。

误差反向传播与BPNN不太一样,因为涉及到卷积、池化的操作,稍微有些复杂。从后往前分析,全连接层的反向传播不太复杂,只需要把softmax或其他**函数形式写出来求导即可。比较关键的是卷积层、池化层的反向传播。

(1)池化层向上传播

假设CNN的结构是卷积层A(L-1层)**-本池化层(L层)-卷积层B,即本池化层上一层是卷积层A,下一层是卷积层B。还记得BPNN里的δ吗,很多神经网络都用了这个结果。δ表示误差传播到节点的结果,这里想给大家灌输一个思想,δ具体来看是损失函数对这个节点**前的导数。

已经知道误差传播到本池化层的结果是卷积神经网络CNN(二)池化、结构、误差反向传播(即误差对本池化层**前的导数),现在求误差传播到卷积层A的结果卷积神经网络CNN(二)池化、结构、误差反向传播

正向传播的时候,从卷积层A到池化层分别作了**、池化操作,所以误差反向传播的时候要先求池化的导数,再求**函数的导数。

池化使得结果降维(如文章开头250*250降维成125*125),所以为了将误差还原回去,需要从降维后的小矩阵125*125还原回降维前的大矩阵250*250。

如果是最大值池化,那么将误差指定给小范围矩阵像素最大值的点;如果是平均值池化,那么将误差平均分给小范围矩阵的各个点即可。我们把这个过程叫做upsample,顾名思义,这里的操作是将维度扩大,将误差以一定规则分给小范围的各个点。还是公司工作交接的例子,假如某个销售区域交接工作出了差错,如果是最大化池化,由于是领导在进行工作交接,那么让领导背锅;如果是平均池化,由于大家都参与了开会并形成会议纪要,那么所有区域员工都背负相同的责任。


因此卷积神经网络CNN(二)池化、结构、误差反向传播


其中a表示**后的值(activation), z表示**前的值。

上式最右侧两项分别表示对池化求导和对ReLU等**函数求导。

(2)卷积层向上传播

假设CNN的结构是池化层A(l-1层)-本卷积层(l层)-池化层B,即本卷积层向上把误差传播到池化层A。已经知道误差传播到本卷积层的结果是卷积神经网络CNN(二)池化、结构、误差反向传播(即误差对本卷积层**前的导数),现在求误差传播到池化层A的结果卷积神经网络CNN(二)池化、结构、误差反向传播

正向传播的时候,由于池化层没有**(池化后的样子就是传到下一层的样子),所以从池化层A到卷积层只有卷积的操作,所以误差反向传播就是求卷积的导数。

卷积的导数稍微有些特别,因为卷积操作本身比较特别。

卷积神经网络CNN(二)池化、结构、误差反向传播

这里的*表示卷积,rot180表示将矩阵旋转180度,即上下各翻转一次。

下面用一个例子说明,为了简化假设这里偏置都为0。

卷积操作如下图所示

卷积神经网络CNN(二)池化、结构、误差反向传播

现在z传过来的误差是卷积神经网络CNN(二)池化、结构、误差反向传播

例如,对于a11来说,它只参与了z11的运算,卷积神经网络CNN(二)池化、结构、误差反向传播J代表损失函数。


对于a12来说,它参与了z11和z12的运算卷积神经网络CNN(二)池化、结构、误差反向传播


同理,可以得到

卷积神经网络CNN(二)池化、结构、误差反向传播

以上可以表示成

卷积神经网络CNN(二)池化、结构、误差反向传播

其中*表示卷积

δ推导到各个卷积核具体权重和每层偏置就十分简单了,与BPNN道理一样,这里不再详述。

卷积神经网络CNN(二)池化、结构、误差反向传播

卷积神经网络CNN(二)池化、结构、误差反向传播

总结

为了处理图像问题,BPNN的算法不易求解,而且不符合仿生学的特点。CNN是专门为了处理图像等矩阵形成的神经网络,后一层神经元只与前一层部分区域神经元相连,大大减小参数;相连的权重是公用的,更进一步减小参数;池化层对图像降维,继续减小了参数。是在满足仿生的基础上不断减小参数,使得CNN可以训练。

延续BPNN的思想,CNN误差向后传导重点是求δ,δ是误差传播到节点的值,具体地说,是损失函数对节点输入值(未**前的值)的导数。求出δ再求误差对权重、偏置的导数就十分容易了。由于卷积与池化交替进行,所以“卷积向上传导到池化”和“池化向上传导到卷积”情况不同。池化的操作求导比较容易理解,卷积的操作求导稍微有些复杂,需要对矩阵旋转操作。我们用一个例子证明了算式的正确性。

参考资料

1. http://www.cnblogs.com/pinard/p/6489633.html