深度学习4一文搞懂什么是CNN:有趣有用(Datawhale X 李宏毅苹果书 AI夏令营)

简介

我们从卷积神经网络 (Convolutional Neural Network) 开始,探讨网络的架构设计。卷积神经网络常用于图像分类等任务。
所谓图像分类,就是给机器一张图像,由机器去判断这张图像里面有什么样的东西。
怎么把图像发送给机器呢?对于机器,图像可以描述为三维张量(张量可以想成维度大于 2 的矩阵)。一张图像是一个三维的张量,其中一维代表图像的宽,另外一维代表图像的高,还有一维代表图像的**通道(channel) **的数目。

Q:什么是通道? A:彩色图像的每个像素都可以描述为红色(red)、绿色(green)、蓝色(blue)的组合,这 3 种颜色就称为图像的 3 个色彩通道。这种颜色描述方式称为 RGB 色彩模型,常用于在屏幕上显示颜色。

网络的输入往往是向量,因此,将代表图像的三维张量“丢”到网络里之前,需要先将它“拉直”,如图 4.1 所示。在这个例子里面,张量有 100 _× _100 _× _3 个数字,所以一张图像是由100_×_100_×_3 个数字所组成的,把这些数字排成一排就是一个巨大的向量。这个向量可以作为网络的输入,而这个向量里面每一维里面存的数值是某一个像素在某一个通道下的颜色强度
图 4.1 把图像作为模型输入

图像有大有小,而且不是所有图像尺寸都是一样的。常见的处理方式是把所有图像先调整成相同尺寸,再“丢”到图像的识别系统里面。以下的讨论中,默认模型输入的图像尺寸固定为 100像素 × 100像素。

如果把向量当做全连接网络的输入,输入的特征向量(feature vector)的长度就是 100 _× _100 _× _3。这是一个非常长的向量。由于每个神经元跟输入的向量中的每个数值都需要一个权重,所以当输入的向量长度是 100 _× _100 _× _3,且第 1 层有 1000 个神经元时,第 1 层的权重就需要 1000_× _100_× _100_× _3 = 3 _× _107 个权重,这是一个非常巨大的数目。更多的参数为模型带来了更好的弹性和更强的能力,但也增加了过拟合的风险。模型的弹性越大,就越容易过拟合。为了避免过拟合,在做图像识别的时候,考虑到图像本身的特性,并不一定需要全连接,即不需要每个神经元跟输入的每个维度都有一个权重。接下来就是针对图像识别这个任务,对图像本身特性进行一些观察。
图 4.2 全连接网络
模型的输出应该是什么呢?模型的目标是
分类
,因此可将不同的分类结果表示成不同的
独热向量 y′
。在这个独热向量里面,类别对应的值为 1,其余类别对应的值为 0。例如,我们规定向量中的某些维度代表狗、猫、树等分类结果,那么若分类结果为猫,则猫所对应的维度的数值就是 1,其他东西所对应的维度的数值就是 0,如图 4.3 所示。**独热向量 y′ 的长度决定了模型可以识别出多少不同种类的东西。**如果向量的长度是 5,代表模型可以识别出 5 种不同的东西。现在比较强的图像识别系统往往可以识别出 1000 种以上,甚至上万种不同的东西。如果希望图像识别系统可以识别上万种目标,标签就会是维度上万的独热向量。模型的输出通过 softmax 以后,输出是 yˆ。我们希望 y′ 和 yˆ 的交叉熵越小越好。
image.png

4.1 观察 1:检测模式不需要整张图像

假设我们的任务是让网络识别出图像的动物。对一个图像识别的类神经网络里面的神经元而言,它要做的就是检测图像里面有没有出现一些特别重要的模式(pattern),这些模式是代表了某种物体的。
神经元在识别过程中扮演着关键的角色,它们能够检测出图像中的一些特定模式,例如鸟嘴、眼睛、鸟爪等,从而判断图像中是否存在某种物体。然而,神经元并不需要查看整张图像才能完成这个任务,而是只需要关注图像中一小部分的关键区域即可。这种局部感知的能力使得神经网络更加高效和准确。

4.2 简化 :感受野

