License: CC BY-NC-SA 4.0
有时候,对特定任务调整神经网络的架构会使它做得更好。例如,CNN 用于图像识别。
一张彩色图片是 3 个矩阵(RGB),当然可以把它拉直成向量然后直接硬上全连接层,但是这样会带来非常多的参数,增加了 overfitting 的风险。
下面我们要基于一些观察来简化模型。
-
人判断时是基于一些局部的特征来识别图像的。比如一只鸟,我们会注意它的头、身、嘴等。
识别局部特征不需要看整张图。
简化:给每个神经元设定一个区域 receptive field(例如左上角的 \(3 \times 3\) 像素,算上 RGB 通道一共 \(27\) 个输入),一个神经元只看这个区域里的图像。
什么,你说你的特征不止 \(3 \times 3\) 大小?用更深的网络就行了。
-
同样的 pattern 可能会出现在图像的不同区域。
简化:给不同 receptive field 的神经元共享参数(共享的参数叫 filter)。
你会发现这很像卷积,于是给这种神经网络取一个新的名字,叫卷积神经网络 CNN。原来的全连接层也进化成了卷积层。
-
压缩图像前后物体不变。
比如把图像的奇数行和奇数列都删掉,(在分辨率不太小的情况下)剩下的图片还可以认出来是什么东西。
于是给神经网络加入 pooling 层。它没有参数(类似激活函数),就是取一个 2d 区域然后合并为一个数。例如 max pooling 就是取这个区域里的 max。
pooling 是一个用于节省资源的操作,你的算力足够的话可以不用 pooling。
然后成为卷王
CNN 的一个著名的应用是 AlphaGO。其实下围棋也是一种分类问题,而围棋也有局部的特点。但是围棋显然没法压缩图片,因此 AlphaGO 里没有 pooling。
CNN 虽然看起来很强,但如果把图片放大缩小旋转,它的识别能力就下降了(因为没训练过)。spacial transformer layer 就可以解决这个问题。