文章目录
1 图像分类问题
假设我们现在要做图像的分类,也就是给机器一张图片,它要去判断这张图片里的东西属于什么类别,那我们应该怎么做呢?
假设我们的模型输入的图片大小是固定的,就比如是100 × 100,当然图片可能有大有小,我们需要提前把所有图片都 Rescale 成大小一样,再输入我们的系统。
由于模型的目标是分类,我们可以把每一个类别,表示成一个 One-Hot 的向量,目标向量就叫做 y ^ \hat{y} y^,这里假设我们的目标类别是猫,那它的 One-Hot 向量表示如下所示:
之前在2.5节中已经提到了分类问题的处理方式,这里对于图像的分类也可以应用类似的方式,我们将模型的输出通过 Softmax 层,输出是我们的预测类别向量 y ′ y' y′,然后我们希望 y ′ y' y′ 和 y ^ \hat{y} y^ 的 Cross Entropy 越小越好。
接下来的问题是,我们要怎么把一张图像作为我们模型的输入呢?
到目前为止我们所讲的 Network,它的输入其实都是一个向量,所以我们只要能够把一张图片变成一个向量,我们就可以把它当做是 Network 的输入。而一张图片就是是一个三维的 Tensor,如果不太清楚 Tensor 是什么的话可以看看这篇文章 笔记 | 什么是张量(tensor)& 深度学习 - 知乎 (zhihu.com),简单来说,Tensor 实际上就是一个多维数组(multidimensional array)。其中一维代表图片的宽,另外一维代表图片的高,还有一维代表图片的 Channel 的数目(彩色图片的RGB三个通道)。
一个简单的想法:把这个三维的 Tensor拉直,就可以作为 Network 的输入了。
在这个例子里面一张图片总共有 100 × 100 × 3 个数字,把这些数字通通拿出来排成一排,就是一个巨大的向量,这个向量可以就作为Network 的输入。目前我们还只讲过了 Fully Connected Network,那如果我们把这个向量当做 Network 的输入,Input 这边 Feature Vector的长度就是 100 × 100 × 3。
那现在假设我们第一层的 Neuron 的数目有 1000 个,由于每一个 Neuron 跟输入向量的每一个数值,都会有一个 Weight,所以如果输入的向量长度是 100 × 100 × 3,有 1000 个 Neuron,那我们现在第一层的 Weight,就有 1000 × 100 × 100 × 3,也就是 3×10 的 7 次方。
这个参数数量非常巨大,而且这还是只考虑了一层的情况,这么大的参数量会导致怎样的问题呢?
虽然随着参数的增加,我们可以增加模型的弹性,模型拟合数据的能力增强了,但是我们也增加了 Overfitting 的风险,并且这么大的参数量也会**带来很大的计算量。**所有接下来我们需要思考的一个问题是,怎么减少参数的个数呢?
考虑到我们的输入是图像信息,我们可以从图像本身的特性入手,其实我们并不一定需要 Fully Connected 这件事,我们其实不需要每一个 Neuron,跟图像的每一个像素点之间都有一个 Weight。
接下来就是图像信息本身特性的一些观察。
2 观察一:通过某些模式来识别
假如现在让你辨认一个画面中是否有鸟,你会怎么做呢?
你会去看现在的画面中是不是存在鸟的形体,是不是有鸟嘴,是不是有鸟爪,有翅膀和眼睛吗等等,而绿色树叶这些背景信息其实是不重要的。所有这就启发我们,我们的 Neuron 能不能用来通过检测当前的图片中是否存在一些与鸟的特点相关的重要的 Pattern,从而判断图片中有没有鸟呢?
在这个想法下,假设我们现在用 Neuron 做的事情,其实就是判断说现在有没有某种 Pattern 出现,那也许我们并不需要每一个 Neuron 都去看一张完整的图片,因为那些比较重要的 Pattern,比如说鸟嘴、眼睛,并不需要看到整张完整的图片,才能够得到这些资讯。
所以这些 Neuron 也许根本就不需要把整张图片当作输入,它们只需要把图片的一小部分当作输入,就足以让它们侦测某些特别关键的 Pattern有没有出现了。根据这个观察,我们就可以做接下来的第一个简化。
3 简化一:各扫门前雪
在 CNN 里面有一个这样的做法,我们会设定一个区域叫做 Receptive Field(感受野),每一个 Neuron 都只关心自己的 Receptive Field 里面发生的事情就好了,也就是“各扫门前雪”就行。
举例来说,我们定义一个蓝色的 Neuron,它只关心左上角的 3×3×3 个数值,它并不在意自己的 Receptive Field 之外有什么东西。
它要做的事情就是:
-
把这 3×3×3 的数值拉直,变成一个长度是 3×3×3 也就是 27 维的向量,再把这 27 维的向量作为这个 Neuron 的输入,
-
这个 Neuron 会给 27 维的向量的**每一个 Dimension 一个 Weight,**所以这个 Neuron 有 27个 Weight,
-
再加上 Bias 得到的输出,这个输出再送给下一层的 Neuron 当作输入。
所以每一个 Neuron都只考虑自己的 Receptive Field,而这个 Receptive Field 完全是由你自己决定的。
- Receptive Field 彼此之间可以是重叠的,比如上图中绿色的 Neuron 跟蓝色的 Neuron 还有黄色的 Neuron 都有一些重叠的空间。
- 也可以两个不同的 Neuron 有相同的Receptive Field,也许一个范围只使用一个 Neuron 没有办法侦测所有的 Pattern,所以同个范围可以有多个不同的 Neuron 来侦测。
- Receptive Field 可以有大有小,毕竟 Pattern 也是有大有小的,有的 Pattern 也许在 3×3 的范围内就可以被侦测出来,有的 Pattern 也许要 11×11 的范围才能被侦测出来。但一文读懂VGG网络 - 知乎 (zhihu.com)中提到了,VGG16 相比 AlexNet 的一个改进是采用连续的几个3x3的卷积核代替AlexNet中的较大卷积核(11x11,7x7,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。
- Receptive Field 可以只考虑某些 Channel ,就比如也许有些 Pattern只在红色的 Channel 会出现,所有是有这样的做法的。
- Receptive Field 并不一定都是正方形的,这完全都是你自己设计的,你是根据你对这个问题的理解来决定Receptive Field 应该要长什么样子。
总而言之,Receptive Field 是根据你对当前需要解决问题的理解来设计的,是很灵活的。但虽然你可以任意设计,还有有一些比较经典的 Receptive Field 的设计方式。