Skip to content

Dropout 究竟是如何工作的?

How Dropout Actually Works?

前阵子,我受一家科技初创公司邀请去主持他们的机器学习面试。我面试了 12 位候选人,主要问了一些实操性的机器学习问题。不过也有一些概念性的问题,比如下面这个,我有意地问到了每一位候选人:Dropout 是如何工作的?很简单,对吧?显然,每位候选人给我的回答都不完整,我将在下面提到:

简而言之,其思想是在神经网络(neural network)中随机将神经元置零。这样做是为了对网络进行正则化(regularization)。

ds p57 1

Dropout 只在训练期间应用,而哪些神经元激活值要被置零(或丢弃)则由伯努利分布来决定:

ds p57 2

“p” 是 dropout 概率,比如在 PyTorch 中通过 nn.Dropout(p) 来指定。

但是,你是否真正理解 dropout 背后的整体逻辑呢?等等——不,这还不是 dropout 的全部,所以请继续往下读。

当然,我并不是说上面的细节是错误的。它们是正确的。然而,这仅仅是 Dropout 工作原理的 50%,令人遗憾的是,大多数资料并没有涵盖剩下的 50%。如果你也只了解我上面提到的这 50% 的内容,请继续往下读。

首先,我们必须注意到 Dropout 只在训练期间应用,而在推理/评估阶段并不应用:

ds p58 1

现在,假设某个神经元的输入是由前一个隐藏层(hidden layer)中的 100 个神经元计算得到的:

ds p58 2

为了简单起见,我们在这里做几个假设:

  • 每个黄色神经元的激活值为 1。
  • 从黄色神经元到蓝色神经元的边权重也是 1。
  • 因此,蓝色神经元接收到的输入将是 100,如下图所示:
  • 现在,在训练期间,如果我们使用 Dropout,比如 40% 的 dropout 率,那么大约 40% 的黄色神经元激活值会被置零。因此,蓝色神经元接收到的输入大约会是 60:

ds p59 1

ds p59 2

ds p59 3

然而,上述情况只对训练阶段成立。如果同样的情形出现在推理阶段,那么蓝色神经元接收到的输入就会是 100。因此,在相似条件下:

  • 训练期间接收到的输入 → 60。
  • 推理期间接收到的输入 → 100。

你看出这里有什么问题了吗?在训练期间,神经元的平均输入明显低于推理期间接收到的输入。

ds p60 1

更正式地说,使用 Dropout 会显著影响激活值的尺度。然而,我们希望整个模型中的神经元在训练和推理期间接收到大致相同的激活值均值(或期望值)。为了解决这个问题,Dropout 还会执行一个额外的步骤。其思想是在训练期间对剩余的活跃输入进行缩放。最简单的方法是在训练期间将所有激活值乘以一个因子 1/(1-p),其中 p 是 dropout 率。例如,对为 60 的神经元输入使用这一技术,我们得到如下结果(回想一下我们设 p=40%):

ds p60 2

如上图所示,对神经元输入进行缩放将其带到期望的范围内,这使得训练和推理阶段对网络而言保持一致。

事实上,我们可以验证,典型的 Dropout 实现(例如来自 PyTorch 的)确实执行了这一步骤。让我们如下定义一个 dropout 层:

ds p61 1

现在,我们考虑一个随机张量,并对它应用这个 dropout 层:

ds p61 2

如上图所示,保留下来的值变大了。

  • 第二个值从 0.13 变为 0.16。
  • 第三个值从 0.93 变为 1.16。
  • 以此类推……

更重要的是,保留下来的值与我们显式地用 1/(1-p) 对输入张量进行缩放所得到的结果完全相同:

ds p62 1

如果我们在评估模式下做同样的事情,我们会注意到没有任何值被丢弃,也没有进行任何缩放,这是合理的,因为 Dropout 只在训练期间使用:

ds p62 2

这就是剩下的 50% 的内容,根据我的经验,大多数资料都没有涉及,因此大多数人也不了解。但这是 Dropout 中非常重要的一步,它在训练和推理阶段之间维持了数值上的一致性。至此,你已经 100% 了解了 Dropout 的工作原理。接下来,让我们讨论一下 Dropout 在卷积神经网络(CNN)中存在的一个问题。

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