为何nn.Dropout会改变张量元素的值?技术咨询
PyTorch nn.Dropout层数值缩放问题解析
你的代码示例:
dropout = nn.Dropout(0.1) y = torch.tensor([5.0,7.0,9.0]) y = dropout(y) print(y)
输出示例:
tensor([ 5.5556, 7.7778, 10.0000])
核心原因:Dropout的反向缩放机制
PyTorch的nn.Dropout采用**反向丢弃(Inverted Dropout)**实现,这是当前主流的Dropout实现逻辑,分为两步:
- 以指定概率
p随机将部分元素置零 - 对未被置零的元素,除以
(1-p)进行缩放
你设置的丢弃概率p=0.1,对应1-p=0.9,计算后正好得到你看到的结果:
- 5.0 / 0.9 ≈ 5.5556
- 7.0 / 0.9 ≈ 7.7778
- 9.0 / 0.9 = 10.0
为什么要做缩放?
这种设计是为了保证训练和推理阶段的输出期望一致:
- 训练时,每个元素有
p的概率被丢弃,若不缩放,输出的期望会是原数值 × (1-p) - 推理阶段会关闭Dropout,所有元素都参与计算,此时输出会比训练时高
1/(1-p)倍,导致模型表现异常 - 通过反向缩放,训练时保留的元素被放大
1/(1-p)倍,让训练阶段的输出期望和原输入一致,推理时直接关闭Dropout即可,无需额外调整
关于随机置零
你多次运行偶尔出现零元素,是Dropout的随机丢弃行为导致的——每次运行时,被选中丢弃的元素位置是随机的,这也是Dropout防止模型过拟合的核心逻辑。
内容的提问来源于stack exchange,提问作者Ezra Corli
相关产品推荐
相关产品推荐

