深度学习-卷积神经网络-算法比较
Convolutional Neural Networks(CNN)
Abstract
随着深度学习的发展,学术界造就了一个又一个优秀的神经网络,目前,最受欢迎的神经网络之一则是卷积神经网络,尽管有时它出现让我们无法理解的黑盒子现象,但它依然是值得我们去探索的,CNN的设计也遵循了活生物体的视觉处理过程。
首先分析一下人脑的神经元(人脑视觉系统)。
人脑神经元信息处理过程包括接受输入,处理,输出这么三个阶段。对应到一个神经元上就是树突,胞体,轴突。
神经网络仿照人脑的神经元结构之间的联系,当某个神经元的轴突电信号强度达到一定程度时,就会触发将信号传递到下一个神经元。在传递的过程中加上一些对数据处理的操作,从而达到处理传递信息的目的。其中的信号正是将数据抽象过后的数值或者多维矩阵。
卷积神经网络,在CNN出现之前,对于人工智面临着两大难题:
- 图像需要处理的数据量太大,导致成本很高,效率很低
- 图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高
需要处理的数据量太大。由于图像是由像素构成的,每个像素又是由多种颜色构成的。
几乎任何一张图片都是 1000×1000 像素以上的, 每个像素都有RGB 3个参数来表示颜色信息。这样就需要处1000×1000×3个参数,因此训练任务太过复杂, CNN 解决的第一个问题就是「将复杂问题简化」,通过卷积/池化的方式把大量参数降维成少量参数,再做处理。更重要的是:我们在大部分场景下,降维并不会影响结果。比如10000像素的图片缩小成2000像素,并不影响肉眼认出来图片中是一只猫还是一只狗,机器也是如此。
保留图像特征。图片数字化的传统方式我们简化一下,就类似下图的过程:
假如有圆形是1,没有圆形是0,那么圆形的位置不同就会产生完全不同的数据表达。但是从视觉的角度来看,图像的内容(本质)并没有发生变化,只是位置发生了变化。所以当我们移动图像中的物体,用传统的方式的得出来的参数会差异很大!这是不符合图像处理的要求的。而 CNN 解决了这个问题,它用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。
Introduction
卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,同时结合了多层感知器,多层感知器通常是指完全连接的网络,也就是说,一层中的每个神经元都与下一层中的所有神经元相连。这些网络的“完全连接”使它们易于过度拟合数据。正则化的典型方法包括向损失函数添加某种形式的权重度量。CNN采用不同的正规化方法:它们利用数据中的分层模式,并使用更小和更简单的模式组合更复杂的模式。与其他图像分类算法相比,CNN使用的预处理相对较少。这意味着网络将学习传统算法中手工设计的过滤器。与特征设计中的先验知识和人工无关的这种独立性是主要优势。
典型的CNN训练主要由三层结构组成
- 卷积层
- 池化层
- 全连接层
Convolution(卷积层)
对CNN模型进行实现时,输入的数据为形状(图像数量)x(图像高度)x(图像宽度)x(图像深度)。然后,在经过卷积层后,图像将被抽象为特征图,其形状(图像数量)x(特征图高度)x(特征图宽度)x(特征图通道)。神经网络中的卷积层应具有以下属性:
- 由宽度和高度(超参数)定义的卷积核。
- 输入通道和输出通道的数量(超参数)。
- 卷积过滤器(输入通道)的深度必须等于输入要素图的通道数(深度)。
Pooling(池化)
池化层通过将一层神经元簇的输出组合到下一层中的单个神经元中来减少数据的大小。池化层包括局部或全局池化层,局部池合并了通常为2 x 2的小簇。全局池作用于卷积层的所有神经元。池化方式又有两种:最大池化和平均池化
-
最大池化
取上一层中每个神经元簇的最大值来作为下一层神经元簇的特征
-
平均池化
取上一层中每个神经元簇的平均值来作为下一层神经元簇的特征
下图以最大池化为例
Fully Connected(全连接层)
全连接层,上一层的每个神经元都会连接到下一层每个神经元,因此该层的处理又与全连接神经网络类似。
Development Overview
从1959年,Hubel & Wiesel发现动物视觉皮层中的细胞负责检测感受野(receptive fields)中的光线。论文:Receptive fields and functional architecture of monkey striate cortex(1968)
1980年,Kunihiko Fukushima提出新认知机(neocognitron),被认为是CNN的前身。论文:A self-organizing neural network model for a mechanism of visual pattern recognition(1982)
1990年,LeCun建立了CNN的现代框架。论文:Handwritten digit recognition with a back-propagation network(1989NIPS)
1998年,LeCun改进CNN,他们开发了一个名为LeNet-5的多层人工神经网络,可以对手写数字进行分类。与其他神经网络一样,LeNet-5具有多个层,可以通过反向传播算法进行训练。它可以获得原始图像的有效表示,这使得从原始像素直接识别视觉模式成为可能,而且很少进行预处理。论文:Gradient-based learning applied to document recognition(1998)
1990年,Zhang使用一个平移不变性的人工神经网络(SIANN),识别图像的字符。但由于当时缺乏大量的训练数据和计算能力,他们的网络在更复杂的问题,例如大规模的图像和视频分类方面不能很好地运行。论文:Parallel distributed processing model with local space-invariant interconnections and its optical architecture(1990)
2015年,Krizhevsky提出一个经典的CNN架构,即AlexNet。它显示了在图像分类任务上根据以前方法的重大改进,在整体结构上与LeNet-5类似,但深度更深。论文:Imagenet large scale visual recognition challenge(2015IJCV)
CNN每一阶段的发展,都对训练的复杂度进行了降低,辨识能力提高。
Comparison
LeNet-5的出现可以说标志着现代CNN模型发展的开端,以至于有了后来的AlexNet。相比于LeNet-5,AlexNet有更深的结构,用多层小的卷积来替代大卷积。
Common
LeNet-5虽然出现较早,但其结构并不缺少,包括卷积层-池化层-全连接层三层结构,AlexNet与其总体结构也是十分相似的。
Difference
首先,AlexNet最明显的特征是用多层小的卷积核来代替原来较大的卷积核,这使得AlexNet有更高的准确率。
LeNet-5最初主要用于图像识别,若按照处理过程来分析LeNet-5,其共有八层:
-
Input层-输入层
输入图像的尺寸统一归一化为32*32
-
C1层-卷积层
对输入图像进行第一次卷积运算(使用 6 个大小为 5×5 的卷积核),得到6个C1特征图(6个大小为28*28的 feature maps, 32-5+1=28)
-
S2层-池化层(下采样层)
第一次卷积之后紧接着就是池化运算,使用 2*2核 进行池化,于是得到了S2(6@14×14)
-
C3层-卷积层
利用前六个C3特征,从三个连续子集中获取输入S2中的功能图。接下来的六个从第四个的不连续子集开始。最后一个从所有S2特征映射中获取输入。因此C3层有1516个可训练参数和151600个连接,下图引自LeNet-5 paper。
-
S4层-池化层(下采样层)
S4是pooling层,窗口大小仍然是2*2,共计16个feature map,C3层的16个10×10的图分别进行以2×2为单位的池化得到16个5×5的特征图
-
C5层-卷积层
C5层是一个卷积层。由于S4层的16个图的大小为5×5,与卷积核的大小相同,所以卷积后形成的图的大小为1×1。
-
F6层-全连接层
全连接到下一层
-
Output层-全连接层
全连接输出层,输出结果
下图引自LeNet-5 paper
可总结出LeNet-5卷积层的参数较少,这也是由卷积层的特性即局部连接与共享权值所决定
AlexNet是在LeNet-5的基础上加深了网络的结构,学习更丰富更高维的图像特征
-
使用层叠的卷积层-(卷积层+卷积层+池化层来提取图像的特征)
-
使用Dropout抑制过拟合
以0.5的概率,将每个隐层神经元的输出设置为零。
-
使用数据增强Data Augmentation抑制过拟合
通过训练数据进行自我变换的方式进行扩充数据规模,以提高算法的识别准确率
- 水平翻转图像
- 给图像增加随机的色彩
-
使用Relu激活函数替换之前的sigmoid的作为激活函数
Sigmoid 是常用的非线性的激活函数,用0-1区间的值来压缩特征,假若有个比较大的特征值9999,我们也需要把它压缩到0-1,这就使得压缩过强
Relu是分段线性函数,所有的负值和0为0,所有的正值不变,这种操作被称为单侧抑制
- 发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多。
-
多GPU训练
Conclusion
AlexNet 优势在于:网络增大(5个卷积层+3个全连接层+1个softmax层),同时解决过拟合,并且利用多GPU加速计算。