卷积神经网络是近年来深度学习能在计算机视觉领域取得突破性成果的基石。它也逐渐在被其他诸如自然语言处理、推荐系统和语音识别等领域广泛使用。
一、卷积神经网络简介
卷积神经网络的结构:卷积层、池化层、全连接层。全连接层通常作为网络的最后几层,其中的每个神经元都与上层中的所有神经元相连,所以称之为全连接层。全连接层之前是若干对卷积层与池化层,卷积层与池化层一一对应,且卷积层在前,池化层在后。本质上卷积层与池化层作用是将原始的数据中的特征进行抽象,全连接层则利用这些抽象出来的特征对样本数据进行分类,并未样本打上标签。
卷积层与池化层是卷积神经网络的核心部分。
卷积层:由若干特征图构成,特征图由卷积核对输入数据卷积后得到,卷积核可被看做是一种对特定特征非常敏感的探测器。卷积核对输入数据卷积的过程就是,实际就是尝试发现输入数据中某个特征的过程。特征图会记录卷积核在原输入数据不同部分的激活程度(特征越契合,激活程度越高)。每个卷积核负责识别一种特定特征,卷积后将产生一张对应该特征的特征图,卷积层通常由若干个卷积核与之对应。
池化层的价值在于缩减输入数据的规模,比如将特征图中若干个激活值合并为新特征图中的一个激活值。合并方法很多,比如最大值合并、平均值合并和随机合并,采用何种方法根据业务来定。
二、卷积层
卷积核的宽和高,以及卷积核的个数由人工预定义得到。卷积核对什么特征敏感,是随机初始化经过不断训练逐步确定下来的。卷积核是需要训练的主要部分,目的是使其对输入数据中的关键特征敏感,从而最大限度的帮助后序神经网络中的卷积核抽取更高级的特征,最终帮助后序全连接层进行更好的类别判断。
特征识别是一个循序渐进的过程,越靠近输入层的卷积核,其使用的卷积核所能识别的特征就越基础,后序卷积层中的卷积核会对前序卷积核所识别的特征进行进一步抽象,得到更高级的特征。比如做猫的图像识别,第一个卷积层中的卷积核所能识别的可能只是一些边缘等,而接近输出层的卷积核可能就能够识别眼睛、嘴巴等高级特征。
卷积神经网络相对于传统前溃神经网络,一方面,卷积层保留输入形状,使图像的像素在高和宽两个方向上的相关性均可能被有效识别;另一方面,卷积层通过滑动窗口将同一卷积核与不同位置的输入重复计算,从而避免参数尺寸过大。通过“局部感知野”和“权重共享”,大大减少了网络中的连接个数,即减少了需要训练的参数个数,极大地降低了模型训练所需的计算量。
试想一下如果原始输入数据是一张1000*1000分辨率的图像,假定隐层神经元数量与输入图像的像素数相同,且隐层与输入层之间采用全连接的方式,即每个隐层神经元都连接着输入图像中的每个像素,则输入层与这个隐层之间将会有10的12次方个连接存在,这么多参数需要训练。并且,如果该隐层与下一个隐层之间也采用全连接的方式,则参数数量的增加是指数级的。
卷积神经网络中,输入数据特征的识别不是通过与下一个隐层全连接来实现的,而是通过一个小得多的卷积核来实现。通常所需识别的特征只占整个输入数据中的很小部分,所以每个卷积核只需跟图像中的一个较小的局部连接即可,比如10的平方,这就是“局部感知野”。假定与输入层直接相连的隐层同样存在10的6次方神经元,因为连接方式由全连接改为局部感知野,所以每个隐层神经元与输入层的连接个数由10的6次方下降为10的平方,总连接个数由10的12次方减少为10的8次方,大大减少了需要被训练的参数量。
卷积核的定义是特征的识别/探测器,而特征出现在原输入数据/图像中的位置并不会对特征本身的识别产生影响,即对输入数据中任意部分的同一个特征都可以采用相同的卷积核识别,所以上文提到的10的6次方个隐层神经元并不需要各自拥有独立参数,完全可以通过同样的参数来识别一个特征,这样需要训练的参数数量又能从10的8次方下降为10的平方,这就是“权值共享”。
在卷积时,可以看作将卷积核覆盖在原图上,从左上角开始,一次向右移动一个像素,卷积完一行,整个卷积核向下移动一个像素,从左边起继续向右移动。在卷积核覆盖的区域范围内,原图与卷积核对应位置的参数分别做乘法,再全部相加,由此得到特征图上某个位置的激活值。计算方式如下:
0 × 0 + 1 × 1 + 3 × 2 + 4 × 3 = 19,
1 × 0 + 2 × 1 + 4 × 2 + 5 × 3 = 25,
3 × 0 + 4 × 1 + 6 × 2 + 7 × 3 = 37,
4 × 0 + 5 × 1 + 7 × 2 + 8 × 3 = 43。
此外还有多通道输入与输出。当输入数据含多个通道时,我们需要构造一个输入通道数与输入数据的通道数相同的卷积核,从而能够与含多通道的输入数据做运算。计算方式如下:
(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3) = 56。
三、池化层
池化的过程简单多,池化过程的输入是卷积后的特征图,在池化时,需要将卷积后的特征图划分为相等的若干个区域,然后取这个区域中激活值的平均值/最大值等,作为池化后新特征图的数量相同,但其大小会相应的减少很多。
同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出。不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做最大池化或平均池化。在二维最大池化中,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素。
上图展示了池化窗口形状为2 × 2的最大池化,阴影部分为第一个输出元素及其计算所使用的输入元素。输出数组的高和宽分别为2,其中的4个元素由取最大值运算max得出:
max(0, 1, 3, 4) = 4,
max(1, 2, 4, 5) = 5,
max(3, 4, 6, 7) = 7,
max(4, 5, 7, 8) = 8。
二维平均池化的工作原理与二维最大池化类似,但将最大运算符替换成平均运算符。