3.1 卷积神经网路 (Convolutional Neural Networks, CNN)
1. 概念引入: Image Classification
1.1 基本步骤
我们做图像分类时,一般分为三步:
- 所有图片都先 rescale 成大小一样
- 把每一个类别表示成一个 one-hot vector(dimension 的长度决定模型可以辨识出多少不同种类的东西)
- 将图片输入到模型中
1.2 将图片输入到模型中
首先要提出的问题是怎么将图片输入到模型.机器将图像看成三维的Tensor,三维分别是长,宽,通道数.100*100是像素点数量,每个像素点都由RGB三种颜色构成,所以就有 3 个channels.然后将这些像素拉直,形成一个很长的向量!这个向量的某个数值就是某个\(pixel\)在某个颜色上的强度.
向量中总共有100x100x3 个自变量,假如使用全连接网络,每一个Neuron与向量的每一个数值都有\(weight\).假设隐藏层有1000个神经元,那么我们需要的参数就是30000000!一方面参数太多了影响运算,另一方面模型弹性太大,很容易导致overfitting,所以我们要想办法简化网络,降低模型弹性.
考虑到影像辨识问题本身的特性,其实并不一定需要 fully connected,即不需要每一个 neuron 与 input 的每一个 dimension 都有一个 weight.
2. 神经元角度介绍 CNN
我们先观察影像本身,来简化网络.
2.1 观察一
人类辨识一张图片的方法就是看图片中存在的关键特征,比如鸟有鸟嘴,眼睛,锋利的爪子等等。机器可以借鉴这个思想:只需要辨识一些关键图案.即模型通过识别一些特定 patterns 来识别物体,而非整张图
根据这个观察,我们就可以做第一个简化.那么怎么只看一个pattern呢?在CNN里,我们定义了一个名词Receptive field(感受野),每个神经元只需要考察自己特定范围内的图像讯息,将图像内容展平后输入到神经元中即可.也就是将感受野的3*3*3的tensor拉直,然后变成27维向量输入到对应Neuron里.Neuron会给每个参数一个weight,相乘作为输出.
请注意:
- reptive field 之间可以重叠
- 一个 reptive field 可以有多个神经元守备
- reptive field 可以有大有小
- reptive field 可以只考虑某一些 channel
- reptive field 可以是长方形
- reptive field 不一定要相连
reptive field可以由我们自己定义,但有一个经典的设计模式: - 一般在做影像辨识的时会看全部的 channel。所以在描述一个 receptive field 的时候,无需说明其 channel 数,只要讲它的高、宽 ⇒ kernel size → 一般不做过大的 kernal size,常常设定为 3 × 3.
- 每个 reptive field 会有不止一个神经元进行守备(eg:64 neurons) ⇒ 输出通道数 o r卷积核数目
- 不同的 reptive field 之间的关系 ⇒ reptive field 的水平垂直位移:Stride【hyperparameter】→ 一般希望 reptive field 之间有重叠,避免交界处的 pattern 被忽略(一般为1或2)
- reptive field 超出影响的范围 ⇒ padding(补值:补 0、补平均值、补边缘值、…)
2.2 观察二
同样的 pattern,可能出现在图片的不同位置.比如下图的鸟嘴.那么每一个感受域都需要创建一个鸟嘴检测器吗?答案是否定的,因为不同感受域可以共用同一个鸟嘴检测器!
简化措施就是共享神经元参数(即Neuron的weight是完全一样的,比如上面的Neuron和下面的Neuron虽然感受域不同,但是weight相同),但守备相同感受野的Neuron不共享参数.
它同样有经典的设计模式:对每个 reptive field,都使用一组相同的神经元进行守备;这一组神经元被称作 Filter,对不同 reptive field 使用的 Filter 参数相同.
2.3 Convolutional Layer 的优势
卷积层是"受限"(弹性变小)的 Fully Connected Layer.Fully Connected Layer可以自由选择要看的感受野,而CNN直接固定了.并且,Fully Connected Layer的各个参数并不相同,而CNN有共享参数.
分析:
- 一般而言,model bias 小、model 的 flexibility 很高的时候,比较容易 overfitting。fully connected layer 可以有各式各样的变化,但是它可能没有办法在任何特定的任务上做好
- CNN 的 bias 比较大,它是专门为影像设计的,所以它在影像上仍然可以做得好
3. 以滤波器角度介绍 CNN
3.1 卷积层的基本定义
卷积层中有若干个 filters,每个 filter 可以"抓取"图片中的某一种 pattern(pattern 的大小小于 reptive field 大小).filter 的参数就是神经元中的"权值(weight)".
假如图片是彩色的,那么channel 是 3,如果图片是黑白的,那么 channel 是 1.
一个首要的问题的\(filter\)要如何抓取\(pattern\).假设图片为黑白图片,channel=1.filter 中的数字就是参数 w!是需要学出来的,假设我们已经学出来了这些数值.
filter 与 image 中每个感受域的数字相乘,例如image 的右上角的九宫格和filter相乘,得到3,从头到尾移动生成很多个感受域,这些感受域和filter 相乘后形成一系列数字,组成了一个数字图.
注意:上图所示的滤波器,对主对角线为 1 的特征敏感 ⇒ 对应卷积结果为 3(最大).第二个 filter 做同样的事,又形成一个数字图,不同的filter形成的数字图叠在一起就组成了 feature map.所以有多少个 filter,输出的feature map就有几个channel,每个channel 对应一个 filter.
比如下图中的第一个卷积层有 64 个滤波器,所以输出的 feature map就有 64 个 channel.
3.2 多层卷积
第一层的卷积结果产生了一张 \(3\times3\times64\) 的 feature map.继续卷积时,需要对 64 个 channel 都进行处理 ⇒ filter 的"高度"要是 64.
3.3 小filter是否能看到大pattern
假如第二层的filter的宽高还是3x3,我们发现第二层能检测的信息是原来尺度的5x5.所以检测范围一直在扩大!第二层检测的右上角的 -1包含第一层输入的右上角九宫格的资讯。第二层检测的右下角的-2包含第一层输入的右下角九宫格的资讯。所以第二层3x3蓝色框就是第一层的5x5.
4. 神经元角度(Neuron)vs 滤波器角度(Filter)
神经元角度说到Neuron 会共用参数,这些共用的参数就是滤波器角度说到的 Filter(Filter在移动,可以看成不同Filter在共用参数).实际filter中会包含 bias,但是在分析的时候我们忽略了 bias,只分析了 w.
4.1 不用看整张图片范围
- 神经元角度:只要守备 reptive field
- 滤波器角度:使用 Filter 侦测模式 pattern
4.2 相同Pattern 可能出现在图片的不同位置
- 神经元角度:守备不同 reptive field 的神经元可以共用参数
- 滤波器角度:Filter 扫过整张图片(也称为 Convolutional)
5. Subsampling(Pooling)
以下图为例,把偶数行拿掉,把奇数列拿掉,不会影响图片的分类,同时可以减少运算量.
5.1 不同 Pooling 方法
-
Max pooling
下图通过滤波器产生了4x4 的数字图,按照方框分成四组,每一组中选最大值做为该组代表,这就叫max pooling.
-
Mean Pooling
假如是将每一组的平均值作为该组代表,那么就叫做 mean pooling.
做完convolution后,往往后面还会搭配pooling
5.2 Pooling 可有可无
pooling 对于 rerformance 会带来一点伤害。如果运算资源足够,现今很多 network 的架构的设计往往就不做 pooling,改为全 convolution.这是因为pooling主要为了减少计算量.
6. CNN 全流程总结
pooling 对于 rerformance 会带来一点伤害.如果运算资源足够,现今很多 network 的架构的设计往往就不做 pooling,改为全 convolution.(因为现在很多实验环境算力都够用,池化层的目的显得越来越没必要,所以在设计每一模块的时候都要考虑当前任务及实验环境,根据这些因素去设计最符合的网络)
7. CNN的应用
7.1 Alpha Go
可使用 FC,但用 CNN 效果更好.把棋盘看成 \(19\times19\) 的图片,用 48 个 channel 来描述.每个channel用于描述该位置的信息.
7.1.1 Why CNN for Go playing?
CNN多用于影像辨识,为什么也可以使用下围棋呢?一般有以下两点:
- 只看小范围
- 同个 pattern 在不同位置出现
顺带一提,pooling是不能用在下围棋的模型里的.
7.2 语音、NLP
8. CNN的缺陷
CNN 并不能够处理影像放大缩小,或者是旋转的问题.所以在做影像辨识的时候,往往都要做 data augmentation(数据增强),把训练数据截一小块出来放大缩小、把图片旋转,CNN 才会做到好的结果.
可以用 Spacial Transformer Layer 处理这个问题