问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Dropout在训练阶段和测试阶段的工作原理详解

创作时间:
作者:
@小白创作中心

Dropout在训练阶段和测试阶段的工作原理详解

引用
CSDN
1.
https://blog.csdn.net/m0_67708072/article/details/138686511

Dropout是深度学习中常用的一种正则化技术,用于防止模型过拟合。本文将详细介绍dropout在训练阶段和测试阶段的工作原理,并通过PyTorch代码示例展示其具体实现。

训练阶段

在训练阶段,dropout会随机地以概率$p$将输入的某些元素置为0,以模拟神经元的随机失活。具体来说,在前向传播过程中,对于输入的每个数,dropout模块会以概率$p$将其置为0,如果该数未被置0,则将其乘以$\frac{1}{1-p}$作为输出。反向传播阶段,即求导数阶段,dropout的行为如下图所示:

下面通过代码验证一下dropout的工作原理。

前向过程

首先,我们创建一个dropout层,设置丢弃概率$p=0.3$:

dp = torch.nn.Dropout(0.3)

创建一个包含3个随机数的张量:

torch.manual_seed(10)
x = torch.randn(3, requires_grad=True)
x

输出结果为:

tensor([-1.2277, 0.9198, -0.3485], requires_grad=True)

通过dropout层处理:

y = dp(x)
y

输出结果为:

tensor([-1.7538, 1.3140, -0.0000], grad_fn=<MulBackward0>)

可以看出,第三个数被置为0。以第一个数为例,它未被置为0,输出是输入的$\frac{1}{1-p}$倍:

-1.2277 * (1 / (1 - 0.3))

计算结果为:

-1.753857142857143

这与实际输出-1.7538相符。

反向传播,即求导

反向传播过程也分为两种情况:

  1. 如果前向输出被置为0,则输出$y$对输入$x$的导数为0;
  2. 否则,输出$y$对输入$x$的导数为$\frac{1}{1-p}$。

通过代码验证:

y.sum().backward()  # 求导
x.grad

输出结果为:

tensor([1.4286, 1.4286, 0.0000])

这表明第三个数的导数为0,而其他两个数的导数为$\frac{1}{1-0.3}=1.4285714285714286$。

另一种验证方式:

y = dp(x)  # y三维向量
y.backward(torch.tensor([1.0, 1.0, 1.0]))
x.grad

输出结果同样为:

tensor([1.4286, 1.4286, 0.0000])

测试阶段

在测试阶段,dropout相当于被关闭,经过dropout层得到的输出等于输入。例如:

dp.eval()  # 测试阶段
y = dp(x)
y

输出结果为:

tensor([-1.2277, 0.9198, -0.3485], requires_grad=True)

验证输入输出是否相等:

y == x

输出结果为:

tensor([True, True, True])

这表明在测试阶段,dropout层不会对输入进行任何修改。

训练阶段和测试阶段的切换

一个模型默认处于训练模式。可以通过以下方式切换模型的训练和测试模式:

dp = torch.nn.Dropout(0.3)
dp.training  # 是否是训练模式

输出结果为:

True

切换到测试模式:

dp.eval()
dp.training

输出结果为:

False

切换回训练模式:

dp.train()
dp.training

输出结果为:

True

通过这种方式,可以灵活地控制模型在不同阶段的行为。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号