Dropout Layer
Dropout 层在训练期间随机将一部分激活值置零,使网络无法依赖任何单个单元,从而减少过拟合。
Dropout 层是神经网络中的一种正则化组件,它会在每个训练步骤中随机将比例为 p 的输入设为零,而在推理时保持所有值不变。由于任意单元都可能在任意步骤中失效,网络无法依赖少数特定神经元或它们之间脆弱的协同适应,因此会学习冗余特征,从而更好地泛化,并减少对训练数据的过拟合。Geoffrey Hinton 及其同事于 2012 年提出了这项技术,Srivastava、Hinton 等人于 2014 年对其进行了完整阐述。它是 PyTorch、TensorFlow及大多数其他深度学习框架的内置层,适用于从全连接分类器头到 Transformer的各种架构。
Dropout 的工作原理#
训练期间,该层会在每次前向传播时采样一个新的随机掩码,以 1 − p 的概率保留每个元素,以 p 的概率将其置零。因此,每个步骤都会训练一个不同的精简子网络,而测试时使用的完整网络则近似于对指数级数量、共享权重的子网络求平均;这就是为什么 dropout 常被称为廉价的集成训练。为了让两个阶段的预期激活值保持一致,现代框架使用反向 dropout:训练时将保留值乘以 1 / (1 − p),这样推理时该层就无需执行任何操作。在 PyTorch 中,nn.Dropout会根据模块的训练或评估模式运行:
import torch
from torch import nn
torch.manual_seed(0)
dropout = nn.Dropout(p=0.5)
x = torch.ones(10)
# 训练模式:大约一半的值会被置零,其余值缩放为 1 / (1 - p) = 2
dropout.train()
print("Train:", dropout(x))
# 评估模式:该层保持所有值不变
dropout.eval()
print("Eval: ", dropout(x))训练模式下,十个值中有六个被丢弃,其余四个变为 2.0,使期望值保持在 1.0;评估模式下,十个值都保持为 1.0。
常见的 Dropout 变体#
- 空间 Dropout:PyTorch 的
nn.Dropout2d会将整个特征图通道置零,这适用于卷积网络,因为同一通道中相邻像素高度相关,单独丢弃像素几乎无法起到正则化作用。 - 随机深度 (DropPath):它不会随机丢弃单个激活值,而是针对每个样本随机跳过整个残差分支,这是训练视觉 Transformer 和现代 CNN 的常用方法。
- 蒙特卡洛 Dropout:推理时保持 Dropout 启用状态,并让模型对同一个输入执行多次前向传播。预测结果的离散程度可为安全关键型系统低成本地估算模型不确定性;Gal 和 Ghahramani 将这种方法解释为近似贝叶斯推断。
- DropConnect:随机将单个权重置零,而不是激活值,并为每个连接生成独立的掩码。
实践中的 Dropout#
Dropout 比率的调优方式与其他超参数相同。Srivastava 等人发现,在各种网络和任务中,以 0.5 的概率丢弃隐藏单元效果良好,而输入单元最好以接近 1 的概率保留;最初的 Transformer 使用 p = 0.1。比率过高会减慢收敛并导致欠拟合,而在批归一化之前直接使用 dropout,则可能因训练与测试阶段的方差偏移而降低准确率。许多卷积神经网络主要依赖批归一化、数据增强和权重衰减,只在分类器头中使用 dropout。Ultralytics YOLO26 分类模型也采用这一模式:模型中只有一个 dropout 层,位于池化后的 1,280 通道特征与最终线性分类器之间,其比率由 dropout 训练参数设置(默认为 0.0)。
from ultralytics import YOLO
# 加载一个 YOLO26 分类模型,其分类头中包含 dropout 层
model = YOLO("yolo26n-cls.pt")
# 在较小的 MNIST 子集上训练,并在分类头中使用 10% 的 dropout
results = model.train(data="mnist160", epochs=10, imgsz=64, dropout=0.1)实际应用#
- 医学图像分析:带标签的扫描图像获取成本很高,因此诊断分类器通常会从预训练主干网络出发,使用几千张图像进行微调。分类器头中的 Dropout 可减少模型头在如此小的数据集上对个别病例的记忆。
- 自然语言处理:在预训练和微调期间,BERT 等 Transformer 编码器会在包括注意力权重在内的所有层中,以 0.1 的概率应用 dropout。










