Skip to content

Dropout 在卷积神经网络(CNN)中的问题

Issues with Dropout in CNNs

在训练神经网络(neural network)时,通常建议使用 Dropout 来提升其泛化(generalization)能力。

ds p63 1

这不仅适用于卷积神经网络(CNN),也适用于所有其他神经网络。而且我相信你已经了解上述内容,所以让我们进入有趣的部分。

使 CNN 如此强大的核心操作是卷积,它允许网络捕捉局部模式(如边缘和纹理),并帮助从输入中提取相关信息。从纯数学的角度来看,我们在输入(如下方绿色所示)上滑动一个滤波器(如下方黄色所示),并计算滤波器与重叠输入之间的逐元素之和,从而得到卷积输出:

ds p63 2

在这里,如果我们应用传统的 Dropout,输入特征(feature)看起来会是这样:

ds p64 1

在全连接层中,我们将神经元置零。然而在 CNN 中,我们在卷积之前随机将像素值置零,如上图所示。但人们发现这对卷积层来说并不是很有效。为了理解这一点,假设我们有一些图像数据。在每张图像中,我们会发现相邻的特征(或像素)在空间上高度相关。例如,想象放大到数字“9”的像素级别。在这里,我们会注意到红色像素(或特征)与其周围的其他特征高度相关:

ds p64 2

因此,使用 Dropout 丢弃红色特征很可能不会产生任何影响,它的信息仍然可以被传递到下一层。简而言之,卷积操作的本质使传统 Dropout 流程的整个目的落空。

DropBlock 是一种更好、更有效且更直观地正则化(regularization)CNN 的方法。DropBlock 的核心思想是丢弃一块连续的特征(或像素)区域,而不是单个像素。如下图所示:

ds p65 1

类似于在全连接层中使用 Dropout 时,网络会在缺少某些激活值的情况下尝试生成更鲁棒的方式来拟合数据;在 DropBlock 的情形中,卷积层尽管缺少一整块特征,也能变得更鲁棒地拟合数据。此外,DropBlock 的思想在直觉上也合理——如果一块连续的特征区域被丢弃,就可以避免在卷积操作中使用 Dropout 所带来的问题。

DropBlock 有两个主要参数:

ds p65 2

  • block_size:要丢弃的方块的大小。
  • drop_rate:中心像素的丢弃概率。

要应用 DropBlock,首先我们在输入上创建一个从伯努利分布中采样得到的二值掩码:

ds p66 1

接下来,我们创建一个大小为 block_size*block_size 的方块,并将采样的像素放在中心:

ds p66 2

从下面的结果表可以明显看出 DropBlock 相对于 Dropout 的效果:

ds p66 3

在 ImageNet 分类数据集上:

  • DropBlock 相比 Dropout 提升了 1.33%。
  • DropBlock 结合标签平滑(label smoothing)(在上一章讨论过)相比 Dropout 提升了 1.55%。

庆幸的是,DropBlock 也已经集成到 PyTorch 中。还有一个 DropBlock 库,叫做“dropblock”,它还为 drop_rate 提供了线性调度器。事情是这样的,提出 DropBlock 的研究人员发现,当 drop_rate 逐步增大时,该技术会更加有效。

ds p67 1

DropBlock 库实现了这个调度器。但当然,在 PyTorch 中也有办法做到这一点。所以完全由你来决定使用哪种实现:

本站内容仅供学习交流,版权归原作者所有。