0 前言
卷积神经网络(Convolutional Neural Network, CNN)的人工神经元可以响应一部分覆盖范围内的周围单元,对于图像处理有出色表现,而且对比全连接神经网络,CNN的结构更简单参数更少。卷积神经网络主要由这几类层构成:输入层、卷积层、池化(Pooling)层和全连接层(全连接层和常规神经网络中的一样)。本文就按CNN的结构顺序为大家介绍。
1 卷积层
1.1 基本原理
在图像处理中常有一个问题,比如下图的一只鸟,如果要使得模型识别出鸟的信息,实际上我们并不需要学习整张图片,而是只需要关注特定部位,比如鸟嘴,羽毛等等。此时仅需要获得特定部位“窗口”的信息,就能有好的效果了。基于这种窗口思想,CNN在图像处理上有显著的效果。
因为“窗口”的存在,无论鸟嘴在哪个位置,都能探测到,这里的“窗口”就是CNN中的filter(滤波器):
假设输入是一个6*6的黑白图片,用0和1表示黑白像素点,将一个filter(滤波器)放在右上角覆盖一块跟filter一样大的区域之后,对应元素相乘,然后求和,然后向右或者向下移动filter,然后再重复计算,这就是“卷积”(这里的“卷积”和数学上的卷积并不是完全一样的,只是借用了移动和相乘相加的概念)。
第一次计算得到了结果为3:
如果向右移动一格,计算得到-1:
这里可以设置不同的移动间隔,就会得到不同的结果,最终遍历整个图像后可以得到一个矩阵。这里我们设置步长为1,移动顺序为从左到右,从上到下,输出结果为一个4*4的矩阵:
这里观察输出矩阵中含有两个3的值,对应到图片和filter则是主对角线上均为3个“1”。简单理解就是,当图片中出现和filter中一样的结构时,得到的输出就会很大。
除了filter1,也会有其他的filter,得到其他的输出结果,设置有多少个滤波器,最后就会输出多少组特征映射:
如果图片是彩色的,也就是需要RGB三组值来描述,那么图片就是三通道的,一个(filter)滤波器就需要是333的规模。这里可以理解为滤波器的“长度”和“宽度”都可以根据情况设置,而“深度”必须和输入一致:
1.2 类比全连接神经网络
这些操作似乎和常见的神经网络模型相去甚远,讲到这里可能会有人问,这和全连接的神经网络有什么关系?
对于全连接神经网络,需要把6*6的图像Reshape成36*1的输入,那么filter可等价于权值w的向量,最后的3就是一个结点的输出,本质上一样是相乘后相加。这里注意“卷积”操作等效于激励函数前的相乘后相加,一般卷积之后还需要经过激励函数层,这里就假设激励函数就是线性的。
下面是按照全连接神经网络的方式来看CNN:
将输入展开之后,可见filter实际仅是对其中九个值进行运算,filter的值就是权值。已经只用了比较少的参数,因为一次只对9个计算。
而且一次是共用同一组的权重,分享权值:
这样做也可以回答为什么说CNN是一种参数更少的网络结构。
2 池化层
对于图片来说,降采样不会改变物体的形态:
所以一般在通过卷积层获得特征(feature map) 之后 ,下一步要做的就是利用这些特征进行整合、分类。理论上来讲,所有经过卷积提取得到的特征都可以作为分类器的输入(比如 softmax 分类器) ,但这样做会面临着巨大的计算量,此时我们就会采用 池化层将得到的特征(feature map) 进行降维。池化一般有两种:
- 最大池化:max-pooling——选取指定区域内最大的一个数来代表整片区域
- 均值池化:mean-pooling——选取指定区域内数值的平均值来代表整片区域
这里用Max-pooling为例,介绍池化。首先根据池化的规模设置,将卷积层的输出进行分组:
每个分组选出一个最大值:
那么原数据的规模将原来6*6,变成4*4,再变为2*2:
卷积+池化的过程可以重复多次。
3 全连接层
我们最终的目的是对这张照片进行识别。那现在得到的是一堆22的矩阵,全连接层将根据这堆22的矩阵进行来得到每个分类类别对应的概率值。全连接层是最基础的神经网络模型,不熟悉的童鞋可以移步我另一篇博客:全连接神经网络。前面的卷积层采用的是“局部连接”的思想。
最后将卷积+池化后feature map拉直,丢入全连接神经网络:
最终这个网络结构训练的除了全连接层的参数,还有就是那些滤波器或者称为卷积核(filter)。
用所有元素求和来表征滤波器被激发的程度,到找对于样本,可以让这个filter的激发的程度最大。可以用梯度下降法:
4 CNN的应用和启示
4.1 围棋
想必大家都听说过大名鼎鼎的围棋AI“阿尔法狗”吧,就是基于CNN的模型,那么为什么可以用CNN来训练围棋呢?
首先是因为围棋本身也是近似于图像的样式,有整体的图案,也有局部的图案,能够跟图片一样使用filter。其次是这些局部图案也是可以出现在不同区域的。
但是实际应用中“阿尔法狗”没有用pooling层,从原文就可以读出:
因为对于围棋来说,降采样不能保持棋局的信息,要求每个点的信息都不能舍弃。
4.2 文本识别
之前有提到filter进行扫描的时候可以从左到右,从上到下。但是在文本数据中,例如下图中的文本是横向排列,那么只能是从左到右扫描,从上到下效果就会很差。