感受野是指神经元关注的区域,由感受野大小和步幅决定。感受野内的数值会被拉成向量并作为神经元的输入,通过加权求和得到输出。感受野的设计可以根据问题需求自由选择,但一般情况下会选择相连的领地。同时,为了防止漏检边缘处的模式,感受野会超出图像范围并在边界处进行填充。感受野的作用是在图像中寻找特定的模式,通过对感受野内像素的加权处理实现特征提取和分类等任务。
image.png

Q: 感受野一定要相连吗?
A: 感受野的范围不一定要相连,理论上可以有一个神经元的感受野就是图像的左上角跟右上角。但是就要想想为什么要这么做,会不会有什么模式也要看一个图像的左上角跟右下角才能够找到。如果没有,这种感受野就没什么用。要检测一个模式,这个模式就出现在整个图像里面的某一个位置,而不是分成好几部分,出现在图像里面的不同的位置。所以通常的感受野都是相连的领地,但如果要设计很奇怪的感受野去解决很特别的问题,完全是可以的,这都是自己决定的。

在描述一个感受野的时候,只要讲它的高跟宽,不用讲它的深度,因为它的深度就等于通道数,而高跟宽合起来叫做核大小
卷积核
一般同一个感受野会有一组神经元去守备这个范围,比如 64 个或者是 128 个神经元去守备一个感受野的范围。目前为止,讲的都是一个感受野,接下来介绍下各个不同感受野之间的关系。我们把左上角的感受野往右移一个步幅,就制造出一个新的守备范围,即新的感受野。移动的量称为**步幅(stride) **,图 4.9 中的这个例子里面,步幅就等于 2。步幅是一个超参数,需要人为调整。因为希望感受野跟感受野之间是有重叠的,所以步幅往往不会设太大,一般设为 1 或 2。

Q: 为什么希望感受野之间是有重叠的呢?
A: 因为假设感受野完全没有重叠,如果有一个模式正好出现在两个感受野的交界上面,就没有任何神经元去检测它,这个模式可能会丢失,所以希望感受野彼此之间有高度的重叠。如令步幅 = 2,感受野就会重叠。

感受野超出了图像的范围,怎么办呢?如果不在超过图像的范围“摆”感受野,就没有神经元去检测出现在边界的模式,这样就会漏掉图像边界的地方,所以一般边界的地方也会考虑的。如图所示,超出范围就做**填充(padding) **
填充就是补值,一般使用零填充(zero padding),超出范围就补 0,如果感受野有一部分超出图像的范围之外,就当做那个里面的值都是 0。其实也有别的补值的方法,比如补整张图像里面所有值的平均值或者把边界的这些数字拿出来补没有值的地方 。

image.png

4.3 观察 2:同样的模式可能会出现在图像的不同区域

同一个模式鸟嘴可能出现在图像的不同位置,但是由于感受野是覆盖整个图像的,所以在某个感受野里只要有一个神经元能够检测到鸟嘴,那么无论鸟嘴出现在哪个位置都会被检测出来。然而,如果每个守备范围都需要放置一个检测鸟嘴的神经元,那么参数量会过多,因此需要做出相应的简化。
image.png

4.4 简化 2:共享参数

通过引入参数共享(parameter sharing) 的概念,可以在不增加计算量的情况下减少模型参数数量,从而提高模型的泛化能力和训练效率。共享参数指的是在 同一层神经网络中,不同的神经元使用相同的权重矩阵, 这样可以使得同一层神经元对于输入的不同位置特征提取更加高效。同时,共享参数还可以减少过拟合的风险,避免过多的参数导致模型过于复杂。
image.png
具体来说,在卷积神经网络中,通常会在卷积层中使用共享参数的技术。例如,对于一张图片中的某个像素点,它可能被多个卷积核所覆盖到,那么这些卷积核就可以共享相同的权重矩阵,这样可以大大减少需要训练的参数数量。此外,共享参数还可以使得卷积神经网络具有平移不变性,即对于输入图片的不同位置,卷积神经网络都能够提取出相同的特征信息。

image.png
如图 4.15 所示,每个感受野都有一组神经元在负责守备,比如 64 个神经元,它们彼此之间可以共享参数。图 4.16 中使用一样的颜色代表这两个神经元共享一样的参数,所以每个感受野都只有一组参数,就是上面感受野的第 1 个神经元会跟下面感受野的第 1 个神经元共用参数,上面感受野的第 2 个神经元跟下面感受野的第 2 个神经元共用参数 _· · · · · · _所以每个感受野都只有一组参数而已,这些参数称为滤波器(filter)。这是第 2 个简化的方法。image.png

