美文网首页程序员从零开始机器学习深度学习
从零开始机器学习-18 CNN:卷积神经网络

从零开始机器学习-18 CNN:卷积神经网络

作者: 养薛定谔的猫 | 来源:发表于2018-06-15 14:32 被阅读152次

    本文由 沈庆阳 所有,转载请与作者取得联系!

    前言

    卷积网络的应用并非始于近期,而早在上世纪90年代的时候就已经有所应用。由于运算性能的提升与数据量的爆炸(GPU与大数据),使得深度学习爆发性地发展,而卷积网络正是深度学习爆发的莫大功臣。
    卷积神经网络(CNN,Convolutional Neural Networks)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网络指的是该网络使用了卷积(Convolution)这种数学运算。卷积是一种特殊的线性运算。卷积网络是指至少在网络中一层使用卷积运算来替代一般的矩阵乘法运算的神经网络。

    内容

    卷积
    网络结构
    卷积层
    池化层

    卷积

    卷积(Convolutional)在泛函分析中定义为两个函数生成第三个函数的一种数学算子。
    卷积在不同的情况下应用不同。


    两个方形脉冲波的卷积
    两个函数的卷积

    卷积的定义

    设函数f与g是R上的可测函数,那么f与g的卷积则记作f*g,它是其中一个函数翻转并平移后与另一个函数的乘积的积分,是一个对平移量的函数,也就是:


    卷积的定义

    如果上述定义没有那么直观的话,我们来通过示意图与描述来理解什么是卷积。


    图解卷积
    1、已知两函数f(t)和g(t)。上图第一行两图分别为f(t)和g(t)。
    2、首先将两个函数都用 τ 来表示,从而得到f( τ )和g( τ)。将函数g( τ )向右移动t个单位,得到函数g( τ -t)的图像。将g( τ -t)翻转至纵轴另一侧,得到g(-( τ -t))即g(t- τ)的图像。右图第二行两图分别为f( τ )和g(t- τ )。

    3、由于 τ 非常数(实际上是时间变量),当时间变量(以下简称“时移”)取不同值时,g(t-τ )能沿着τ轴“滑动”。右图第三四五行可理解为“滑动”。
    4、让 τ 从-∞滑动到+∞。两函数交会时,计算交会范围中两函数乘积的积分值。换句话说,我们是在计算一个滑动的的加权总和(weighted-sum)。也就是使用 g(t-τ )当做加权函数,来对 f(τ )取加权值。
    最后得到的波形(未包含在此图中)就是f和g的卷积。如果f(t)是一个单位脉冲,我们得到的乘积就是g(t)本身,称为冲激响应。

    机器学习中的卷积

    与数学中的卷积定义大同小异,在机器学习中我们通常会使用离散的值而非连续的值进行计算。因此,我们将上述卷积的定义在机器学习中用如下的方法表示:


    离散的卷积定义

    在机器学习的领域中,输入通常是多维数组(如二维的图像),这些多维数组也就是我们常说的张量(Tensor)。核(Kernel)是通过学习算法得到的多维的参数数组。假设卷积神经网络使用二维图像作为输入,那么此时卷积核K应该也是二维的,此时,离散卷积的表达形式如下:


    二维离散卷积定义
    由于卷积运算具有交换性,因此可以将K与I对换,其上述表达等价为:
    卷积运算的交换性

    在许多神经网络中,对于离散卷积采取了另一种互相关(Cross-correlation)的写法:


    互相关二维离散卷积
    离散的卷积可以看做是矩阵的乘法,这个矩阵的一些元素被限制为必须和另一些元素相等。如单变量的离散卷积,矩阵的每行元素都与上一行对应位置平移一个单位的元素相同。这个矩阵叫做Toeplitz矩阵。对于多维(二维)的情况,卷积对应一个双重分块循环矩阵(Doubly Block Circulant Matrix)。除了这些元素相等的限制之外,卷积通常对应着一个稀疏的矩阵。这是由于卷积核的大小通常远远小于输入图像的大小。

    卷积的特征

    卷积可以显著提高深度学习的速度,其具有稀疏连接(Sparse Connectivity)、参数共享(Parameter Sharing)和等变表示(Equivariant Representations)三个方法。
    多层感知机等传统的神经网络利用参数矩阵的乘法相比,每个输入单元和输出单元之间是由独立的参数进行描述的。这也就意味着每个输入单元会和每个输出单元进行交互(传统神经网络是全连接的),也就是稠密连接。
    通常情况下,一张图片的分辨率决定其像素大小。现代社会,高像素相机普及,一张照片动辄百万像素。而卷积网络的核函数尺寸可以小于输入大小,所以连接是稀疏的。比如对于一张高分辨率的图像,可以使用数十个或几百个边缘卷积核来检测小的、有意义的特征。卷积网络在空间上的连接范围被称为感受野(Receptive Field),感受野是卷积神经网络的一个超参数,感受野的大小与卷积核的尺寸一致。由于卷积神经网络的层级结构决定,越高层的卷积层得感受野所对应的原始输入图像的相应区域就越大。

    全连接与稀疏连接

    假设一个神经网络中有m个输入、n个输出。那么对于全连接的矩阵相乘则需要m*n个参数。如果输出的连接数被设定为j个,那么采用稀疏连接则只需要j*n个参数。在许多情景中,在连接数被设定为j,且j比m要小得多的情况下,机器学习应用的速度获得大幅度的提升,并且仍然能保持较好的效果。
    让我们从下图中对比一下全连接与稀疏连接的神经网络。

    全连接的神经网络
    稀疏连接的神经网络
    稀疏连接的方法可以使神经网络的连接结构更加简单,同时以更高效的方法来描述变量之间的关系。对比上述两幅图,从输入的角度(自下而上)来看,x3输入在全连接中与所有的输出单元相连接。而在稀疏连接中x3仅仅与s2、s3、s4相连接。
    自上而下从输出看输入
    反过来从输出来看输入也是如此。
    也许对于卷积网络,其稀疏连接方式的感受野无法设计整个输入,但是当卷积层数增加的时候(深层卷积网络)其单个输出的感受野还是可以涉及到整个输入的。
    多层稀疏连接的感受野
    卷积网络通过采用稀疏连接的方法减少了需要存储的参数(权重)的数量,减少了机器学习模型所需要的存储空间,从而提升了模型的统计效率。从计算方面来看,较少的参数数量意味着计算输出时需要更少的参数,从而计算效率也得到大幅提升。

    参数共享

    参数共享是紧接着稀疏连接而来的。在模型中多个函数使用相同的参数则是参数共享。这个共享的参数通常是权重,即共享权重(Shared Weight)。在传统的神经网络中,每个权重被使用一次。而使用共享权重,一个输入位置的参数值也会被应用在其他的输入位置。在卷积网络中,通过参数共享,一个卷积核内的参数会被应用在输入的所有位置。


    参数共享示意图

    上图中黑色的箭头表示了在两个不同的模型中使用了特殊参数的连接。上图中,黑色箭头表示在卷积模型中对3个元素核的中间元素的使用。由于参数共享,因此这个单独的参数被用于所有的输入的位置。而在下图中,这个单独的黑色的箭头表示在全连接模型中对权重矩阵的中间元素的使用,下面这个模型没有参数共享,所以参数只使用了一次。

    等变表示

    对于卷积来说,参数共享的特殊形式使得神经网络层具有了对平移等变(Equivariance)的性质。一个函数满足输入改变,那么输出也以同样的方式改变这一个性质,那么这个函数就是等变的。即输入发生变化输出也相应发生同样的变化。
    如果f(g(x))=g(f(x)),那么函数f(x)对于变换g具有等变性。在卷积网络中,令g是输入的任意平移函数,那么卷积函数对于g具有等变性。举例,令I表示图像在整数坐标上的亮度函数,g表示图像函数的变换函数,即把一个图像映射到另一个图像函数的函数。令I'=g(I),图像函数I'满足I'(x,y)=I(x-1,y)。上述函数所做的变换就是将I中的每一个像素均向右移动一个单位。如果先对图像I施加变换,再进行卷积操作f,结果等同于对图像I的卷积施加变换。也就是说,如果图像中的目标发生了一定的位移之后,卷积输出的表达也会产生相同的位移。这个特征对于作用在一个相对小区域的算子十分有用。

    卷积网络的基本数据类型

    卷积网络的数据通常包含多个通道,每个通道是时间或是空间上的某个点的不同观测量。

    维度 单通道 多通道
    一维 音频波形:卷积的轴对应时间。将时间离散化并且在每个时间点测量一次波形的振幅 骨骼动画(Skeleton Animation)数据:三维角色动画通过随时间变化调整骨骼的姿势生成的动画。在每个时间点,角色的姿态通过骨骼中的每个关节的角度来描述。输入到卷积模型的数据的每个通道,表示一个关节关于一个轴的角度
    二维 使用傅里叶变换处理过的音频数据:将音频波形转换成二维张量,不同的行对应不同的频率,不同的列对应不同的时间点。在时间轴上使用卷积使得该模型等效于在时间上移动。在频率轴上使用卷积模型使得模型等效于在频率上移动。这使得不同八度音阶中播放的相同旋律产生相同的表示,但处于网络输出中的不同高度 彩色图像数据:其中通道分别包含红色、绿色和蓝色(RGB)。在图像的水平轴和竖直轴上移动卷积核,赋予两个方向上平移等变性
    三维 体积数据(Volume Data):利于医学成像技术的MRI扫描、PET扫描等获得的医学图像 彩色视频数据:其中一个轴对一个时间,另外一个轴对应视频帧的高度,最后一个轴对应视频帧的宽度

    卷积网络的一个优点就是可以处理具有可变的控件尺度的输入。这些类型的输入不能用传统的基于矩阵乘法的神经网络来表示。使用卷积处理可变尺寸的输入,仅对输入是因为包含对同种事物的不同的观察而导致的尺寸变化才具有意义。也就是说,如果输入是因为其自身可以选择性地包括不同种类的观察而具有可变尺寸,那么此时使用卷积则是不合理的。

    卷积网络的经典结构

    卷积网络的层结构

    简单的卷积神经网络由一系列不同的层构成,每个层将上一层的一组隐藏层的输出通过一个可微的函数产生一组新的隐藏层的输出。
    一个典型的卷积网络有几种不同的层构成:
    1、卷积层(Convolutional Layer,CONV)
    2、ReLU(Rectified Linear Unit) ReLU(x)=max(0,x)
    3、池化层(Pooling Layer,POOL)
    4、全连接层(Fully-Connected Layer,FC) 全连接层与普通的神经网络相同。
    这些层极其具体的作用如下表所示:

    名称 作用
    INPUT 输入层:如,以图像的像素的值作为输入
    CONV 卷积层:卷积层连接输入的一小块区域,并计算卷积核与之对应的输入区域之间的点乘作为卷积层的输出
    ReLU 激活函数:将CONV层中输出的每个元素通过一个非线性激活函数
    POOL 池化层:在空间上(Height和Width)执行降采样操作
    FC 全连接层:在分类中,将计算每个类别对应的分数,和传统神经网络一样,全连接层的每个神经元与前一层的所有输出相连

    上述从INPUT到FC是一个典型的卷积网络的层结构。
    CIFAR-10数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。使用卷积网络来训练一个图像分类的模型不失为学习卷积网络的一个很好的实践。


    CIFAR-10数据集示例

    让我们以CIFAR-10数据集作为输入来讲解一下卷积网络的各个层的功能:

    名称 作用
    INPUT 输入层:输入一张大小为32*32*3的3通道RGB图像
    CONV 卷积层:如CONV层有12个卷积核,则通过CONV层输出的尺寸为32*32*12
    ReLU 激活函数:保持图像的尺寸为32*32*12
    POOL 池化层:以2*2的小窗做降采样操作,特征图的尺寸缩小到16*16*12
    FC 全连接层:在分类中,输出的尺寸为1*1*10,也就是CIFAR-10中10个类别分别对应的分数

    各种卷积网络的结构模式(Architecture Pattern)

    其实,目前很多的卷积网络都是根据一种层级结构的模式进行不同的堆叠。最常见的网络的结构是将 CONV-ReLU堆叠若干遍之后,紧接着一个POOL池化层。然后再重复上述的结构,直到图像在空间上转换成为一个较小的尺寸。最后使用一个全连接层转换为输出。
    让我们以一个正则表达式来表示上述的模式:
    INPUT->[[CONV->RELU]*N->POOL?]*M->[FC->RELU]*K->FC
    其中,*N代表重复N次,?代表0或1次,一般来说0<N≤3,M≥0,0<K≤3。


    VGGNet (2014)

    卷积层的实现

    卷积层的参数有一组可以学习的卷积核(Kernel)/滤波器(Filter)构成。每个卷积核在空间上是尺寸较小,穿过输入集的整个深度,如下图所示:


    一个卷积网络的示意图

    卷积网络的第一层的卷积核尺寸通常为3*3*3(宽3个像素 高3个像素 深度为通道数是3的RGB图像)或5*5*3。在前向传播的过程中,在输入图像上沿着高和宽的方向滑动各个卷积核/滤波器(滤波器是通过向量来表示对输入进行卷积操作的权重),并在所有的位置上面计算卷积核与输入的点乘。当完成沿着宽和高滑动卷积核之后,会得到一个二维的激活映射(Activation Map),这个激活映射也被称为特征映射(Feature Map)或是特征图。特征图的含义是其在每个空间位置上输入对于卷积核的响应。


    滑动卷积核/滤波器得到特征映射
    卷积操作生成特征映射
    卷积层上的每个卷积核都会生成一个激活特征映射,将这些特征映射沿着深度的方向排列起来并作为卷积层的输出。

    比如一个5*5*3的滤波器在32*32*3的图像上沿着宽和高滑动,遍历空间内所有的点之后生成的特征图为28*28*1。如果使用3个这样的滤波器/卷积核进行操作之后,将会生成3个28*28*1的特征映射。所以卷积层最终的输出大小为28*28*3。


    通过3个滤波器得到的3层特征映射堆叠
    在卷积网络中堆叠CONV-RELU这样的结构,卷积核/滤波器的深度要与输入的特征图的深度一致。也就是说,后一个卷积层的卷积核/滤波器大小需要与前一个卷积层输出的维度一致。
    可视化卷积网络

    通过观察上述卷积网络的特征图的输出,我们可以发现,随着网络的层数的不断加深,特征图上的响应在表达语义的层面上不断加深。最初的层提取了低层特征(Low-Level Feature),而此后的卷积层在低层特征的基础上产生了具有语义的图形和纹理。最后的卷积层对明确语义的目标产生强烈的响应,也就是说其抽取了图像的高层特征。

    卷积层的空间排布

    在卷积网络中,输出的特征图的尺寸由深度(Depth)、步长(Stride)和零值填充(Zero-Padding)三个超参数决定。
    对于输出图的深度这个超参数,其由使用的卷积核/滤波器的数量决定,每个卷积核都负责从输入图像中提取出不同的信息(见下图)。


    不同的卷积操作对应的卷积核以及卷积输出

    在卷积网络中对于同一个输入,为了提取不同的特征,需要使用不同的卷积核操作,并且将响应的特征映射堆叠排列起来作为输出。
    然后就是滑动卷积核的步长。当滑动卷积核的步长为1的时候,卷积核/滤波器每次移动1个像素的位置。当步长为2的时候,卷积核每次移动2个像素的位置...步长越大,生成的特征映射的空间尺寸就越小。
    最后是零值填充。有的时候,为了使用更深的卷积网络,此时则不希望特征映射在卷积的过程中尺寸下降地太快,因此会在输入的边缘使用零值填充来增大输入尺寸。
    假设当前卷积层的输入图像尺寸为W、卷积神经元的感受野为F、步长S、边缘零值填充数量为P,则输出特征映射的尺寸为:


    经过卷积层的特征图尺寸

    池化层(Pooling Layer)

    为了减少表达空间的尺寸,卷积网络的连续的卷积层之间往往会周期性地插入池化层。池化层能逐渐减少表达空间的尺寸,降低参数数量和计算开销,并控制卷积网络减少过拟合。


    最大池化图解

    在卷积网络中,最常见的池化操作是最大池化(Max Pooling),也就是取视野范围内的最大值。对上图最大池化示意图而言,其输入特征图的尺寸是4*4,步长为2的池化操作后,得到2*2的输出特征图。在池化窗口大小是2的是,上图中被分为四种颜色的四个区域,每个区域对应输出特征图的一个像素,对每个窗口取其中的最大值作为输出特征图相应位置的值。
    池化窗口的选取通常是2或3,如果窗口大小过大则会对特征图的信息造成破坏。除了最大池化之外,还有平均池化(Average Pooling)和L2-Norm池化。


    特征图池化操作输出的效果
    最大池化操作的反向传播形式很简单:将梯度沿着正向传播的过程中最大值的路径向下传递。池化层的正向传递通常会保留最大激活单元下标,作为反向传递时候的传播路径。

    参考文献:
    Convolutional Neural Networks (LeNet) - DeepLearning 0.1 documentation. DeepLearning 0.1. LISA Lab. [31 August 2013].
    Convolutional Neural Network. [2014-09-16].
    Kim, Yoon. Convolutional Neural Networks for Sentence Classification. 2014-08-25. arXiv:1408.5882 [cs.CL].
    [Deep Learning] - Convolutional Neural Network .Ian Goodfellow
    [Convolutional Networks for everyone] Rohan Thomas https://medium.com/@rohanthomas.me/convolutional-networks-for-everyone-1d0699de1a9d
    [Visualizing and Understanding Convolutional Networks] Matthew D. Zeiler and Rob Fergus https://cs.nyu.edu/~fergus/papers/zeilerECCV2014.pdf

    觉得写的不错的朋友可以点一个 喜欢♥ ~
    谢谢你的支持!

    相关文章

      网友评论

      本文标题:从零开始机器学习-18 CNN:卷积神经网络

      本文链接:https://www.haomeiwen.com/subject/gxccsftx.html