核心要点

  • 训练时以保留概率 p 生成随机掩码,将部分神经元输出置零。

  • 采用反向 Dropout:保留的激活除以 p(乘 1/p)补偿期望,使推理无需缩放。

  • 推理时直接恒等输出,不丢弃也不缩放。

  • 易错点:缩放因子是 1/p(p 为保留概率);掩码需每次前向重新采样。

标准回答

一、先把结论讲清楚

可以先说用途:Dropout 是训练阶段用的正则化,目的是减少模型对某些神经元的依赖

一、训练阶段怎么做?

以保留概率 p 生成一个 0/1 mask,把一部分激活置零。现代实现通常用 inverted dropout,也就是保留下来的激活要除以 p,保持输出期望不变。

二、拆开机制和判断点

二、推理阶段怎么做?

推理时不再随机丢弃,也不再额外缩放,直接返回原输出。因为训练时已经做了 1/p 的补偿,所以推理可以 恒等输出

三、最容易错的点。

要说清楚 p 是“保留概率”还是“丢弃概率”。

三、补上例子、边界和取舍

如果 p 是保留概率,缩放是 1/p;如果像 PyTorch 那样 p 表示丢弃概率,缩放就是 1/(1-p)。下面用 NumPy 实现:

面试里不要只停在公式或名词,可以补 手撕代码:实现 Dropout训练与推理 对训练稳定性、泛化、收敛速度或显存/算力的影响。再说明一个常见调参或排错场景,面试官会更容易判断你真的用过这些方法。

python
import numpy as np

def dropout(x, p=0.5, training=True, rng=None):
    # p: 保留概率(keep prob)。训练随机置零并按 1/p 缩放
    if not training or p >= 1.0:
        return x                              # 推理:恒等输出
    rng = rng or np.random.default_rng(0)
    mask = (rng.random(x.shape) < p).astype(x.dtype)  # 保留位为 1
    return x * mask / p                       # 反向 Dropout:缩放 1/p

if __name__ == '__main__':
    rng = np.random.default_rng(0)
    x = np.ones((4, 5))
    y = dropout(x, p=0.5, training=True, rng=rng)
    print(y)                                   # 约一半元素为 0,其余为 2.0
    # 期望保持不变:训练输出均值 ~ 推理(全 1)的均值
    print(y.mean().round(2))                   # 接近 1.0

常见误区

⚠️ 常见踩坑

误区一:混淆 p 的含义。 题里如果 p 是保留概率,就除以 p;PyTorch 里的 p 是丢弃概率,要按 1/(1-p) 缩放。

误区二:推理阶段还在 dropout。 推理时应该关闭随机丢弃,否则输出不稳定。

追问

追问 1为什么要除以 p(反向 Dropout)?不除会怎样?

不除以 p 的话,训练时输出期望会变成推理时的 p 倍,训推尺度不一致。反向 Dropout 的好处是 把补偿放在训练阶段,推理零成本

追问 2Dropout 和 BatchNorm 一起用要注意什么?

两者都影响激活分布,叠在一起可能带来方差偏移。面试里可以说:CNN 里有 BN 后常常少用 Dropout,Transformer 里 Dropout 更多放在注意力FFN 或残差分支,比例要谨慎调。

🔗 相似问题

同一考点的不同问法,换着练更稳

延伸学习

按主题分类的相关资源,便于系统复习