4.5 简化 1 和 2 的总结

目前已经讲了两个简化的方法,我们来总结下。如图所示,全连接网络是弹性最大的。全连接网络可以决定它看整张图像还是只看一个范围,如果它只想看一个范围,可以把很多权重设成 0。 全连接层(fully-connected layer,) ** 可以自己决定看整张图像还是一个小范围。 ** 但加上感受野的概念以后,只能看一个小范围,网络的弹性是变小的。参数共享又进一步限制了网络的弹性。 本来在学习的时候,每个神经元可以各自有不同的参数,它们可以学出相同的参数,也可以有不一样的参数。但是加入参数共享以后,某一些神经元无论如何参数都要一模一样的,这又增加了对神经元的限制。而感受野加上参数共享就是 卷积层(convolutional layer) ,用到卷积层的网络就叫卷积神经网络。卷积神经网络的偏差比较大。但模型偏差大不一定是坏事,因为当模型偏差大,模型的灵活性较低时,比较不容易过拟合。全连接层可以做各式各样的事情,它可以有各式各样的变化,但它可能没有办法在任何特定的任务上做好。而卷积层是专门为图像设计的,感受野、参数共享都是为图像设计的。虽然卷积神经网络模型偏差很大,但用在图像上不是问题。如果把它用在图像之外的任务,就要仔细想想这些任务有没有图像用的特性。
image.png
接下来通过第 2 个版本的故事来说明卷积神经网络。如图 4.18 所示,卷积层里面有很多滤波器,这些滤波器的大小是 3 _× _3 _× _通道。如果图像是彩色的,它有 RGB 三个通道。如果是黑白的图像,它的通道就等于 1。一个卷积层里面就是有一排的滤波器,每个滤波器都是一个 3 _× _3 _× _通道,其作用是要去图像里面检测某个模式。这些模式要在 3 _× _3 _× _通道,这个小的范围内,它才能够被这些滤波器检测出来。举个例子,假设通道为 1,也就是图像是黑白的。
滤波器就是一个一个的张量,这些张量里面的数值就是模型里面的参数。这些滤波器里面的数值其实是未知的,它是可以通过学习找出来的。假设这些滤波器里面的数值已经找出来了,如图 4.19 所示。如图 4.20 所示,这是一个 6 _× _6 的大小的图像。先把滤波器放在图像的左上角,接着把滤波器里面所有的 9 个值跟左上角这个范围内的 9 个值对应相乘再相加,也就是做内积,结果是 3。接下来设置好步幅,然后把滤波器往右移或往下移,重复几次,可得到模式检测的结果,图 4.20 中的步幅为 1。使用滤波器 1 检测模式时,如果出现图像 3 _× _3 范围内对角线都是 1 这种模式的时候,输出的数值会最大。输出里面左上角和左下角的值最大,所以左上角和左下角有出现对角线都是 1 的模式,这是第 1 个滤波器。
image.png
image.png
如图 4.21 所示,接下来把每个滤波器都做重复的过程。比如说有第 2 个滤波器,它用来检测图像 3 _× _3 范围内中间一列都为 1 的模式。把第 2 个滤波器先从左上角开始扫起,得到一个数值,往右移一个步幅,再得到一个数值再往右移一个步幅,再得到一个数值。重复同样的操作,直到把整张图像都扫完,就得到另外一组数值。每个滤波器都会给我们一组数字,红色的滤波器给我们一组数字,蓝色的滤波器给我们另外一组数字。如果有 64 个滤波器,就可以得到 64 组的数字。这组数字称为 ** 特征映射(feature map) ** 。当一张图像通过一个卷积层里面一堆滤波器的时候,就会产生一个特征映射。假设卷积层里面有 64 个滤波器,产生的特征映射就有 64 组数字。在上述例子中每一组是 4 _× _4,即第 1 个滤波器产生 4 _× _4 个数字,第2 个滤波器也产生 4 _× _4 个数字,第 3 个也产生 4 _× _4 个数字, 64 个滤波器都产生 4 _× _4 个数字。特征映射可以看成是另外一张新的图像,只是这个图像的通道不是 RGB 3 个通道,有64 个通道,每个通道就对应到一个滤波器。本来一张图像有 3 个通道,通过一个卷积变成一张新的有 64 个通道图像。
图 4.21 使用多个滤波器检测模式

