首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深度学习第4期:卷积神经网络

目录

01.卷积

02.离散卷积

03.卷积神经网络的结构

04.卷积神经网络的训练

05.总结

卷积

神经网络有许多种变体。今天来给大家介绍一下神经网络中很常见的一类,那就是卷积神经网络,即Convolutional Neural Network,简称为CNN。目前在图像处理领域,卷积神经网络可以很好地解决各种问题。本文在介绍卷积神经网络结构的同时,还会去解释为什么它对于图像数据具有如此强大的威力。

既然是讲卷积神经网络,那有必要首先介绍一下什么是卷积。第一步先从数学上大致介绍一下卷积的概念,使得读者对于其意义有一定抽象的了解。

给定两个函数与,它们的卷积也是一个关于的函数,其定义公式如下:

从公式上看,卷积就仿佛是把两个函数与给“卷在一起”,成为了一个新的函数。那么由与“卷出来”的函数的形状就应该同时具有和这两个函数形状的轮廓,性质也由与的性质综合构成。

从例子中看,是一个方形的函数,是一个三角形的函数。将它们卷积在一起得到的同时具有了与的特点,向左偏后又被向右“拧正”了一下。

而在概率论中,如果有两个连续型随机变量与,它们的密度函数分别是与,那么随机变量的密度函数就恰好是。换句话说,两个随机变量和的密度函数等于它们密度函数的卷积。这一点也可以帮助我们更好地理解卷积是如何把两个函数“卷在一起”,使得它们的性质彼此交融的。两个函数卷积求出的结果显然同时包含这两个函数携带的信息。

要注意的是,卷积是具有线性性的。这也就是说,对于

我们有

卷积与滤波

从定义上看来,卷积是一种用两个函数得到第三个函数的二元运算。有关卷积的数学性质有许多,这里不一一详细列举。卷积最重要,也是应用最广泛的性质在于傅里叶分析。我们知道,一段时域上的信号进行傅里叶变换之后可以得到这段信号在频域上的频谱,卷积的重要性质是两个信号在频域上的卷积等价于时域上的乘积,而同理它们在时域上的卷积也等价于频域上的乘积。即

在生活中,我们无时无刻不在进行信息的收发,而这个过程都需要滤波。例如,对于一段时域上的信号,它的频谱是。我们希望挑出指定频率范围内的信号,这就相当于要在频域上为它加一个窗口,即求出,再对其进行傅里叶变换,求出它在时域上的模样。

卷积的数学性质为我们提供了另一套解决方案。如下图所示,我们把频域上方块形状的进行一个傅里叶变换,得到它在时域的样子,这是一个波浪的形状。然后,我们直接在时域上求出信号与的卷积,就相当于直接把信号中在指定频率范围的部分给“挑了出来”。

如果对这部分知识有兴趣的同学可以去查阅数字信号处理有关的书籍,里面有对傅里叶变换、滤波、卷积等方面更加详细的讲解。

卷积的这条性质还有一个很常用的地方,那就是概率论中特征函数的性质。我们知道,随机变量的特征函数就是的密度函数的傅里叶变换。设两个随机变量的密度函数分别为。我们说过,随机变量的密度函数为,所以它的特征函数为。而由卷积的性质我们又有

也就是说,的特征函数就等于与的特征函数的乘积。这几乎可以说是特征函数最重要的性质之一。

上面所提到了两种卷积的应用,滤波与特征函数。这背后似乎意味着运用卷积的两种思想:

在概率论中,我们有两个有意义的与,它们地位相等,且各自包含着重要的信息。而我们用卷积求出的同时包含了二者信息,是二者信息的一个综合;

在滤波中,我们则采用了另外一种思想。我们本来只有一个有意义的信号。是被我们精心设计出来的一个滤波器。我们求与的卷积,事实上是为了挑出中一些指定的特征。我们如何设计将决定可以通过卷积“挑”出中哪些信息。

在卷积的应用中,第一种比较少见,而第二种应用则比较常见。总之,卷积是函数与函数的运算,它会将两个函数本身携带的信息“卷”到一个函数中呈现出来。但是在实际应用中,一般“被卷”的两个函数都是具有不同地位的。

