(四)Convolutional Neural Network(CNN)——卷积神经网络
(四)Convolutional Neural Network(CNN)——卷积神经网络
王貔貅Convolutional Neural Network(CNN)——卷积神经网络
Network Architecture designed for Image.(专为影像设计的网络体系结构)
一张图片是一个三维的 Tensor
,width
(宽)、height
(高)和 channel
(通道)的数目。
一张彩色的图片每一个 Pixel
(像素)都是由R、G、B 三个颜色组成,三个 channel
就代表了RGB三个颜色。width
和 height
就代表了这张图片的解析度、Pixel
的数目,表示颜色的强度 ( intensity )。
只要把一张图片变成一个向量,就可以把它当做 Network
的输入。
最直接的方法就是将它拉直,将图片(矩阵)做 flatten
处理,拉直变成一个向量。图片的每个像素点都是一个输入,输入 Network
,进行训练和预测。
但是,如果将每一个像素点都作为一个输入,就会产生巨大的参数。例如,100×100×3的图像,输入神经元的数量达到了,如果输出神经元有1000个,那么参数量将达到。模型复杂度高,且运算量巨大。随着参数的增加,模型的弹性会增加,但是也增加了 overfitting
的风险。
考虑影像本身的特性,其实并不一定需要 Fully connected
,并不需要每一个 Neuron
和 Input
的每一个 Dimension
都有一个 Weight
。
对影像辨识的观察
Obesevation 1: A neuron does not have to see the whole image.
观察 1:神经元不需要看整张图像。
Identifying some critical patterns.(识别一些重要的模式)
人类看图像时,是根据 pattern
识别。pattern
可以理解为是一些特征,比如轮廓、花纹等。看到特征以后,就会直觉地看到某种物体。对于机器,也许这是一个有效的判断图像中物体的方法。
假设用神经元来判断某种模式是否出现,也许并不需要每个神经元都去看一张完整的图像。因为并不需要看整张完整的图像才能判断重要的 pattern
(比如鸟嘴、眼睛、鸟爪)是否出现。想要知道图像有没有一个鸟嘴,只要看非常小的范围。这些神经元不需要把整张图像当作输入, 只需要把图像的一小部分当作输入,就足以让它们检测某些特别关键的模式是否出现。
Simplification 1:Receptive field
简化 1:感受野
每个神经元都只关心自己的 Receptive field
(感受野)里面发生的事情,而不需要在意整张图片里有什么东西。
感受野是由我们自己决定的。感受野彼此之间也可以是重叠的。多个神经元也可以去守备同一个感受野。
感受野可以有大有小,因为pattern
有的比较小,有的比较大。有的 pattern
也许在 3 × 3 的范围内就可以被检测出来,有的 pattern
也许要 11 × 11 的范围才能被检测出来。此外,感受野可以只考虑某些通道。目前感受野是 RGB 三个通道都考虑,但也许有些 pattern
只在红色或蓝色的通道会出现,即有的神经元可以只考虑一个通道。之后在讲到网络压缩的时候,会讲到这种网络的架构。感受野不仅可以是正方形的,例如刚才举的例子里面 3 × 3、11 × 11,也可以是长方形的,完全可以根据对问题的理解来设计感受野。
感受野一定要相连吗?
感受野的范围不一定要相连,理论上可以有一个神经元的感受野就是图像的左上角跟右上角。但是就要想想为什么要这么做,会不会有什么模式也要看一个图像的左上角跟右下角才能够找到。如果没有,这种感受野就没什么用。要检测一个模式,这个模式就出现在整个图像里面的某一个位置,而不是分成好几部分,出现在图像里面的不同的位置。所以通常的感受野都是相连的领地,但如果要设计很奇怪的感受野去解决很特别的问题,完全是可以的,这都是自己决定的。
为什么希望感受野之间是有重叠的呢?
因为假设感受野完全没有重叠,如果有一个模式正好出现在两个感受野的交界上面,就没有任何神经元去检测它,这个模式可能会丢失,所以希望感受野彼此之间有高度的重叠。如令步幅 = 2,感受野就会重叠。
Typical Setting
Observation 2:The same patterns appear in deifferent regions.
观察 2:同样的模式可能会出现在图像的不同区域
Simplification 2:Parameter sharing
简化 2:共享参数
所谓 Parameter sharing
(参数共享)就是两个神经元的权重完全是一样的。
由于输入不一样的关系,所以就算是两个神经元共用参数,它们的输出也不会是一样的。
感受野共享一组参数,这组参数称为滤波器(filter)。
总结 1、2
Neuron Version Story
全连接网络是弹性最大的。全连接网络可以决定它看整张图像还是只看一个范围,如果它只想看一个范围,可以把很多权重设成 0。
全连接层(fully-connected layer)可以自己决定看整张图像还是一个小范围。但加上感受野的概念以后,只能看一个小范围,网络的弹性是变小的。
参数共享又进一步限制了网络的弹性。本来在学习的时候,每个神经元可以各自有不同的参数,它们可以学出相同的参数,也可以有不一样的参数。但是加入参数共享以后,某一些神经元无论如何参数都要一模一样的,这又增加了对神经元的限制。
而感受野加上参数共享就是卷积层(convolutional layer),用到卷积层的网络就叫卷积神经网络。卷积神经网络的偏差比较大。
但模型偏差大不一定是坏事,因为当模型偏差大,模型的灵活性较低时,比较不容易过拟合。全连接层可以做各式各样的事情,它可以有各式各样的变化,但它可能没有办法在任何特定的任务上做好。而卷积层是专门为图像设计的,感受野、参数共享都是为图像设计的。虽然卷积神经网络模型偏差很大,但用在图像上不是问题。如果把它用在图像之外的任务,就要仔细想想这些任务有没有图像用的特性。
Another story based on filter
卷积层(convolutional layer)是由很多滤波器组成。这些滤波器的大小为3×3×通道。如果图片为彩色,它有RGB三个通道。如果是黑白的图像,它的通道就等于 1。
一个卷积层里面就是有一排的滤波器,每个滤波器都是一个,其作用是要去图像里面检测某个模式。
滤波器是一个一个的张量,这些张量里面的数值就是模型里面的参数。这些滤波器里面的数值其实是未知的,它是可以通过学习找出来的。
把滤波器与图像逐区域做点乘(对应位置相乘)求和运算,即得到对应的输出,也叫 Feature Map
(特征映射)。
当一张图像通过一个卷积层里面一堆滤波器的时候,就会产生一个特征映射。假设卷积层里面有 64 个滤波器,产生的特征映射就有 64 组数字。
特征映射可以看成是另外一张新的图像,只是这个图像的通道不是 RGB 3 个通道,而是有64 个通道,每个通道就对应到一个滤波器。本来一张图像有 3 个通道,通过一个卷积变成一张新的有 64 个通道图像。
**如果滤波器的大小一直设 3 × 3,会不会让网络没有办法看比较大范围的模式呢 **?
不会。如果在第 2 层卷积层滤波器的大小一样设 3 × 3,当我们看第 1 个卷积层输出的特征映射的 3 × 3 的范围的时候,在原来的图像上是考虑了一个5 × 5 的范围。虽然滤波器只有 3 × 3,但它在图像上考虑的范围是比较大的是 5 × 5。因此网络叠得越深,同样是 3 × 3 的大小的滤波器,它看的范围就会越来越大。所以网络够深,不用怕检测不到比较大的模式。
Obesevation 3: Subsampling the pixels will not change the object.
观察 3:下采样不影响模式检测
把一张比较大的图像做下采样(downsampling),把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么东西。
Simplification 3:Polling
简化 3:汇聚
Polling
(汇聚)没有参数,所以它不是一个层,它里面没有权重,它没有要学习的东西,汇聚比较像 Sigmoid、ReLU 等激活函数。因为它里面是没有要学习的参数的,它就是一个操作符(operator),其行为都是固定好的,不需要根据数据学任何东西。
Max Polling
(最大汇聚):取一定大小区域内(比如:2x2)的最大值。
Average Polling
(平均汇聚):取一定大小区域内的平均值。
做完卷积以后,往往后面还会搭配汇聚。汇聚就是把图像变小。做完汇聚以后,这张图像的通道不变。
不过汇聚对于模型的性能(performance)可能会带来一点伤害。假设要检测的是非常微细的东西,随便做下采样,性能可能会稍微差一点。所以近年来图像的网络的设计往往也开始把汇聚丢掉,它会做这种全卷积的神经网络,整个网络里面都是卷积,完全都不用汇聚。汇聚最主要的作用是减少运算量,通过下采样把图像变小,从而减少运算量。
随着近年来运算能力越来越强,如果运算资源足够支撑不做汇聚,很多网络的架构的设计往往就不做汇聚,而是使用全卷积,卷积从头到尾,看看做不做得起来,看看能不能做得更好。
一般架构就是卷积加汇聚,汇聚是可有可无的,很多人可能会选择不用汇聚。做完几次卷积和汇聚以后,把汇聚的输出做扁平化(flatten),再把这个向量丢进全连接层里面,最终还要过个 softmax 来得到图像识别的结果。这就是一个经典的图像识别的网络,里面有卷积、汇聚和扁平化,最后再通过几个全连接层或 softmax 来得到图像识别的结果。
应用
下围棋
除了图像识别以外,卷积神经网络另外一个最常见的应用是用来下围棋。
下围棋可以看成一个分类的问题,通过网络去预测下一步应该落子的最佳位置。下围棋就是一个有 19 _× _19 个类别的分类问题,网络会输出 19 _× _19 个类别中的最好类别,据此选择下一步落子的位置。这个问题可以用一个全连接网络来解决, 但用卷积神经网络的效果更好。
为什么卷积神经网络可以用在下围棋上?
首先一个棋盘可以看作是一个分辨率为 19×19 的图像。一般图像很大,100×100 的分辨率的图像,都是很小的图像了。但是棋盘是一个更小的图像,其分辨率只有 19×19。这个图像里面每个像素代表棋盘上一个可以落子的位置。
一般图像的通道就是 RGB。而在 AlphaGo 的原始论文里面,每个棋盘的位置,即每个棋盘上的像素是用 48 个通道来描述,即棋盘上的每个位置都用 48 个数字来描述那个位置发生的事情。48 个数字是围棋高手设计出来的,包括比如这个位置是不是要被叫吃了,这个位置旁边有没有颜色不一样的等等。所以当我们用 48 个数字来描述棋盘上的一个位置时,这个棋盘就是 19 × 19 的分辨率的图像,其通道就是 48。
卷积神经网络其实并不是随便用都会好的,它是为图像设计的。如果一个问题跟图像没有共通的特性,就不该用卷积神经网络。既然下围棋可以用卷积神经网络,这意味着围棋跟图像有共同的特性。
图像上的第1 个观察是,只需要看小范围就可以知道很多重要的模式。下围棋也是一样的,图 4.32中的模式不用看整个棋盘的盘势,就知道发生了什么事(白子被黑子围住了)。接下来黑子如果放在被围住的白子下面,就可以把白子提走。白子如果放在白子下面,被围住的白子才不会被提走。其实 AlphaGo 的第 1 层的滤波器大小就是 5 × 5,所以显然设计这个网络的人觉得棋盘上很多重要的模式,也许看 5 × 5 的范围就可以知道。
此外,图像上的第 2 个观察是同样的模式可能会出现在不同的位置,在下围棋里面也是一样的。吃的模式,它可以出现在棋盘上的任何位置,它可以出现在左上角,也可以出现在右下角,所以从这个观点来看图像跟下围棋有很多共同之处。
在做图像的时候都会做汇聚,一张图像做下采样以后,并不会影响我们对图像中物体的判断。但汇聚对于下围棋这种精细的任务并不实用,下围棋时随便拿掉一个列拿掉一个行,整个棋局就不一样。AlphaGo 在 Nature 上的论文正文里面没有提它用的网络架构,而是在附件中介绍了这个细节,它没用使用汇聚。所以这是一个很好的设计类神经网络的例子。在下围棋的时候不适合用汇聚。所以我们要想清楚,在用一个网络架构的时候,这个网络的架构到底代表什么意思,它适不适合用在这个任务上。Pooling
并不是必须的。在应用网络架构前,应该根据应用的场景、任务来判断网络结构是否要调整。
更多应用
卷积神经网络除了下围棋、图像识别以外,近年来也用在语音上和文字处理上。比如论文“Convolutional Neural Networks for Speech Recognition”将卷积神经网络应用到语音上,论文“UNITN: Training Deep Convolutional Neural Network for Twitter Sentiment Classification”把卷积神经网络应用到文字处理上。如果想把卷积神经网络用在语音和文字处理上,就要对感受野和参数共享进行重新设计,其跟图像不同,要考虑语音跟文字的特性来设计。所以不要以为在图像上的卷积神经网络,直接套到语音上它也奏效(work),可能是不奏效的。要想清楚图像语音有什么样的特性,要怎么设计合适的感受野。
CNN的不足之处
CNN is not invariant to scaling and rotation.(CNN并不能处理图像缩放或者是旋转的问题。)
假设给卷积神经网络看的狗的图像大小都相同,它可以识别这是一只狗。当把这个图像放大的时候,它可能就不能识别这张图像是一只狗。卷积神经网络就是这么“笨”,对它来说,这是两张图像。虽然两张图像的形状是一模一样的,但是如果把它们“拉直”成向量,里面的数值就是不一样的。虽然人眼一看觉得两张图像的形状很像,但对卷积神经网络来说它们是非常不一样的。所以事实上,卷积神经网络并不能够处理图像放大缩小或者是旋转的问题。假设图像里面的物体都是比较小的,当卷积神经网络在某种大小的图像上面学会做图像识别,我们把物体放大,它的性能就会降低不少,卷积神经网络并没有想像的那么强。因此在做图像识别的时候往往都要做数据增强。所谓数据增强就是把训练数据每张图像里面截一小块出来放大,让卷积神经网络看过不同大小的模式;把图像旋转,让它看过某一个物体旋转以后长什么样子,卷积神经网络才会做到好的结果。卷积神经网络不能够处理缩放(scaling)跟旋转(rotation)的问题,但 Special Transformer Layer 网络架构可以处理这个问题。