卷积神经网络(CNN)详解

2021年5月31日 104Browse 1Like 0Comments

卷积网络(convolutional network),也叫作卷积神经网络(convolutional neural network,CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。卷积网络在诸多应用领域都表现优异。‘卷积神经网络’一词表明该网络使用了卷积(convolutional)这种数学运算。

卷积神经网络的一个基本构成如下图所示:

由上图可以看到,一个基本的卷积神经网络包含输入层、卷积层、非线性激活层、池化层、全连接层和输出层。其中的核心在于卷积层池化层

卷积层

卷积运算

卷积层的核心就是卷积运算。我们先了解一下什么是卷积运算。

在通常的形式中,卷积是对两个实变函数的一种数学运算。先看下述例子:

假设我们正在用激光传感器追踪一艘宇宙飞船的位置。我们的激光传感器给出一个单独的输出$x(t)$,表示宇宙飞船在时刻$t$的位置。$x$和$t$都是实值的,这意味着我们可以在任意时刻从传感器中读出飞船的位置。

现在还假设我们的传感器受到一定程度的噪声干扰。为了得到飞船位置的低噪声估计,我们对得到的测量结果进行平均。显然,时间上越近的测量结果越相关,所以我们采用一种加权平均的方法,对于最近的测量结果赋予更高的权重。我们可以采用一个加权函数$\omega(a)$来实现,其中$a$表示测量结果距当前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作,就得到了一个新的对于飞船位置的平滑估计函数$s$:
$$
s(t)=\int x(a)\omega(t-a)da \tag{1}
$$

上述的这种操作就叫做卷积。卷积运算通常用星号表示:
$$
s(t)=(x*\omega)(t) \tag{2}
$$
在卷积网络的术语中,卷积的第一个参数(这个例子中就是函数$x$)通常叫做输入(input),第二个参数(函数$\omega$)叫做核函数(kernel function)。输出有时被称作特征映射(feature map)。

从上述例子可以看出,这种通常的卷积是一个函数进行翻转之后和另一个函数进行了叠加。

我们同时可以写出他们的离散形式:
$$
s(t)=(x*\omega)(t)=\sum_{a=-\infty}^{\infty}x(a)\omega(t-a) \tag{3}
$$
但是深度学习中的卷积有所区别。

以灰度图像为例:从一个小小的权重矩阵,也就是卷积核(kernel)开始,让它逐步在二维输入数据上“扫描”。卷积核“滑动”的同时,计算权重矩阵和扫描所得的数据矩阵的乘积,然后把结果汇总成一个输出像素。

img

img

深度学习里面所谓的卷积运算,其实它被称为互相关(cross-correlation)运算:将图像矩阵中,从左到右,由上到下,取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,最后的结果组成一个矩阵,其中没有对核进行翻转

可以看出来,所谓的卷积运算其实就是特征提取的过程

卷积运算中的一些技巧

在我们继续讨论前,我们先来看看卷积神经网络中经常出现的两种技巧:Padding和Strides。

Padding

观察上面的卷积操作,不难发现我们把5×5的特征矩阵转换成了3×3的特征矩阵,输入图像的边缘被“修剪”掉了,这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。这是不理想的,通常我们都希望输入和输出的大小应该保持一致。

img

Padding就是针对这个问题提出的一个解决方案:它会用额外的“假”像素填充边缘(值一般为0),这样,当卷积核扫描输入数据时,它能延伸到边缘以外的伪像素,从而使输出和输入大小相同。

Stride

如果说Padding的作用是使输出与输入同高宽,那么在卷积层中,有时我们会需要一个尺寸小于输入的输出。那这该怎么办呢?这其实是卷积神经网络中的一种常见应用,当通道数量增加时,我们需要降低特征空间维度。实现这一目标有两种方法,一是使用池化层,二是使用Stride(步幅)。

img

滑动卷积核时,我们会先从输入的左上角开始,每次往左滑动一列或者往下滑动一行逐一计算输出,我们将每次滑动的行数和列数称为Stride,在上节的图片中,Stride=1;在上图中,Stride=2。Stride的作用是成倍缩小尺寸,而这个参数的值就是缩小的具体倍数,比如步幅为2,输出就是输入的1/2;步幅为3,输出就是输入的1/3。以此类推。

在一些目前比较先进的网络架构中,如ResNet,它们都选择使用较少的池化层,在有缩小输出需要时选择步幅卷积。

关于卷积的技巧和类型还有很多,这里不再赘述。

卷积运算中包含的三个重要思想

思想一——稀疏交互(sparse interactions)

传统的神经网络使用矩阵乘法来建立输入与输出的连接关系。其中,参数矩阵中每一个独立的参数都描述了一个输入单元与一个输出单元间的交互。这意味着每一个输出单元与每一个输入单元都产生了交互。

然而,卷积网络具有稀疏交互的特征。这是通过让核的大小远远小于输入的大小来达到的。举个例子,当处理一张图像时,输入的图像可能包含成千上万个像素点,但是我们可以通过只占用几十到几百个像素点的核来检测一些小的有意义的特征,比如图像的边缘。这意味着我们需要存储的参数更少,不仅减少了模型的存储需求,还提高了它的统计效率。

思想二——参数共享(parameter sharing)

参数共享是指在一个模型的多个函数中使用相同的参数。在传统的神经网络中,当计算一层的输出时,权重矩阵的每一个元素只使用一次,当它乘以输入的一个元素后就再也不会用到了。

在卷积神经网络中,核的每一个元素都作用在输入的每一位置上。卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的运行时间,但它显著地把模型的存储需求降低至$k$个参数,并且$k$通常要比$m$小很多个数量级。

思想三——等变表示(equivariant representations)

对于卷积,参数共享的特殊形式使得神经网络具有对平移等变的性质。如果一个函数满足输入改变,输出也以同样的方式改变这一性质,那么我们就说它是等变的。特别的是,如果函数$f(x)$与$g(x)$满足$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$进行这种变换然后进行卷积操作所得到的结果,与先对$I$进行卷积再对输出使用平移函数$g$得到的结果是一样的。

非线性激活层

卷积层对原图运算多个卷积,产生一组线性激活响应,而非线性激活层是对之前的结果进行一个非线性的激活响应。

激活函数的作用是用来加入非线性因素,把卷积层输出结果做非线性映射。

在卷积神经网络中用到最多的非线性激活函数是Relu函数,除此之外还有sigmoid、tanh激活函数。

池化层

池化层是卷积神经网络中的另一个核心组件。池化层的核心在于池化函数。池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。池化函数的输入是非线性激活层的输出,我们使用池化函数进一步对特征进行了调整。也就是说,池化层的主要作用是特征选择

目前主要的pooling操作有:

  • 最大值池化(Max pooling):如下图所示,2 * 2的max pooling就是取4个像素点中最大值保留
  • 平均值池化 (Average pooling): 类似的有, 2 * 2的average pooling就是取4个像素点中平均值值保留
  • L2池化 (L2 pooling): 即取均方值保留

下述就是一个最大池化的例子:

Screen Shot 2016-08-10 at 3.38.39 AM.png

不管采用什么样的池化函数,当输入做出少量平移时,池化能够帮助输入的表示近似不变(invariant)。平移的不变性是指当我们对输入进行少量平移时,经过池化函数后的大多数输出并不会发生改变。

使用池化可以看作增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。

使用池化操作还有有以下好处:

1、特征不变形:池化操作使得模型更加关注是否存在某些特征,而不是特征具体的位置。
2、特征降维:池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。
3、在一定程度上防止过拟合,更方便优化。
(由1、2可知,这种池化机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。)

到这里,卷积神经网络的基本构成——卷积层、激活层和池化层就介绍完毕了。在实际构建网络的过程中,可以按照实际的需要,将这三个部分任意堆叠。

全连接层

前面的卷积层和池化层分别完成了特征提取和特征选择,这些特征都是局部的特征,还需要一个全链接网络将以前的局部特征重新通过权值矩阵,组装成完成的网络。

全连接层还有一个作用,对特征进行维度上的改变,来得到每个分类类别对应的概率值,从而实现分类的作用(对于分类任务而言,其他任务也类似)。

训练

到此,将上述部分组合起来就得到了卷积神经网络,然后与BP神经网络中类似地,利用信息的前向传播和BP算法可以进行训练。这部分不再细说。

总结

优点
  • 共享卷积核,对高维数据处理无压力

  • 无需手动选取特征,训练好权重,即得特征分类效果好

​ • 尤其适合图像处理

缺点
  • 需要调参,需要大样本量,训练最好要GPU

  • 缺乏公认的理论解释

agedcat_xuanzai

这个人很懒,什么都没留下

Comments