离散卷积

一维离散卷积

在计算机中,没有任何东西是连续的。因此,可以把卷积公式中的积分替换为求和,得到离散卷积的公式:

为了加深大家的理解再举一个具体的例子。如果我们有离散的信号(2,0,1,7,6,9)以及(3,2,1),使用如下的算法来求解它们卷积的结果。从形式上看,就像是一个离散信号在另一个离散信号上滑过,对应位置相乘再相加,得到的结果:

按照卷积的数学定义,卷积双方的信号应该都是无穷序列。实际上,我们用来卷积的两串信号应该是(…,0,0,0,2,0,1,7,6,9,0,0,0,…)与(…,0,0,0,3,2,1,0,0,0,…)。为了方便我们可以只写其支集(即不为0的部分)上的内容,即忽略等于0的部分。

通过运算求出两个离散信号的离散卷积为(2,4,7,9,23,42,36,27)。它也只是卷积结果的支集上的内容。我们可以想象,下式中出现的每一条信号的两段其实都有无穷个0,只是被简写为:

以上是用严格数学定义得到的卷积。但是在一般使用卷积神经网络的时候,并不会把信号当成无穷序列上的支集,而是认为这就是全部的信号。从这个角度来看,(2,0,1,7,6,9)与(3,2,1)的卷积可以用如下公式求出:

我们有:

第一种算法会使得卷积后得到的信号变长,而第二种算法会使得卷积后得到的信号变短。因为卷积神经网络是一个逐渐以更高抽象程度去提取图片中特征的过程,所以一般采用的是第二种算法。但是它也会采用第一种方法做为补充,这一点我们会在后面讲到。

离散卷积的意义

我们知道,使用卷积运算的时候,运算的双方是具有不同的地位的。一般一方是“有意义的信息”,而另一方是用来“提取信息中我们所感兴趣的部分”所使用的,称为“卷积核”。

在离散的角度下,信号与卷积核都是向量。一般而言,信号是维数很高的向量,而卷积核是维数很低的向量。由于具有线性性,卷积完全可以视为是对一个信号向量进行线性变换,得到另外一个向量的过程。不过,这个线性变换矩阵的形式是有些特殊的:

我们说过,卷积可以用来对信号进行滤波。而信号,无论是在时域上还是在频域上,都可以说是按照一定的顺序组织起来的。所以说,离散信号虽然从表面上看是一个普通的高维向量,但是与一般的向量相比,它各个维度之间具有顺序的关系。如果将各个维度间的顺序打乱,就会损失关于这个信号的主要信息。

简单来说,离散的卷积可以视为是针对“具有顺序的”向量进行的一种特殊的线性变换。它之所以能够提取信号中我们需要的信息,实现滤波等效果,正是因为它充分利用了离散信号具有顺序性的特点。

多维离散卷积

在介绍卷积的时候我们没有介绍多维卷积,但实际上多维卷积与一维卷积是一样的。两个元函数求一个含参变量的积分,求出的元函数即是它们卷积的结果。

二维的卷积与一维的卷积事实上没有本质区别。两个二维离散信号的卷积也可以视为是一个在另外一个上面滑过,对应位置相乘再相加求出的结果。如果读者能够验证下面的二维卷积等式,就说明读者已经理解了二维卷积是如何运算的。

多维的卷积与二维的卷积是一个道理。一个维的信号与一个维卷积核卷积,就相当于这个卷积核在这个信号上不断滑动,对应位置相乘相加得到的结果。这个结果当然也是一个维的信号。

与一维向量相同,多维的卷积也可以视作是一个线性变换。而且这种线性变换也在一定程度上利用了多维输入信号的顺序性与结构性,使得我们能够从中提取出信号中有效信息。这无疑十分适合用来处理图像数据,因为图像各个像素之间显然是具有结构性与顺序性的。打断一幅图像各个像素的位置,无疑就损失了图像中主要的信息。

卷积神经网络的结构

