卷积神经网络 (convolutional neural networks, CNN, ConvNets) 是流行的深度学习技术中的一种. 和上文讨论的神经网络一样, CNN 也是由可学习的参数组成, 每一层也是进行一个线性运算和经过一个激活函数, 参数的学习也是根据 BP 算法. CNN 和神经网络的区别, CNN 的优点, 和CNN 参数的具体学习过程将在本文进行讨论.
1 训练数据
CNN 要求输入是图像, 这样可以让我们依据图像的性质对 CNN 的结构进行设计, 使得 CNN 相比一般的神经网络结构更加高效性能更好.
因此, 和线性分类器和神经网络的训练数据使用特征向量不同, CNN 的训练数据将由代表图像的张量 (tensor) 组成.
其中, X^(i) 是第 i 张图像, H × W × D 是每个图像的尺寸. 注意这里有些滥用记号: 用 W 即表示可学习的参数, 也表示图像的宽; D 即表示整个训练集, 也表示图像的深度.
2 假设函数
由于 CNN 的输入变成了张量, 因此神经网络中每一层的神经元将不再像神经网络中按一个维度排列成向量, 而是沿着三个维度 (高度, 宽度, 深度) 排列成张量. 最后一层 (第 L 层) 的神经元输出维数是 1 × 1 × K, 这将和普通神经网络一样, 是一个表示每个类分数的向量, 见图.
和普通神经网络每层都是一个全连接层 (仿射运算 +relu 非线性激活函数) 不同, CNN 在每层有 4 种选择: 卷积层 (convolutional layer, conv), 汇合层 2 (pooling layer, pool), 线性整流层 (relu), 和全连接层 (fc). 下面将分别分析每层的结构.
2.1 卷积层 (conv)
[全连接仿射的张量扩展]
上一章讨论的神经网络中, 每个神经元和上一层的所有神经元保持全连接. 假设在第 l 层, 输入是 x ∈ R^{n_{l−1}}. x 经过一个仿射运算:
这可以认为是同时有 n_l 个 w_{d_l} , b_{d_l} 作用于 x , 每个完成计算
w_d 和 x 的维度保持一致.
当输入由一维向量 x ∈ R^{n_l−1} 变成三维张量 X ∈ R^{H_l−1 ×W_l−1 ×D_l−1} 时, 若保持全连接性质, 则权值也要变为三维张量 W d ∈ R^{H_l−1 ×W_l−1 ×D_l−1 }.
在这里及后文, 为了写法上简单一些, 使用 X(i, j, d) 表示 X 中位于位置(i, j, d) 的元素.
全连接结构对图像的可扩展性并不好. 在 CIFAR-10 数据集中, 图像的大小是 32 × 32 × 3. 因此在第一层中, 每个神经元有 32 × 32 × 3 = 3072个权值, 这个参数量还可以接受. 但是对于一个相对合理的图片大小, 比如200 × 200 × 3, 每个神经元将有 200 × 200 × 3 = 120, 000 个权值. 大量的参数需要繁重的计算, 但更重要的是, 容易导致过拟合. 为了解决这个问题, 卷积层做了两个简化.
[卷积层的两个简化]
(1). 稀疏连接. 在全连接中, 每个输出 a_{d_l} 通过 W_d l (i, j, d) 和每个输入神经元 X(i, j, d) 相连. 而在图像识别中, 关键性的图像特征, 边缘, 角点等只占据了整个图像的一小部分, 图像中相距很远的两个像素之间有相互影响的可能性很小. 因此, 每个神经元 a_{d_l} 只需要和一小部分输入神经元相连, 下图是一个一维的例子.
局部连接的空间范围 F 1 × F 2 称为感受野 (receptive field), 而沿深度轴的连接数总是等于输入的深度. 也就是说, 沿高和宽轴是局部连接的, 沿深度轴是全连接的, 下图是一个三维的例子.
随着这个局部连接区域在输入张量上空间位置的变化 (沿着高轴和宽轴), 将得到一个二维的输出神经元排列, 称为激活映射 (activation map), 见下图.
每个 W_{d_l} 维度将变成 F_1 × F_2 × D_{l−1} , W_{d_l} 作用于输入神经元, 得到一个激活映射, D_l 个滤波器将得到 D_l 个激活映射. 将这 D_l 个激活映射沿着深度方向排列起来, 将得到一个输出神经元张量 A ∈ R^{H_l ×W_l ×D_l} , 见下图. 将这 D l 个滤波器 W d l 沿着第四维排列起来, 将得到一个四维的参数矩阵W ∈ R^{H_F 1 ×W_F 2 ×D_l−1 ×D_l}
(2). 共享参数. 如果一组权重可以在图像中某个区域提取出有效的表示, 那么它也能在图像的另外的区域中提取出有效的表示. 也就是说, 如果一个图案出现在图像中的某个区域, 那么它也可以出现在图像中的其他任何区域. 因此在相同激活映射上的不同位置的神经元共享相同的权重, 用于发现图像中不同位置的相同模式.
通过这两个简化, 可以大幅减少参数的数量.
[卷积]
根据上面两个假设, 第 d_l 个输出映射的 i_l , j_l 位置的神经元将是输入神经元张量和第 d l 个滤波器的卷积 (convolution) 卷积层的名字也因此得来, 每个 W_{d_l} 称为滤波器 (filter) 或核 (kernel).
写成求和的形式是
一个二维卷积的例子见图.
A 的维数 H_l × W_l × D_l 的计算方法是: D_l 是第 l 使用的滤波器个数; H_l 和 W_l 由下式计算:
[描述卷积层的四个量]
之前已经讨论过其中的两个量: 滤波器数目 D_l , 和滤波器的感受野 F_1 × F_2 . 还有两个量将在这里讨论.
步幅 (stride)S 表示在一个激活映射中, 在空间上, 每跳过 S 个位置计算一个输出神经元, 见图. 因此, 大的 S 可以使输出映射的尺寸变小.
可以看出, 式5.10是 S = 1 的特殊情况.
0-填充 (zero-padding)P . 有时在输入进行卷积之前, 我们会在输入的四周填充一些 0, 高和宽分别填充的大小是 P 1 , P 2 . 通过 0-填充, 可以使我们控制输出特征映射的大小.
当考虑到步幅和 0-填充后, 输出 A 宽和高的计算方法有所变化.
当 S = 1 时, 通过设定
将保证
2.2 汇合层 (pool)
汇合层根据神经元空间上的局部统计信息进行采样, 在保留有用信息的同时减少神经元的空间大小, 进一步使参数量减少并降低过拟合的可能.
pool 操作在各深度分量上独立进行, 常用的是最大汇合 (max-pooling).
常用的是每个滤波器的大小是 2 × 2, 步幅 S = 2, 在每个局部空间采用 max 操作, 舍弃 75% 的信息, 见图.
2.3 线性整流层 (relu)
和在普通神经网络中 relu 操作相同, 线性整流层是逐元素的进行 relu 操作, 不会改变维度.
2.4 全连接层 (fc)
和在普通神经网络中全连接操作相同, 每个输出神经元和所有的输入神经元保持连接, 在此不再赘述.
3 损失函数
损失函数和普通神经网络中损失函数相同, 只不过
中 h 是由多个卷积层, 汇合层, relu 层, 和全连接层组合而成的.
4 优化
和普通神经网络中优化过程相同, 都是基于 BP 算法的梯度下降规则. 因此问题的关键是对四种不同结构如何计算出对参数和对上一层神经元的导数. 由于 relu 层和全连接层的计算方法和上文中相同, 因此下面将介绍卷积层和汇合层的反向传播操作.
4.1 卷积层的反向传播
卷积层完成的操作是
假设已知, 需要计算和用于更新参数, 用于将误差向上一层传播.
注意到, 卷积操作的反向传播还是卷积操作, 只不过需要将滤波器空间翻转.
4.2 汇合层的反向传播
汇合层没有参数, 不需要进行参数更新, 因此汇合层在反向传播时需要完成的工作是将第 l 层的导数传播到第 l − 1 层.
首先讨论 max 操作在反向传播中的作用. 考虑一个简单的运算
假设我们知道了, 要计算和.
直观上讲, max 操作就像是导数的路由. 它会把导数保持不变地只传给一个输入, 这个输入是所有输入变量中最大的一个, 其他输入变量得到的导数为 0.
汇合层前向传播是
在前向传播时, 需要记录下每个 F 1 × F 2 局部区域最大值所对应的索引. 反向传播时, 直接将第 l 层导数传播到这些索引位置, 第 l − 1 层其他位置导数置 0 即可. 因此, 汇合层的反向传播操作会十分高效.
5 预测和评估 CNN 的预测和评估方法和上一章讨论的神经网络的预测和评估方法相同, 在此不再赘述.