Q:如果滤波器的大小一直设 3 _× _3,会不会让网络没有办法看比较大范围的模式呢?
A:不会。 如图 4.23 所示,如果在第 2 层卷积层滤波器的大小一样设 3 _× _3,当我们看第 1 个卷积层输出的特征映射的 3 _× _3 的范围的时候,在原来的图像上是考虑了一个5 _× _5 的范围。虽然滤波器只有 3 × 3,但**它在图像上考虑的范围是比较大的是 5 ****× **5。因此网络叠得越深,同样是 3 _× _3 的大小的滤波器,它看的范围就会越来越大。所以网络够深,不用怕检测不到比较大的模式。

刚才讲了两个版本的故事,这两个版本的故事是一模一样的。第 1 个版本的故事里面说到了有一些神经元,这些神经元会共用参数,这些共用的参数就是第 2 个版本的故事里面的滤波器。如图 4.24 所示,这组参数有 3 _× _3 _× _3 个,即滤波器里面有 3 _× _3 _× _3 个数字,这边特别还用颜色把这些数字圈起来,权重就是这些数字。为了简化,这边去掉了偏置。神经元是有偏置的,滤波器也是有偏置的。在一般的实践上,卷积神经网络的滤波器都是有偏置的。
如图 4.25 所示,在第 1 个版本的故事里面,不同的神经元可以共享权重,去守备不同的范围。共享权重其实就是用滤波器扫过一张图像,这个过程就是卷积。这就是卷积层名字的由来。把滤波器扫过图像就相当于不同的感受野神经元可以共用参数,这组共用的参数就叫做一个滤波器

4.6 观察 3:下采样不影响模式检测

第 3 个观察是下采样不影响模式检测。把一张比较大的图像做下采样(downsampling),把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么东西。把一张大的鸟的图像缩小,这张小的图像还是一只鸟。

4.7 简化 3:汇聚(池化)

汇聚是一种操作符(operator) ,类似于激活函数,它不会学习任何参数,只需要执行固定的操作即可,没有参数,所以它不是一个层。在卷积后,通常会使用汇聚来减小图像大小,以便减少计算量。汇聚有多种版本,其中最常见的是最大汇聚(max pooling)平均汇聚(mean pooling)。最大汇聚会在每组数字中选取最大的数作为代表,而平均汇聚则会取每组数字的平均值。虽然汇聚可以减小图像大小并提高计算效率,但在某些情况下可能会降低模型性能。一般在实践上,往往就是卷积跟汇聚交替使用,可能做几次卷积,做一次汇聚。比如两次卷积,一次汇聚。不过汇聚对于模型的性能(performance)可能会带来一点伤害。假 因此,在近年来的一些研究中,人们开始尝试使用全卷积神经网络,即只使用卷积而不使用汇聚,以获得更好的性能。
图 4.27 最大汇聚示例
图 4.28 最大汇聚结果
一般架构就是卷积加汇聚,汇聚是可有可无的,很多人可能会选择不用汇聚。如图所示,如果做完几次卷积和汇聚以后,把汇聚的输出做扁平化(flatten),再把这个向量丢进全连接层里面,最终还要过个 softmax 来得到图像识别的结果。这就是一个经典的图像识别的网络,里面有卷积、汇聚和扁平化,最后再通过几个全连接层或 softmax 来得到图像识别的结果。

扁平化就是把图像里面本来排成矩阵样子的东西“拉直”,即把所有的数值“拉直”变成一个向量。

image.png

图 4.30 经典的图像识别的网络

4.8 卷积神经网络的应用:下围棋

下围棋其实是一个分类的问题,网络的输入是棋盘上黑子跟白子的位置,输出就是下一步应该要落子的位置。网络的输入是一个向量,棋盘上有 19 × 19个位置。卷积神经网络其实并不是随便用都会好的,它是为图像设计的。如果一个问题跟图像没有共通的特性,就不该用卷积神经网络。既然下围棋可以用卷积神经网络,这意味着围棋跟图像有共通的特性。图像上的一个观察是,只需要看小范围就可以知道很多重要的模式。下围棋也是一样的,图中的模式不用看整个棋盘的盘势,就知道发生了什么事。
image.png

