从 Bit 到 AGI第四章:神经元(Neuron)

Dropout 是什么

从 Bit 到 AGI · 第四章:神经元(Neuron) · Dropout 是什么

作者 David更新于 第 59 篇(共 186 篇)

Dropout(2012)在训练时以概率 pp 随机把神经元输出置零,迫使网络不依赖少数「明星神经元」,等价于训练指数级规模的子网络集成。推理时关闭 Dropout(或乘以保留概率 1−p1-p),用完整网络做预测。

直觉

团队项目随机缺席一半同事——你必须学会多人协作、不能指望某一个人扛全部。每次训练 step 换一批「缺席名单」,最终全员上场时,能力更均衡、泛化更好。

定义

训练时,对层输出 h\mathbf{h}:

m∼Bernoulli(1−p),h′=m⊙h / (1−p)(inverted dropout)\mathbf{m} \sim \mathrm{Bernoulli}(1-p), \quad \mathbf{h}' = \mathbf{m} \odot \mathbf{h} \ / \ (1-p) \quad \text{(inverted dropout)}

除以 (1−p)(1-p) 保持期望不变:E[h′]=h\mathbb{E}[\mathbf{h}'] = \mathbf{h}。

推理:h′=h\mathbf{h}' = \mathbf{h}(mask 全 1)。

常见 p=0.5p = 0.5(隐藏层),输入层 p=0.2p = 0.2,输出层通常 不用 Dropout。

例子

例 1:单神经元期望

h=4h = 4,p=0.5p = 0.5:训练时 50% 为 0、50% 为 4/(1−0.5)=84/(1-0.5)=8?不对——inverted:mask 0 则 0,mask 1 则 4/0.5=84/0.5=8… 标准实现:h′=m⋅h/(1−p)h' = m \cdot h / (1-p),E[m]=1−p\mathbb{E}[m]=1-p → E[h′]=h\mathbb{E}[h'] = h。

import numpy as np

h = np.array([4.0, 4.0, 4.0, 4.0])
p = 0.5
outs = []
for _ in range(10000):
    m = (np.random.rand(4) > p).astype(float)
    outs.append((m * h / (1 - p)).mean())
print(f"E[mean(h')]={np.mean(outs):.2f}")  # ≈ 4.0

例 2:AlexNet 配置

两个 FC 隐藏层各 p=0.5 Dropout;配合 ReLU + BN 前时代数据增强,ImageNet top-5 显著提升。

例 3:与 L2 正则对比

方法机制主要作用
Dropout随机结构噪声防共适应
L2惩罚大权重权值 shrink
数据增强输入扰动扩增分布

量化

  • 训练 FLOPs:mask 几乎免费;有效宽度 (1−p)d(1-p)d,如 p=0.5,d=4096p=0.5, d=4096 → 期望 active 2048 维
  • 大模型预训练:Dropout 常 0~0.1 或不用(数据够大);微调小数据集可加大
  • Transformer:attention dropout、residual dropout 典型 0.1;GPT-3 论文 p=0.1p=0.1
  • 推理:无 Dropout → 确定性;与 MC Dropout(不确定性估计)不同

训练和推理行为不一致是设计如此。部署务必 model.eval()(PyTorch)关闭 Dropout/BN 训练模式。

常见误区

  1. 「Dropout 越高越好」——pp 过大欠拟合;0.5 非 universal。
  2. 「推理时要乘 (1-p)」——inverted dropout 训练已缩放;推理直接过网络。
  3. 「Dropout 取代大数据」——正则补充,不替代数据量。

动手试一试

import numpy as np

def dropout(h, p=0.5, training=True):
    if not training:
        return h
    mask = (np.random.rand(*h.shape) > p).astype(h.dtype)
    return h * mask / (1 - p)

h = np.ones((1000, 512))
train_out = dropout(h, p=0.5, training=True)
eval_out = dropout(h, p=0.5, training=False)
print(train_out.mean(), eval_out.mean())  # train ≈1(期望), eval=1
print((train_out == 0).mean())            # ≈0.5

DropConnect 与 Dropout 区别

DropConnect 随机置零权重而非激活;Dropout 置零神经元输出。Dropout 更常用;DropConnect 在某些 CNN 上有类似正则效果。

