CNN 卷积神经网络(下):实践中的细节

使用卷积神经网络的要点

Posted by Xiaosheng on June 4, 2017

本文内容摘取自 《Deep Learning》,部分内容有修改。

1. 结构化输出

卷积神经网络可以用于输出高维的结构化对象,而不仅仅是预测分类任务的类标签或回归任务的实数值。通常这个对象只是一个张量,由标准卷积层产生。例如, 模型可以产生张量 $\mathbf{S}$,其中 $S_{i,j,k}$ 是网络的输入像素 $(j, k)$ 属于类 $i$ 的概率。这允许模型标记图像中的每个像素,并绘制沿着单个对象轮廓的精确掩模。

经常出现的一个问题是输出平面可能比输入平面要小。用于对图像中单个对象分类的常用结构中, 网络空间维数的最大减少来源于使用大步幅的池化层。为了产生与输入大小相似的输出映射,我们可以避免把池化放在一起。另一种策略是单纯地产生一张低分辨率的标签网格。最后,原则上可以使用具有单位步幅的池化操作。

对图像逐个像素标记的一种策略是先产生图像标签的原始猜测,然后使用相邻像素之间的交互来修正该原始猜测。重复这个修正步骤数次对应于在每一步使用相同的卷积,该卷积在深层网络的最后几层之间共享权重。这使得在 层之间共享参数的连续的卷积层所执行的一系列运算,形成了一种特殊的循环神经网络。下图给出了这样一个循环卷积网络的结构:

1

输入是图像张量 $\mathbf{X}$,它的轴对应图像的行、列和通道(红,绿,蓝)。目标是输出标签张量 $\hat{Y}$ ,它遵循每个像素的标签的概率分布,它的轴对应图像的行、列和不同类别。循环网络通过使用 $\hat{Y}$ 的先前估计作为创建新估计的输入,来迭代地改善其估计。每个更新的估计使用相同的参数,并且估计可以被改善任意多次。每一步使用的卷积核张量 $\mathbf{U}$,用来计算给定输入图像的隐藏表示。核张量 $\mathbf{V}$ 用于产生给定隐藏值时标签的估计。除了第一步之外,核 $\mathbf{W}$ 都对 $\hat{Y}$ 进行卷积来提供隐藏层的输入(在第一步中,此项由零代替)。因为每一步使用相同的参数,所以这是一个循环网络的例子。

一旦对每个像素都进行了预测, 就可以进一步处理这些预测, 以便获得图像在区域上的分割。一般的想法是假设大片相连的像素倾向于对应着相同的标签。 图模型可以描述相邻像素间的概率关系。或者,卷积网络可以被训练来最大化地近似图模型的训练目标。

2. 数据类型

卷积网络使用的数据通常包含多个通道,每个通道是时间上或空间中某一点的不同观测量。下表展示了具有不同维数和通道数的数据类型的例子。

  单通道 多通道
1维 音频波形:卷积的轴对应于时间。我们将时间离散化并且在每个时间点测量一次波形的振幅。 骨架动画 (skeleton animation) 数据:计算机渲染的 3D 角色动画是通过随时间调整 ‘‘骨架’’ 的姿势而生成的。在每个时间点,角色的姿势通过骨架中的每个关节的角度来描述。我们输入到卷积模型的数据的每个通道,表示一个关节关于一个轴的角度。
2维 已经使用傅立叶变换预处理过的音频数据:我们可以将音频波形变换成 2 维张量,不同的行对应不同的频率,不同的列对应不同的时间点。在时间轴上使用卷积使模型等效于在时间上移动。 在频率轴上使用卷积使得模型等效于在频率上移动,这使得在不同八度音阶中播放的相同旋律产生相同的表示,但处于网络输出中的不同高度。 彩色图像数据:其中一个通道包含红色像素,另一个包含绿色像素,最后一个包含蓝色像素。在图像的水平轴和竖直轴上移动卷积核,赋予了两个方向上平移等变性。
3维 体积数据:这种数据一般来源于医学成像技术,例如 CT 扫描等。 彩色视频数据:其中一个轴对应着时间,另一个轴对应着视频帧的高度,最后一个对应着视频帧的宽度。

卷积网络的一个优点是它们还可以处理具有可变的空间尺度的输入,而这些类型的输入不能用传统的基于矩阵乘法的神经网络来表示。例如,考虑一组图像的集合,其中每个图像具有不同的高度和宽度,目前还不清楚如何用固定大小的权重矩阵对这样的输入进行建模,而卷积就可以很直接地应用。核依据输入的大小简单地被使用不同次,并且卷积运算的输出也相应地缩放。卷积可以被视为矩阵乘法,相同的卷积核为每种大小的输入引入了一个不同大小的双重分块循环矩阵。

