CNN 其实可以看作 DNN 的一种特殊形式。它跟传统 DNN 标志性的区别在于两点,Convolution Kernel 以及 Pooling。
1. Convolution Kernel
假设现在 Convolution Kernel 大小是 3*3,卷积公式:
y[1, 1] = sum: x[i, j] * h[1 - i, 1 - j]
注意:x 和 h 的位置刚好是翻转的
Input Image 到 Output Image 的变化:
注意细节:这里的 input 和 kernel 的位置已经反转了!
其实二维卷积一样也是加权积分。
1.1 卷积核的意义:
Convolution Kernel 具有的一个属性就是局部性,即它只关注局部特征,局部的程度取决于 Convolution Kernel 的大小。比如用 Sobel 算子进行边缘检测,本质就是比较图像邻近像素的相似性。
另一种解读:原图像与 Convolution Kernel 的卷积,其实对频域信息进行选择。比如,图像中的边缘和轮廓属于是高频信息,图像中某区域强度的综合考量属于低频信息。在传统图像处理里,这是指导设计 Convolution Kernel 的一个重要方面。
1.2 CNN卷积核的独特之处:
- CNN 可以看作是 DNN 的一种简化形式,即这里 Convolution Kernel 中的每一个权值就可以看成是 DNN 中的 ω,且与 DNN 一样,会多一个 bias b 参数。
- 一个 Convolution Kernel 在 Input 不同区域做卷积时(窗口滑动时),它的参数是固定不变的。在 DNN 的框架中理解,就是对同一层 Layer 中的神经元而言,他们的 ω 和 b 一样!只是连接的数据节点在变化!CNN 里叫做 Shared Weights and Biases。
- CNN 中,Convolution Kernel 可能是高维的。假如输入是
m × n × k
,那么一般 Convolution Kernel 就会选择为d × d × k
维,也就是与输入的 Depth 一致,比如图像的每一个像素的深度信息。 - 最重要的一点,在 CNN 中,Convolution Kernel 的权值不需要提前设计,跟 DNN 一样利用 GD 来优化,只需要初始化。
- 如上面所说,其实 Convolution Kernel 卷积后得到的会是原图的某些特征(如边缘信息),所以在 CNN 中,Convolution Kernel 卷积得到的 Layer 称作 Feature Map。
- 一般 CNN 中两层之间会含有多个 Convolution Kernel,目的是学习出 Input 的不同特征,对应得到多个 Feature Map。又由于 Convolution Kernel 中的参数是通过 GD 优化得到而非我们设定的,于是初始化就显得格外重要了。
2. 池化 Pooling
- Pooling 的本质其实是采样。
- Pooling 对于输入的 Feature Map,选择某种方式对其进行压缩。
如下图,表示的就是对 Feature Map 2 × 2
邻域内的值,选择最大值输出到下一层,这叫做 Max Pooling。于是一个 2N × 2N
的 Feature Map 被压缩到了 N × N
。
除此之外,还有 Mean-Pooling,Stochastic-Pooling 等。它们的具体实现如名称所示,具体选择哪一个则取决于具体的任务。
上面的是一般池化的定义,池化还包括:
- 重叠池化 Overlapping Pooling
- 空间金字塔池化 Spatial Pyramid Pooling
Pooling 的意义:
- 减少参数。通过对 Feature Map 降维,有效减少后续层需要的参数。
- Translation Invariance 平移不变性。它表示对于 Input,当其中像素在邻域发生微小位移时,Pooling Layer 的输出是不变的。这就使网络的鲁棒性增强了,有一定抗扰动的作用。