Dropout 正则化模拟器 返回
机器学习

Dropout 正则化模拟器

一个用来体验神经网络 Dropout 正则化、防止过拟合的交互式工具。改变保留概率 p 和层神经元数,可以实时看到随机消失的神经元掩码、保留数的二项分布、1/p 缩放,以及隐含训练的子网络总数 2ⁿ。

参数设置
层神经元数 n
这一层中神经元(单元)的总数
保留概率 p
每个神经元「保留」的概率。1−p 是丢弃的概率
随机数种子 seed
生成掩码的伪随机数种子。确定性重现
平均活性值 a
每个神经元激活输出的大致幅度
计算结果
保留神经元数
丢弃数
缩放系数 1/p
期望活跃数
子网络总数
输出缩放比
Dropout 掩码——子网络动画

层的神经元以网格形式显示。点亮的神经元是保留的,灰色的 × 标记是本次被丢弃的。掩码约每 1.5 秒重新抽样一次,每次显示不同的子网络。

保留神经元数的概率分布(二项分布)
期望活跃数 vs 保留概率 p
理论·主要公式

$$\text{(训练时)}\quad y_i=\frac{m_i}{p}\,a_i,\qquad m_i\sim\text{Bernoulli}(p)$$

训练时,每个神经元 i 以概率 p 保留($m_i=1$),概率 $1-p$ 被丢弃($m_i=0$)。保留的活性 $a_i$ 被缩放 1/p 倍。这就是逆 Dropout(inverted dropout),推理时不需要掩码或缩放,可以直接使用网络。

$$P(k)=\binom{n}{k}p^{k}(1-p)^{n-k},\qquad \mathbb{E}[k]=np$$

n 个神经元中恰好 k 个保留的概率遵循二项分布,保留数的期望值是 np。输出期望值 $\mathbb{E}[\sum m_i a_i / p]=\sum a_i$,与 Dropout 前一致。

$$N_{\text{sub}}=2^{n},\qquad \log_{10}N_{\text{sub}}=n\log_{10}2$$

每个神经元都有「保留/丢弃」两种状态,因此可能的子网络共 $2^{n}$ 种。Dropout 隐式地同时训练这指数级数量的细小网络。

Dropout 正则化是什么

🙋
Dropout 是在学习过程中故意关闭神经元,对吧?好不容易训练出来的部件反而要丢弃,这不是浪费吗?
🎓
想法很自然,但更准确的描述是「临时关闭」而不是「丢弃」。每个小批次中,我们用概率 1−p 随机关闭每个神经元。下一个批次时又是另一批神经元休息。把左边的保留概率 p 设为 0.5,意思是每次大约一半的神经元是关闭的。上面的画布里你能看到,点亮的和灰色的 × 标记每 1.5 秒互换一次,这就是「每次用不同的子网络学习」。
🙋
故意打乱网络结构,反而能提高性能?这太违反直觉了……
🎓
这正是 Dropout 有趣的地方。如果不关闭任何神经元,神经元之间会开始「分工合作」——这个神经元负责特征 A,那个神经元负责特征 B 的验证,彼此依赖,这叫「共适应(co-adaptation)」。就像一个团队配合得太默契了,队员离开了就无法工作。Dropout 制造了「不知道邻座什么时候会离开」的局面,所以每个神经元都被迫学习单独也能用的特征。结果就是——虽然训练数据表现不如没有 Dropout,但新数据的表现更好。
🙋
那关闭了一半的神经元,从层里出来的信号不会变弱吗?
🎓
说得对。p=0.5 时总和确实变成了大约一半。所以我们用 1/p 缩放来补偿——保留下来的神经元输出乘以 1/p,也就是 p=0.5 时乘以 2。左边看「缩放系数 1/p」和「输出缩放比」,每次换种子时缩放比都在 1 附近波动,但平均总是 1。这样层输出的期望值就保持不变,推理时完全不需要掩码或缩放,直接用网络就可以。这种做法叫逆 Dropout(inverted dropout),现在所有主流框架都用这个方式。
🙋
「子网络总数」显示≈10⁶,这是什么意思?
🎓
n=20 个神经元,每个都有「保留/丢弃」两种选择,所以掩码的组合共 2²⁰ ≈ 100 万种。n 增到 64 时就变成约 1.8×10¹⁹ 种,是个天文数字。每个小批次只训练其中一个子网络,但权重在所有子网络中共享。换个角度看,Dropout 就是在同时训练指数级数量的细小网络,推理时取它们的平均近似值——这跟随机森林训练多棵树再平均的思想是一样的,只不过是在一个网络内部实现。
🙋
那是不是 p 越小越好?关闭得越多就是正则化越强?
🎓
没这么简单,这是个权衡。p 设太小,每次就剩下很少的神经元,网络的学习容量本身不足,反而容易欠拟合。反过来 p=1.0 就是完全关闭 Dropout,没有正则化效果。实践中的经验法则是:全连接隐层用 p=0.5,靠近输入层的部分为了保留更多信息用 p=0.8~0.9。下面「期望活跃数 vs p」的图表会直观地显示,改变 p 时保留数如何线性变化。

常见问题

