近年来,一些传统的领域(计算机视觉、自然语言处理、医疗保健、智能安防等)得到了快速的发展,也取得了可喜的成果。此外,也有一些成熟的技术已经运用到了我们的实际生活中,包括人脸识别解锁技术、指纹识别解锁技术、迎宾机器人等。而这一切都源于卷积神经网络(Convolutional Neural Network, CNN)的出现。本文将给大家详细梳理一下卷积神经网络的来龙去脉。
1. 神经网络 Neural Network
其实,在CNN问世之前,学术界的各位大佬就已经研究神经网络多年。神经网络,即人工神经网络(Artificial Neural Network, ANN)是模仿生物大脑神经结构和功能的一种数学模型。下图所示,是人类大脑中的一个神经元,主要包括树突、细胞体、轴突等。每个神经元,都可以分为:接受区、触发区、传导区和输出区,代表着一个神经元传导信息的一个过程。
因此,仿照着上述神经元的信息处理和传导流程,便设计出一个如下图所示的简易的感知器,它可以接受多个输入(接受区),然后经过处理(触发区),最后产生一个输出(输出区)。
然而,这样的单层网络只能实现非常简单的功能。而对于生物神经网络而言,每个功能的实现都是靠着复杂的神经网络进行传导,因此,对于人工神经网络也是同样的道理,为了实现更复杂的功能,我们便将多个感知器层堆叠起来,设计出了最初的神经网络:
当任务比较简单时,这样的神经网络就足以应对,但是当处理图片等数据时,层与层之间的连接数会快速增长,这也使得计算变得更为复杂。为了解决这个问题,CNN便应运而成。
2. 卷积神经网络 CNN
如果说神经网络是受生物大脑的神经元启发而设计出来的,那么卷积神经网络则是受人类的视觉处理系统的启发。
2.1 人类视觉系统
当我们人类在看到一个物体并进行识别时,我们的视觉系统主要经过以下几个处理步骤:
(1) 摄入原始信号,即瞳孔摄入像素Pixels
(2) 大脑中的V1区域进行初步处理,检测物体的边缘和方向
(3)大脑中的V2区域来判定物体的形状
(4)大脑中的V4区域来进行高层次的抽象,然后判定到底是什么物体
我们可以看到人类视觉是经过这样逐层分级来进行认知的,那么我们可不可以模仿人类大脑的这个特点,构造一个多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?答案是肯定的,这便是CNN的灵感来源。
那么,我们应该怎样来提取这些特征呢?答案便是使用卷积操作!
2.2 卷积
在传统的图像处理中,用一个模板和一副图像进行进行卷积,让模板上的原点和图像上的一点对齐,然后让模板上的点和图片上对应的点相乘,然后将各个点的乘积相加,就得到图片上该点的卷积值。图像处理中常见的mask运算都是卷积,广泛应用与图像滤波。例如下图,我们使用卷积操作来对图像进行平滑操作,一个典型的8领域平滑,平滑后每个点的每个值都来自于原图中对应位置和其周边8个元素与一个3X3的矩阵的卷积:
上图中那个3X3的矩阵也称为核,这个核对图像进行操作,相当于对图像进行了低通滤波。因此这个核也被称为滤波器。而整个操作过程也称作为卷积操作。
2.3 滤波器和卷积神经网络
那么这个滤波器和卷积神经网络存在什么样的关系呢?要理解两者之间的关系,让我们先假设一个问题,假设我们现在要识别图像中某种特定的曲线,也就是我们滤波器要对这种曲线输出很高,而对其他形状的曲线输出很低,而这种效果就很类似于生物神经元的激活。那这个问题要怎么解决呢?
(1) 首先,我们先设计滤波器和想要识别的曲线:
(2) 假设我们要在这张老鼠图上识别这个特定的曲线,那么我们就让滤波器在这张图上移动并求卷积:
(3) 那当滤波器移动到上图右侧那个位置时,按照卷积操作,将滤波器的值和这部分图像的像素值相乘相加,得到一个很大的值(6600),那这说明这部分存在着我们要找的特定曲线:
(4) 当滤波器移动到其他位置时,便得到一个相对较小的值:
当这个滤波器移动完整张图片的时候,我们就可以得到一个激活图,其中,激活图上的值高的区域就代表这个位置有相应的曲线,值比较低的区域就代表不存在这个曲线。
而卷积神经网络的每一层就相当于一系列的滤波器,第一层的滤波器用来检测一些低阶特征(边、角、方向等),随着卷积层的增加,对应层检测到的特征就更加复杂,比如,第二层的输入其实是第一层的输出(滤波器激活图),因此第二层便是检测这些低阶特征的组合情况(如半圆、四边形等),如此累积,因此可以检测到越来越复杂的特征。而我们训练CNN,其实就是训练这些滤波器(weights)。
3. 完整的卷积神经网络
一个典型的神经网络是由卷积层、池化层和全连接层组成的。下面我们使用一个小例子,来看一下这三个层具体进行了什么操作:
(1)卷积层
让卷积核在整张图片上移动,每次移动进行一个卷积操作,最终得到特征图。
在CNN中,我们通常会在卷积层后边加一个激活函数,来增加非线形因素,使得整个网络的表达能力更强。常见的激活函数有多种,在上一篇博客中我已经进行了详细的分析,欢迎大家围观《细谈激活函数》。一般在卷积网络中较常使用的是ReLU函数,我们将上述特征矩阵输入ReLU函数便得到以下结果:
(2)池化层
从卷积操作的过程中,我们可以看出,当Image的size增加时,每层要进行的卷积操作就会增加,这样会使得计算量增加,为了有效的减少计算量,CNN提出了另一个很有效的概念‘池化’。池化就是将输入的图像缩小,减少像素点,只保留比较重要的信息。常见的池化方式包括max-pooling(取区域内的最大值)和mean-pooling(取区域内的平均值)。我们使用2X2的池化区域对上述图像进行max-pooling可以得到以下结果:
对特征图进行max-pooling可以保留池化区域内的最大值,这就相当于保留了这一块的最佳匹配结果。而且从上图可以看出,加入池化层减小了图像的size,可以有效的减少计算量。
(3)全连接层
全连接层在整个卷积神经网络中起到“分类器”的作用,即通过卷积、激活函数、池化等深度网络后,再经过全连接层进行识别分类。首先将经过卷积、激活函数、池化的深度网络后得到的特征进行flatten,然后经过全连接层,最终得到分类结果:
通常,在全连接层的输出之后也会使用一个激活函数,比如使用sigmoid函数,可以使得输出值限制在(0,1)这个区间内。