前面关于人工神经网络的介绍中提到,训练完成后的神经网络相当于是一个多维的非线性函数。它有许多隐藏层,每一个隐藏层都是输入的向量进行仿射变换与非线性激活函数作用的复合。我们输入的高维向量经过多个隐藏层后,输出最后的结果。由于在运算的过程中进行了多次与非线性激活函数的复合,所以总的来说,它是一个高度非线性的函数。

卷积神经网络是专门用来处理图像数据的一种神经网络,所以我们先要弄清楚图像数据是什么样的。一般而言,我们使用的彩色图像有RGB三个通道。即每一处的颜色有红、绿、蓝三个指标混合而成。当图像大小是128×128的时候,这幅图像实际上就是一个128×128×3的张量。

卷积神经网络可以用来做许多图像处理的工作,例如判断图像里的动物是猫还是狗;标记出图像中物品的位置;用一句话来描述图像等等。我们的目的是建立一个卷积神经网络,即建立一个非线性的函数,使得输入是一个128×128×3的张量,输出是我们所需要的具有某些含义的标量或者向量。

为了方便,我们假定图像都是一维的。读者可以自己想象将其转化为二维、三维乃至多维的样子。

卷积层

输入的信号与一个卷积核进行卷积运算,就相当于对输入信号进行了一个线性变换:

与普通的神经网络一样,卷积神经网络也具有很多隐藏的中间层,每一个隐藏的中间层也要对输入的进行仿射变换,变成。只不过,这里的变换矩阵具有以上的特殊的形式。在一般的神经网络中,这个4×6的线性变换矩阵有24个有待训练的参数。而在卷积中,这个4×6的线性变换矩阵实际上只有3个有待训练的参数。

神经网络的输入是一幅128×128×3的图像,即一个三维的张量。我们希望其中间过程中每一步都是一个三维的张量,有两种方法可以帮助我们达到目的:

如果用一个厚度与图像一样为3的卷积核,比如3×3×3的卷积核与其进行卷积,则得到一个126×126×1的输出,这就相当于是一个二维的张量了。而如果我们用10个3×3×3的卷积核分别与其进行卷积,则可以得到一个126×126×10的输出,这仍旧是一个三维的张量;

如果用一个厚度比图片小的,比如3×3×2的卷积核与其进行卷积,则得到一个126×126×2的输出。但是如果我们同时使用多个卷积核,则这个输出就变成是四维的张量了。

一般而言,我们会采取前者。即输入是三维的情况下,我们会用多个卷积核,其中每一个卷积核的厚度和输入是一样的,这样就保证中间每一层的输入也是一个三维张量。

与普通的神经网络类似,我们每一层仍然需要对输入进行仿射变换得到。如果输入是三维的,则中间每一个隐藏层都是三维的。在卷积神经网络中,这个具有特殊的形式,它有很多个位置的参数被规定为0,也有很多个位置的参数被规定为同一个参数。这使得每一层中我们需要训练的参数远比一般的神经网络要少。

Stride和Zero Padding

卷积操作还会涉及到两个参数,Stride与Zero padding。Stride的含义是滑动。在卷积的过程中,每一次将卷积核往旁边滑一步,再求对应位置的相乘相加,这就意味着stride=1。如果将stride设为3,就相当于每次将卷积核往旁边滑动三步,以下是stride=3情况下的卷积:

写成线性变换的形式就是:

Zero padding的含义是要为输入的两端添加零。按照数学的定义,卷积应该定义在全空间上的。我们有限长度的信号应该只是这个信号的支集,即可以想象在有限长的信号周围其实是有无数个0。Zero padding在一定程度上借用了这种思想,它允许在信号两边补充一定数量的0,然后进行卷积。

在实际操作中,取zero padding=2,相当于将卷积核滑出信号范围两步。以下是stride=2,zero padding=2时候的卷积:

将其写成线性变换的形式是这样的:

在卷积中,我们可以设定两个参数Stride与Zero padding,前者表示每一次卷积核在信号上滑动的步数,后者代表允许卷积核“滑出”信号的范围。从宏观的角度来看,每一个卷积层仍然是对输入进行一个仿射变换得到,变换矩阵中依然有很多位置的参数被规定为0,很多位置的参数被规定为一样的。而Stride与Zero padding这两个变量则相当于是对的形式进行了更加具体的规定。在卷积核相同的情况下,调节Stride与Zero padding这两个参数可以使得其对应的变换矩阵是不同的。