Q: 为什么卷积神经网络可以用在下围棋上?
A: 首先一个棋盘可以看作是一个分辨率为 19_×_19 的图像。一般图像很大, 100_×_100 的分辨率的图像,都是很小的图像了。但是棋盘是一个更小的图像,其分辨率只有 19_×_19。这个图像里面每个像素代表棋盘上一个可以落子的位置。一般图像的通道就是 RGB。而在 AlphaGo 的原始论文里面,每个棋盘的位置,即每个棋盘上的像素是用 48 个通道来描述,即棋盘上的每个位置都用 48 个数字来描述那个位置发生的事情[1]。 48 个数字是围棋高手设计出来的,包括比如这个位置是不是要被叫吃了,这个位置旁边有没有颜色不一样的等等。所以当我们用 48 个数字来描述棋盘上的一个位置时,这个棋盘就是 19 _× _19 的分辨率的图像,其通道就是 48。卷积神经网络其实并不是随便用都会好的,它是为图像设计的。如果一个问题跟图像没有共通的特性,就不该用卷积神经网络。既然下围棋可以用卷积神经网络,这意味着围棋跟图像有共同的特性。图像上的第1 个观察是,只需要看小范围就可以知道很多重要的模式。下围棋也是一样的,图 4.32中的模式不用看整个棋盘的盘势,就知道发生了什么事(白子被黑子围住了)。接下来黑子如果放在被围住的白子下面,就可以把白子提走。白子如果放在白子下面,被围住的白子才不会被提走。其实 AlphaGo 的第 1 层的滤波器大小就是 5 _× _5,所以显然设计这个网络的人觉得棋盘上很多重要的模式,也许看 5 _× _5 的范围就可以知道。此外,图像上的第 2 个观察是同样的模式可能会出现在不同的位置,在下围棋里面也是一样的。如图 4.33 所示,这个叫吃的模式,它可以出现在棋盘上的任何位置,它可以出现在左上角,也可以出现在右下角,所以从这个观点来看图像跟下围棋有很多共同之处

模式举例:image.png
在做图像的时候都会做汇聚,一张图像做下采样以后,并不会影响我们对图像中物体的判断。但汇聚对于下围棋这种精细的任务并不实用,下围棋时随便拿掉一个列拿掉一个行,整个棋局就不一样。 AlphaGo 在 Nature 上的论文正文里面没有提它用的网络架构,而是在附件中介绍了这个细节。 AlphaGo 把一个棋盘看作 19 _× _19 _× _48 大小的图像。接下来它有做零填充。它的滤波器的大小是 5 _× _5, 然后有 _k _= 192 个滤波器, _k _的值是试出来的, 它也试了128、 256,发现 192 的效果最好。这是第 1 层,步幅 =1,使用了 ReLU。在第 2 层到第 12 层都有做零填充。核大小都是 3 _× _3,一样是 _k _个滤波器,也就是每一层都是 192 个滤波器,步幅一样设 1,这样叠了很多层以后,因为是一个分类的问题,最后加上了一个 softmax,没有用汇聚,所以这是一个很好的设计类神经网络的例子。在下围棋的时候不适合用汇聚。

其实卷积神经网络不能处理图像放大缩小或者是旋转的问题,假设给卷积神经网络看的狗的图像大小都相同,它可以识别这是一只狗。当把这个图像放大的时候,它可能就不能识别这张图像是一只狗。卷积神经网络就是这么“笨”,对它来说,这是两张图像。虽然两张图像的形状是一模一样的,但是如果把它们“拉直”成向量,里面的数值就是不一样的。 虽然人眼一看觉得两张图像的形状很像,但对卷积神经网络来说它们是非常不一样的。所以事实上,卷积神经网络并不能够处理图像放大缩小或者是旋转的问题。假设图像里面的物体都是比较小的,当卷积神经网络在某种大小的图像上面学会做图像识别,我们把物体放大,它的性能就会降低不少,卷积神经网络并没有想像的那么强。因此在做图像识别的时候往往都要做数据增强。所谓数据增强就是把训练数据每张图像里面截一小块出来放大,让卷积神经网络看过不同大小的模式;把图像旋转,让它看过某一个物体旋转以后长什么样子,卷积神经网络才会做到好的结果。卷积神经网络不能够处理缩放(scaling)跟旋转(rotation)的问题,但 Special Transformer Layer 网络架构可以处理这个问题。

全文简要思维导图

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值