卷积神经网络
CNN已经成为图片分类比较成熟的算法,在上一节中我们介绍了卷积,可以在本站点搜索卷积,就能看到卷积的相关介绍,这下可以趁热打铁进入CNN的学习。
卷积核
上一个文章中我们了解到卷积,下面咱们就来理解一下卷积核了。
卷积核的表达式
$$f=wx+b$$
很简单吧,这就是一个线性关系的表达。咱们来看个图吧:
这下是不是理解了,其实就是一个映射关系,表达的简单点也没有什么关系。
上图中我们的卷积核就是黄色的矩阵。经过九宫格的点乘,就得到了粉色的一个元素,而这个粉色的数字就是我们要的feather map。 经过这一层压缩,九个数字就变成了一个数字,当然这是一个有损的压缩,你可以理解成特征提取。 小黄格每次移动一个格子,就相当于卷积的的滑动。
需要说明的是,上个公式的w和b 是通过迭代训练得到的,当时不是我们凭空定下来一个。
卷积的参数
当你使用卷积神经网络的时候,你可能更加关注几个参数,一个padding(填充) 另一个是striding(步长)。
padding 简单说就是用0去填充图片边界的像素;
就像上图这样做的。
这时你需要问 擦 填这种0 有毛线用?
其实这里的用途主要有两种:
1.保持边界信息,因为边界仅仅能被卷积卷一次,而中间的元素能被卷积多次扫描。一定程度上其实是降低了边界的重要程度。
2.如果输入图片的尺寸有差别,那padding的用途就更大了,可以通过padding对图片进行填充,从而达到尺寸一致的效果。
striding就比较好理解,就是卷积在图片的中的滑动步长,当然你如果选择这个“步长”太大,特征就不会太明显,但是计算量却降低了不少。这个就需要根据情况和场景自行选择了。
池化层
池化层分为两种:
一种是最大池化层,就是取范围内最大的数作为当前的特征。
一种是平均池化层,就是取区域内的均值作为当前特征。
这里我们可以想象池化层到底有什么作用呢?
- 肯定降低了计算量,也是一种压缩,同时也是一次特征提取
- 防止过拟合,当然了因为又抽象了一次吗。
- 提高泛化能力,这个也能理解,就是信息损失了一部分,但是却得到了更加好的泛化能力。
CNN的传播过程
其实我个人觉得神经网路这种东西,抠的这么细是没啥必要的,但是总有一些变态的人希望你了解这些东西,其实即使你了解了,你用的可能性还是很小。
CNN的前向传播
1.对于卷积层,卷积核与输入矩阵对应位置求积再求和,作为输出矩阵对应位置的值。如果输入矩阵inputX为M*N大小,卷积核为a*b大小,那么输出Y为(M-a+1)*(N-b+1)大小。
2.对于池化层,按照池化标准把输入张量缩小
3.对于全连接层,按照普通网络的前向传播计算
CNN反向传播
首先要注意的是,一般神经网络中每一层输入输出a,z都只是一个向量,而CNN中的a,z是一个三维张量,即由若干个输入的子矩阵组成。其次:
1.池化层没有激活函数。这个问题倒比较好解决,我们可以令池化层的激活函数为σ(z)=z,即激活后就是自己本身。这样池化层激活函数的导数为1。
2.池化层在前向传播的时候,对输入进行了压缩,那么我们向前反向推导上一层的误差时,需要做upsample处理。
3.卷积层是通过张量卷积,或者说若干个矩阵卷积求和而得到当前层的输出,这和一般的网络直接进行矩阵乘法得到当前层的输出不同。这样在卷积层反向传播的时候,上一层误差的递推计算方法肯定有所不同。
4.对于卷积层,由于W使用的运算是卷积,那么由该层误差推导出该层的所有卷积核的W,b的方式也不同。
举个栗子
已知池化层的误差,反向推导上一隐藏层的误差
在前向传播时,池化层我们会用MAX或者Average对输入进行池化,池化的区域大小已知。现在我们反过来,要从缩小后区域的误差,还原前一层较大区域的误差。这个过程叫做upsample。假设我们的池化区域大小是2x2。第l层误差的第k个子矩阵$δ_l^k$为:
如果池化区域表示为a*a大小,那么我们把上述矩阵上下左右各扩展a-1行和列进行还原:
如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:
如果是Average,则进行平均,转换后的矩阵为
上边这个矩阵就是误差矩阵经过upsample之后的矩阵,那么,由后一层误差推导出前一层误差的公式为:
是不是一目了然?
已知卷积层的误差,反向推导上一隐藏层的误差
公式如下:
下一层的权重$w$的转置操作,变成了旋转180度的操作,也就是上下翻转一次,左右再翻转一次,这其实就是“卷积”一词的意义(我们可简单理解为数学上的trick),可参考下图,$Q$是下一层的误差,周围补0方便计算,$W$是180度翻转后的卷积核,$P$是$W$和$Q$做卷积的结果:
已知卷积层的误差,推导该层的W,b的梯度
经过以上各步骤,我们已经算出每一层的误差了,那么:
a)对于全连接层,可以按照普通网络的反向传播算法求该层W,b的梯度。
b)对于池化层,它并没有W,b,也不用求W,b的梯度。
c)只有卷积层的W,b需要求出,先看w:
结语
话说真心是很复杂呀,一些细节将来有机会还会做补充,不过性价比可能并不高。