激活函数与池化

卷积神经网络的每一个隐藏层都相当于对输入进行了一个仿射变换。 仿射变换之间无论再怎么进行复合,得到的都仍然是仿射变换,无法形成非线性的函数。因此,在每一个隐藏层都需要对输入仿射变换后复合一个非线性激活函数。哪怕这个非线性的激活函数很简单,经过多层的复合后,也可以形成高度非线性的形式。

最常见的非线性激活函数是ReLU,即。虽然这个非线性函数极其简单,但是将其多层复合起来就可以形成高度非线性化的部分。

在卷积神经网络中,还有一种特殊的非线性函数叫做Pooling,即池化。它的含义是

这也可以看做是一种非线性函数。我们想象在三维空间的形状,它就像是一个被弯折了一下的平面,所以它也是一个非线性函数。同理,池化函数也是高维空间中的非线性函数。

除了为函数添加非线性的部分之外,池化函数还有一个重要的作用,那就是降维。从形式上看,它就像是将输入分为了很多块,每一块只取出最突出、最有意义的部分。这样可以在最大程度保留有价值信息的前提下对输入进行降维。

全连接层

图像经过许多个卷积层、ReLU激活函数,以及池化层的复合,相当于进行了高度的非线性的变换,成为了形状、大小很不一样的输出。例如,一个128×128×3的输入经过多层的变换最后变成了一个1×1×128的向量。一般而言,在最后我们要将其通过一个全连接层再输出。神经网络的本质是万能的函数拟合器,其重点在于拟合能力要足够强。增加全连接层可以充分保证网络能够拟合各种各样复杂的函数。也就是说,最后一层对输入进行仿射变换得到,线性变换矩阵的每一个位置都是不同的参数,与普通的神经网络一致。

对于输入的图像,卷积神经网络使用许多卷积核进行卷积。根据介绍的有关卷积的意义,我们可以将每一个训练好的卷积核都视为“精心设计”的,即它们可以提取输入的某些信息,或者可以对输入进行某种改变。

在中间的每一个隐藏层都使用许多卷积核提取前一层输入的有效信息。然后,对这些信息进行非线性化处理,例如取ReLU,或者池化操作等,能够进一步提取我们所需要的信息,也同时为预测函数引入了非线性性。

卷积神经网络的训练

在人工神经网络的训练中,我们把每一个神经网络的参数当成变量,将训练集的当成参数,损失函数是一个变量与参数构成的函数。训练的目标是要寻找使得损失函数达到最小。

我们可以利用链式法则来计算损失函数对于各个参数的偏导数,即用BP算法求出损失函数对于各个参数的偏导数。根据这些偏导数,使用梯度型算法进行梯度下降从而使得损失函数减小。但是在卷积神经网络中,线性变换的矩阵中有许多位置的取值被规定为同一个变量,不能再简单使用BP算法求出偏导数来解决问题。

全导数

给定自变量,有两个变量是关于的函数,而有一个是关于的函数。则关于的全导数定义为

对于多元的函数也是同一个道理,我们需要求出关于各个自变量的偏导数,再求出各个自变量对于的全导数,将其相乘相加,即可以得到对于的全导数。其含义是——是一个与具有复杂关系,受到影响的量,而全导数衡量的则是的变化总的来说究竟对于有多大的影响。

在卷积神经网络中,由于线性变换矩阵中很多个位置的参数被规定为相等的,可以将其视为是同一个变量,也就意味着同一个变量在损失函数中多次出现。因此,需要求出损失函数对于这些变量的全导数。在实际操作中,使用BP算法求出损失函数对于许多中间量的偏导数,再将这些偏导数相加求出损失函数对于同一个变量的全导数。事实上,卷积运算中,对于卷积核的全导数也可以写成一个卷积的形式。有兴趣的读者不妨可以自己试一试,这里就不做详细推导。

有了损失函数对于各个参数的全导数之后,我们就可以将其视为梯度,采取各种梯度型算法,诸如SGD、momentum、AdaGrad、Adam等等进行优化,以求出最优的参数。

