前言
本篇我们将继续讨论卷积神经网络(CNN)。我们将讨论CNN中除卷积操作之外的另一个重要操作,即池化(Pooling)。我们将介绍池化操作,并重点讨论其背后的逻辑。本篇为《深度学习》(Yoshua Bengio, et al.)第9章学习笔记,主要涵盖第9.3节和9.4节内容,经本人学习、理解并加以加工。由于水平有限,如有不当之处,欢迎大家指出,一起学习交流。
——————————————————————————————————————————————————————
CNN中一个典型的层包含三级/层/阶段,如图1所示(原图9.7):
- 卷积层(Convolution Stage/Layer)通过卷积运算产生一组线性激活。我们前面说过,卷积是一种特殊的线性变换。这个阶段相当于对输入做了个仿射(Affine)变换。
- 探测器层(Detector Stage/Layer)利用非线性激活函数(如整流线性激活单元)将上述线性激活按元素地转换为一组非线性激活。
- 池化层(Pooling Stage/Layer)进一步对探测器层的输出进行调整。
注释:
这里是按照计算图的概念来组织各层的,在实际实现时,很多机器学习库将卷积层和探测器层整合在了一起。
池化使用某一位置相邻输出的总体统计特征来代替网络在该位置的输出 [1]。例如,最大池化(max pooling)利用相邻区域的最大值来代替网络在该位置的输出,如图2所示。其他常见的池化函数还有平均值、L2 范数以及基于距中心像素距离的加权平均函数。
不管采用何种池化方式,池化一般都具有以下优点或特点:
- 近似不变性(Approximately Invariant)
- 节省内存开销,提升计算效率
- 可处理可变大小的输入
当然,池化也有其缺点:
- 使得一些利用自顶向下(Top-down)信息的神经网络结构变得复杂,如玻尔兹曼机和自编码器
- 可能会导致欠拟合(Underfitting)
1. 近似不变性
池化有助于使得表示对于输入的小尺度平移(translation)具有近似不变性。这意味着当我们对输入进行少量平移时,大多数池化输出并不会发生改变,如图3所示(原图9.8)。
如果我们对不同参数化的卷积的输出进行池化,那么特征能够学得应该对于哪种变换具有不变性,即使得池化对平移之外的变换也具有近似不变性,如图4所示(原图9.9)。
图4. 通过对不同参数学习得到的特征进行池化,池化可以学习对其他变换的近似不变性。图中展示了如何利用三个学习得到的过滤器及一个最大池化单元来实现对旋转的不变性。这三个过滤器都旨在检测手写数字5。每个过滤器尝试匹配方向稍微不同的5。当输入中出现5时,相应的过滤器会匹配它并且在探测器单元中引起大的激活。然后,无论哪个探测器单元被激活,最大池化单元在对他们进行最大池化之后,池化输出都具有大的激活。
2. 节省内存开销,提升计算效率
CNN中,输入在经过几轮卷积层-探测器层-池化层之后,后面往往会连接一个全连接层,如图5所示。池化使得我们可以减少探测器层的非线性激活(即特征)的数目(如图2最大池化所示,最大池化输出为输入的1/4),从而减少后续全连接层的矩阵乘法的参数数目,因此可以节省内存开销,提升计算效率。
3. 可处理可变大小的输入
传统全连接神经网络结构固定,无法处理不同大小的输入。而对于CNN而言,通过调整池化层滤波器的尺寸和移动步长,我们可以输出相同大小的统计特征,以便后续使用固定大小的全连接层进行进一步处理,而不管最初的输入大小是否相同(如图5所示)。
4. 可能会导致欠拟合
我们可以将CNN看作是一种全连接神经网络,只是该网络使用了无限强的先验。卷积和池化都可以看作是对网络增加了一个无限强的先验。卷积相当于对该层的参数引入了一个无限强的先验,该先验要求除了某一小的接受域内,其余位置的权重均为0,且对于不同输出,其接受域内的参数相同,即具有局部连接关系并对平移具有等变性。而池化相当于对模型引入了另一个无限强的先验,即输出单元必须具有对少量平移的不变性。
显而易见,只有当先验的假设合理且正确时,卷积和池化才有用;否则,会导致欠拟合。例如,如果一项任务依赖于保存精确的空间信息,那么在所有的特征上使用池化将会增大训练误差。