Dropout 在训练的每一步以 1−p 的概率随机关闭神经元,使网络无法依赖特定神经元。当某个神经元不能假设其他神经元一定存在时,它就无法和其他神经元进行「共适应」的工作分工。结果是每个神经元都被迫学习单独也有意义的特征。这类似于训练许多细小子网络并对结果取平均的集成学习,从而改善泛化性能并抑制过拟合。
当 Dropout 关闭一些神经元后,层的输出总和平均会减少到原来的 p 倍。逆 Dropout 在训练时将保留的神经元活性缩放 1/p 倍,来抵消这种减少,使层输出的期望值保持不变。这样推理时就完全不需要掩码或缩放,可以直接使用网络。现在所有主流深度学习框架都采用了这种逆 Dropout 方式。
有 n 个神经元的层中,每个神经元都有「保留/丢弃」两种状态,所以可能的掩码组合共 2ⁿ 种。n=20 时约 100 万种,n=64 时约 1.8×10¹⁹ 种。每个小批次只训练其中一个子网络,但权重在所有子网络中共享,因此 Dropout 相当于隐式地同时训练指数级数量的网络,推理时近似取它们的平均。
全连接隐层通常用 p=0.5(丢弃一半),这是 Hinton 等人原论文的标准值。靠近输入层的部分为了不丢失太多信息,通常用 p=0.8~0.9。卷积层由于权重共享和参数相对较少,本身不易过拟合,通常弱化或不使用 Dropout,有时用空间 Dropout(SpatialDropout)按块丢弃。p=1.0 表示完全关闭 Dropout。

实际应用

CNN 图像分类器:在 VGG 或 AlexNet 这样的卷积网络中,最后的全连接层(分类头)通常用 p=0.5 的 Dropout。卷积层参数较少不易过拟合,但全连接层可能有数千万参数容易过拟合。在全连接层集中使用 Dropout,能在 ImageNet 这样的大规模数据集上保持良好泛化。卷积层常用 SpatialDropout 而非标准 Dropout,它按空间关联的像素块来丢弃。

自然语言处理与 Transformer:BERT、GPT 等 Transformer 模型在每个注意力层和前馈层的输出用 p=0.1 左右的适度 Dropout,同时也对注意力权重用 attention dropout。大规模语言模型虽然训练数据量大,但仍需 Dropout 来防止对特定词组共现模式的过度适应。

不确实性估计(MC Dropout):通常推理时关闭 Dropout,但如果故意保持开启,同一输入多次通过网络会产生不同输出(因为掩码不同)。这个方差可以用来估计模型的「不确定性」——蒙特卡洛 Dropout。在医疗诊断、自动驾驶等需要置信度的场景,被用作贝叶斯不确定性估计的简便近似。

小数据集学习:医学影像、工业检测、科学实验等数据仅有几百到几千条的领域,过拟合是严重问题。Dropout 加上数据增强和迁移学习,成为基础正则化手段,成本几乎为零但效果明显。当验证损失与训练损失差距增大时,增大 Dropout 率是首选对策。

常见误区与注意事项

最常见的误区是「推理时也开启 Dropout」。逆 Dropout 的 1/p 缩放发生在训练时,推理时应该完全关闭 Dropout(所有神经元保留,无缩放)。深度学习框架中的「train 模式/eval 模式」切换就是为了这个,评估前忘记切到 eval 模式的话,预测会每次不同且精度大幅下降。但如果你是想做 MC Dropout 的不确定性估计,那就是故意保持开启,这是另一回事,不要混淆。

其次是「Dropout 和 BatchNorm 随意组合」。把两者在同一层重叠使用时,Dropout 造成的随机缩放幅度和 BatchNorm 计算的小批量统计(均值、方差)会相互干扰,导致训练和推理的统计分布错位,性能下降。实际做法是:用 BatchNorm 的层就不要加 Dropout;或者把 Dropout 放在 BatchNorm 之后;或者两者之一。不要「为了安全就两个都加」。

最后是「Dropout 率越高越强」的误解。降低 p 虽然会抑制过拟合,但同时网络每次能用的容量减少,容易变成欠拟合——连训练数据都学不好。此外学习会变得不稳定,收敛更慢。Dropout 率也是超参数,需要看验证损失来调整。正确做法是:在合理范围(隐层 p≈0.5)内根据验证表现调整,而不是「发现过拟合就猛降 p」。

使用指南

  1. 用神经元数滑块(nNum)设置隐层的单元数。比如 256 个单元时,应用 Dropout 后的保留数会遵循二项分布 B(256, p)
  2. 调整保留概率滑块(pNum)到 0.3~0.9 范围,决定每个 epoch 有多少比例的神经元保留。p=0.5 时期望保留约 128 个单元
  3. 改变随机数种子(seedNum)重新生成掩码模式,在同一概率分布下比较不同的 Dropout 样式。此时 1/p 缩放系数会进行输出补偿,防止推理时的缩放不匹配

具体计算例子

假设隐层有 1024 个神经元,p=0.8,小批量大小 32,进行训练。对每个样本随机 Dropout 时,保留数的期望值是 1024×0.8=819.2。实际丢弃约 204.8 个,缩放系数 1/0.8=1.25 会乘以输出。该网络的子网络总数达 2¹⁰²⁴,有助于泛化性能提升。固定随机数种子时,掩码数组每次相同,保证可重现性

实务注意事项

  1. 图像分类(CIFAR-10)中隐层设 p=0.5 能有效遏制过拟合,但 RNN 语言模型推荐 p≥0.8。当分层设置不同 Dropout 率时,输入附近设 0.1 较低,深层隐层设 0.5 是常规做法
  2. 训练和推理生成不同的计算图,1/p 缩放有无必须在框架(TensorFlow、PyTorch)中明确指定,否则会产生缩放错位
  3. 与批量正规化配合时,把 Dropout 放在 BN 层之后,超参数探索时固定随机数种子保证可重现性