共享权值的意义

共享权值的方法使得在同样的网络规格下,让真正需要训练的参数大大地减小,即模型复杂度降低,可以避免过拟合的问题。但是我们不禁有一个疑问,减小神经网络的规格与共享权值同时能够达到避免过拟合的目的,为什么我们不是选择训练一个规格更小的神经网络,而是选择训练一个规格更大但是复杂度相同的卷积神经网络呢?也就是说,训练一个有100个参数的神经网络,或是训练一个一共100个变量,每个参数被共用10次,一共1000个参数的神经网络。在两者的复杂度相同的情况下,为什么后者会比前者表现得更好呢?

这里实际上涉及到一个图像数据本身性质的问题。

当使用一般的神经网络进行回归的时候,变量是没有顺序可言的。例如,当输入的向量中的每一维度取值分别代表一个人的身高、体重、腰围的时候,其实这些数据之间是没有顺序可言的。如果我们将自变量按照同样的方式打乱顺序,比如将每一个样本的(身高,体重,腰围)都改成(体重,腰围,身高),这在逻辑上并没有什么错误,也并不会影响我们建立神经网络。所以在普通的回归预测问题中,输入完全可以当成是向量。

而在图像中,每一个像素的数据是有顺序结构的。将像素的排布方式任意打乱,图像本身的含义就会发生变化,这会损失图像中隐含的绝大多数信息。

图像中同时含有“有意义的信息”与随机的噪声。“有意义的信息”是按照图像的顺序结构组织起来的,而随机的噪声则与图像结构没有关系。当使用同样有100个不同参数的普通神经网络与卷积神经网络时,它们拟合噪声的风险大概是一样的,所以引起“过拟合”的风险也大致相同。而对于拟合信息来说,由于卷积利用了图片像素中顺序结构,它具有更强的拟合信息的能力。

总结

在数学上,卷积是一种对两个函数进行运算,得到第三个函数的过程。一般而言,进行运算的两个函数是地位不同的。一个函数代表某种信号,而另一个函数是精心设计的。我们可以通过与的卷积来提取中某些我们需要的信息(例如挑出指定频道的信号),或者对进行某些改变等。

函数是因变量与自变量的关系。在离散的情况下,函数被离散化一个向量,各个维度的取值代表着自变量等间距采样得到因变量的值。这些维度之间是有着一定顺序关系的。在离散的意义下,我们可以将信号视为“具有一定顺序结构的向量”,将与卷积核进行卷积运算视为作用了一个特殊的线性变换。它对应的矩阵具有极其特殊的形式。我们想象这种特殊形式的有助于提取出“具有一定顺序结构的向量”中我们需要的信息。

与神经网络一样,卷积神经网络仍然是通过多层仿射变换与非线性函数的复合,形成一个高度非线性的特殊函数。不过它的仿射变换都是具有特殊形式的。具体而言,其变换矩阵中有许多位置被规定为0,也有许多位置被规定为同一个参数。这样形式的矩阵能够利用输入的顺序结构以提取有意义的信息。Stride与Zero padding这些参数决定了变换矩阵的具体形式。而ReLU与Pooling这些部分则为函数引入了非线性部分。

卷积神经网络又可以被视作一种共享权值的神经网络。与普通的神经网络相比,它在具有同样模型复杂度的情况下,更好地利用了输入具有的顺序结构,即它能够更好地从具有顺序结构的输入中提取有意义的信息。所以,它比普通的神经网络更加适合处理图像数据。

在训练的过程中,由于共享权值的原因,它不能只是简单地用BP方法求出偏导数就进行梯度下降。它必须将求出的偏导数组合成为全导数,才能使用神经网络各种常见的优化方法进行训练。

以上大概就是卷积神经网络的核心思想,所有不同结构的卷积神经网络都是以这样的核心思想而建立的。具体而言,有许多不同的构造网络的方法,例如LeNet、GoogleNet、AlexNet、ResNet等等。他们结构迥异,我们不多进行介绍。有兴趣的同学可以查阅有关资料进行进一步了解。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G1H9D800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券