与 BatchNorm 的交互

早期建议 Dropout 放在 BN 之后;现代架构(ResNet、Transformer)常 BN/LN → 激活 → Dropout 或只在 attention/FFN 子层末 Dropout。两者都带噪声,同时高 rate 可能欠拟合。

MC Dropout 不确定性

推理时保持 Dropout 开启、多次采样取平均或方差,可估 epistemic uncertainty——医疗、自动驾驶等需「模型有多确定」的场景。与标准推理 eval() 关闭 Dropout 是不同模式。

历史:Hinton 的「集成」解释

Hinton 2012 原始论文将 Dropout 解释为 指数级子网络的 bagging:每次 mask 对应不同子架构,推理时用完整网络近似所有子网络的几何平均。虽不完全严格,但解释了为何 Dropout 提升泛化而非仅加噪声。

ImageNet 上 AlexNet 全连接层 Dropout 0.5 配合 ReLU,是深度学习第一次大规模公开 triumph 的配方之一——与 ReLU、数据增强 并列。

Dropout rate 怎么选

经验起点:全连接隐藏层 0.5;输入层 0.2;卷积层有时 0.1 或不用(空间相关性强,drop 整 feature map 用 DropBlock)。Transformer 0.1 是常见默认;过大导致 underfit。

Spatial Dropout:整 channel 置零,适合 CNN。 DropPath(Stochastic Depth):整残差分支随机跳过,ResNet/ ViT 训练深层时用——与 Dropout 同族「随机结构正则」。

微调小数据集时可在分类头上加大 Dropout;预训练大模型继续预训练时 often 降低或关闭 Dropout,靠数据量正则。

动手与阅读建议

建议对照 PyTorch 文档 torch.nn 模块,把本篇公式与 Linear、ReLU、LSTM、MultiheadAttention 的 forward 签名一一对应。读论文时先圈出 张量 shape(如 (B,T,d)(B, T, d))再读公式,比死记符号快得多。

若训练 loss 不降:先画 train loss 曲线(逐步、非 epoch 平均),看是震荡、plateau 还是 NaN。NaN 从 lr 减半 与 gradient clip 开始试;plateau 查 wd 是否过大 或 数据是否标错。验证集只用于 选超参,勿反复调 test。

本章内容在第五章 Transformer 会全部复现:QKV 是 Attention,FFN 是 MLP,Pre-LN 是 LayerNorm。掌握本章 = 读 GPT 论文的最低门槛。完成 MNIST 或 XOR 小实验(CPU 即可)再进入下一章,手感差异很大。

术语对照(中英)

Neuron/Unit 神经元;Activation 激活函数;Hidden layer 隐藏层;Logit 预激活 zz;Embedding 把离散 id 映射为连续向量;Epoch 全数据扫一遍;Iteration/Step 一个 batch 更新一次;Learning rate 学习率 η\eta;Weight decay 权重衰减(L2 或 AdamW);Fine-tune 微调预训练权重。读英文文档时这些词与中文教材一一对应,避免混用「单元/神经元/节点」造成概念漂移。

算力与显存(复习)

参数量 PP 个 float32 权重约占 4P4P 字节。训练显存粗估:权重 + 梯度 + 优化器状态(Adam 约 3×3\times 权重)+ 激活(与 batch、序列长度、层数成正比)。推理 mainly 权重 + KV cache(生成式 LLM)。先会估算 PP 和一次 forward 的 FLOPs,再读第九章 GPU 与第七章分布式,数字才能对齐。

下一篇链接在文末 小结 中;建议按 meta.json 顺序阅读,跳读易漏掉「RNN 消失 → LSTM → Attention」这条叙事链。遇到公式卡住,回第二章查 链式法则 与 softmax。

量化自检:本篇至少包含两个带数字的例子(参数量、FLOPs、梯度量级或准确率)。复现时请用自己的随机种子跑代码,核对数量级一致即可,不必逐位相同——浮点顺序会导致末位差异。

小结

Dropout = 训练时随机失活 + 期望保持;推理关闭。防过拟合的经典手段,与 BN、权重衰减并用。LLM 时代 rate 降低,但思想(随机深度、Stochastic Depth)仍在。

→ 下一篇:过拟合与正则化

本页目录