理解卷积神经网
通俗地说,卷积神经网络的核心在于卷积核(kernel),又叫滤波器(filter)。卷积神经网络学习的整个过程,实际上是学得一个最好的滤波器,使得经过滤波后的图像更容易进行分类。
1、卷积神经网络的原理
先来看看卷积的过程,以下是一个3*3的卷积核在5*5的图像上得到3*3卷积输出的过程。卷积核(黄色),在图像(绿色)上遍历,每到一个位置就进行逐元素的相乘并相加。例如在第一个位置,1*1+1*0+1*1+0*0+1*1+1*0+0*1+0*0+1*1=4
知道卷积过程是如何的,接下来通过几张图说明问题,图片来自知乎大神Owl of Minerva。
人为设计一个如图1左侧的7*7的滤波器,用于识别如图1右的曲线A。
图1
有如下图像一张:
当滤波器在某张图像上来到如图2最左侧的区域时,由于卷积操作,可以得到一个很大的响应输出(6600)
图2
而当滤波器来到如图3最左侧的区域时,卷积输出得到的值为0.
图3
如此一来,当我们完成一次完整的卷积操作(黄色框框遍历整张图像)之后,得到的结果叫特征图,特征图上有着很大的输出的位置就是我们要识别的曲线A,而在其他部位只有很低甚至为0的输出。那我们可以说,我们这个手动设计的用于识别曲线A的卷积核成功地在图像上识别出了类似的曲线。然后我们再根据上图设计出大量用于识别不同特征线条的卷积核,就能判断上图是否包含老鼠。
卷积神经网络里需要大量的卷积核对图像的各种特征进行识别。不同的是,在卷积神经网络里,卷积核不是靠人为设计的,而是通过学习得到,学习的过程称为训练。随机初始化一个卷积核,卷积核的参数我们称之为权重(weight),通过正向传播(forward-propagation),得到一个分类结果。训练之初卷积核不会对任何特征进行**,也就是完全不具备分类的功能,那卷积核是如何进行学习的呢?这个时候光正向传播是不够。
举一个例子,当人看到一种陌生的动物的时候,往往不能准确判断其属于什么类别。这时候你拍下一张照片,上网寻找答案。一开始你从它的外形轮廓判断它是一只兔子;你继续搜索资料,然后从它的毛色特点进行判断它应该是鼠兔;你不停查找资料,最终通过它的五官判断得出它原来是一只伊犁鼠兔。这是一个双向的过程,正方向是你不断地基于认识作出判断,反方向是你得到新的反馈并更新你的认识。
在卷积神经网络里,不段基于认知进行判断就是正向传播,而不断通过反馈更新认知就称之为反向传播(back-propagation),正向传播会得到一个分类结果,分类结果与图像真是标签进行比较,得到分类结果与真实标签的差值。我们定义一个损失函数来表征这个差值,然后不断地向网络反馈这个损失,网络不断调整各个卷积核的参数,使得最终得到的损失最小,也就是差值最小。这时候我们的卷积核就相当于学到了图像的大部分特征,使得正向传播分类的结果与真实标签接近一致。
2、为什么要深
上面说到人为设计了一个7*7的可识别曲线A的卷积核,如同上面那张“老鼠”图像,显然一个识别曲线A的卷积核是不能够将其识别出来,还需要识别其它形状的卷积核,如耳朵的特征是圆弧,尾巴的特征是与另一种曲线B,还有眼睛嘴巴等等的线条描述,我把这些特征称之为低级特征。即便具备大量能将所有的低级特征识别出来的卷积核,也不一定能判定这是一只老鼠,因为其他动物或许也有类似甚至相同的线条特征。所以这个时候我们需要将低级特征通过组合得到相对高级的特征,以提高图像的区分度。比如耳朵的线条是圆弧,嘴巴的线条特征是尖尖的一个角,眼睛的特征是一个点,将其组合起来能得到一个老鼠的脸的特征。分类时发现有同时具备圆耳朵,尖嘴巴,小眼睛,那么将更有力地判断它是一只老鼠。
对于卷积神经网络而言,深其实是特征层层表示的需要。比如浅层的特征,例如点、线、面之类的简单几何形状,都是在底层训练出来的,对于这些底层的特征继续进行组合表示,就是后面的若干层的任务。最后把从低级特征组合而来的高级特征在进一步变成语义特征,就可以进行分类了。
文章《Visualizing and Understanding Convolutional Networks 》给出了很好的解释:
第一个卷积层只是表达了简单的图片的边缘而已(上面是反卷积的图片,下面对于第一层来说,**值最大的图片):
第二层稍稍复杂了一点点,可以包含的不仅仅是一个边缘,可以是几个边缘的组合(左侧是反卷积的结果):
第三层得到了更复杂的特征,浅层特征继续组合,比得到了汽车的车轮,鸟类的脚:
第五层,得到了更高级的特征,如人脸,动物的脸,可以进行分类了。
池化(pooling)很好理解,看下图。这是一个Max pooling的操作,其实只是在每个2*2的区域内选取选取最大的值,从一个4*4的sample得到一个新的2*2的sample。一般经过池化后sample的长与宽都是原来的二分之一。
池化最大的作用是对图片进行降采样,保留每个区域(2*2)响应最大的信息,减少图像上的冗余信息,减少参数与计算量,却没不会破坏分类的结果。还有average pooling,是算每个区域的均值。