有时,网络的输出允许和输入一样具有可变的大小,例如如果我们想要为输入的每个像素分配一个类标签。在其他情况下,网络必须产生一些固定大小的输出,例如,如果我们想要为整个图像指定单个类标签。在这种情况下,我们必须进行一些额外的设计步骤,例如插入一个池化层,池化区域的大小要与输入的大小成比例,以便保持固定数量的池化输出。

注意,使用卷积处理可变尺寸的输入时:

  • 如果输入是因为包含对同种事物的不同量的观察 (时间上不同长度的记录,空间上不同宽度的观察等) 而导致的尺寸变化这种情况才有意义。
  • 如果输入是因为它可以选择性地包括不同种类的观察而具有可变尺寸时,使用卷积是不合理的。例如,如果我们正在处理大学申请,并且我们的特征包括成绩等级和标准化测试分数,但不是每个申请人都进行了标准化测试,则使用相同的权重来对成绩特征和测试分数特征进行卷积是没有意义的。

3. 高效的卷积算法

现代卷积网络的应用通常需要包含超过百万个单元的网络,利用并行计算资源的强大实现是很关键的,然而,在很多情况下,也可以通过选择适当的卷积算法来加速卷积。

卷积等效于使用傅立叶变换将输入与核都转换到频域、执行两个信号的逐点相乘,再使用傅立叶逆变换转换回时域。对于某些问题的规模,这种算法可能比离散卷积的朴素实现更快。

当一个 $d$ 维的核可以表示成 $d$ 个向量(每一维一个向量)的外积时,该核被称为可分离的(separable)。当核可分离时,朴素的卷积是低效的。它等价于组合 $d$ 个一维卷积,每个卷积使用这些向量中的一个。组合方法显著快于使用它们的外积来执行一个 $d$ 维的卷积。并且核也只要更少的参数来表示成向量。如果核在每一维都是 $w$ 个元素宽,那么朴素的多维卷积需要 $O(w^d )$ 的运行时间和参数存储空间,而可分离卷积只需要 $O(w \times d)$ 的运行时间和参数存储空间。当然,并不是每个卷积都可以表示成这种形式。

设计更快的执行卷积或近似卷积,而不损害模型准确性的方法,是一个活跃的研究领域。甚至仅提高前向传播效率的技术也是有用的,因为在商业环境中,通常部署网络比训练网络还要耗资源。

4. 随机或无监督的特征

通常,卷积网络训练中最昂贵的部分是学习特征。当使用梯度下降执行监督训练时,每步梯度计算需要完整地运行整个网络的前向传播和反向传播。 减少卷积网络训练成本的一种方式是使用那些不是由监督方式训练得到的特征。

输出层的计算代价通常相对不高,因为在通过若干层池化之后作为该层输入的特征的数量较少。

有三种基本策略可以不通过监督训练而得到卷积核:

  • 简单地随机初始化它们。
  • 手动设计它们,例如设置每个核在一个特定的方向或尺度来检测边缘。
  • 使用无监督的标准来学习核。例如,将 $k$ 均值聚类算法应用于小图像块,然后使用每个学得的中心作为卷积核。使用无监督的标准来学习特征,使得它们能够与位于网络结构顶层的分类层相互独立地确定。然后只需提取一次全部训练集的特征,构造用于最后一层的新训练集。假设最后一层类似逻辑回归或者 $\text{SVM}$,那么学习最后一 层通常是凸优化问题。

随机过滤器经常在卷积网络中表现得出乎意料得好。由卷积和随后的池化组成的层,当赋予随机权重时,自然地变得具有频率选择性和平移不变性。通常认为这提供了一种廉价的方法来选择卷积网络的结构:首先通过仅训练最后一层来评估几个卷积网络结构的性能,然后选择最好的结构并使用更昂贵的方法来训练整个网络。

学习特征还有一个中间方法:使用那种不需要在每个梯度计算步骤中都进行完整的前向和反向传播的方法。与多层感知机一样,我们使用贪心逐层预训练,单独训练第一层,然后一次性地从第一层提取所有特征,之后用那些特征单独训练第二层,以此类推。

卷积模型的贪心逐层预训练的经典模型是卷积深度信念网络。我们可以训练一小块模型,而非一次训练整个卷积层。然后,可以用来自这个小块模型的参数来定义卷积层的核。这意味着使用无监督学习来训练卷积网络并且在训练的过程中完全不使用卷积是可能的。使用这种方法,我们可以训练非常大的模型,并且只在推断期间产生高计算成本。

这种方法大约在 2007 到 2013 年间流行,当时标记的数据集很小,并且计算能力有限。如今,大多数卷积网络以纯粹监督的方式训练,在每次训练迭代中使用通过整个网络的完整的前向和反向传播。

与其他无监督预训练的方法一样,使用这种方法的一些好处仍然难以说清。无监督预训练可以提供一些相对于监督训练的正则化,或者它可以简单地允许我们训练更大的结构,因为它的学习规则降低了计算成本。

本文内容摘取自 《Deep Learning》,部分内容有修改。