复述一遍主要过程
暂退法(dropout)
- 手动定义dropout_layer(X, dropout)函数。输入为X, dropout=0.6表示有0.6的概率会被丢弃,其余元素除以0.4。
- 以class的形式,将该函数写入forward里,并用self.training参数控制是否dropout。
- 与往常一样,定义dataloader,loss, ,optimizer,对网络net里的权重进行优化。
- 简洁实现即直接堆叠nn.Sequential(),在里面堆nn.Dropout(dropout).
小细节
在 PyTorch 中,self.training 是一个布尔属性,用于指示当前模型是否处于训练模式。这是 torch.nn.Module 类的一部分。这个属性在模型的前向传播方法中经常被用来区分训练和评估模式,从而执行不同的操作(例如,启用或禁用 dropout、batch normalization 等)。
self.training 的变化
当你调用 model.train() 时,self.training 被设置为 True,表示模型处于训练模式。
当你调用 model.eval() 时,self.training 被设置为 False,表示模型处于评估模式。
所以dropout的类定义实现里的forward函数,通过控制它的值,来控制训练和评估时的数据流动。
小结
- 暂退法在前向传播过程中,计算每一内部层的同时丢弃一些神经元。
- 暂退法可以避免过拟合,它通常与控制权重向量的维数和大小结合使用的。
- 暂退法将活性值 h h h替换为具有期望值 h h h的随机变量。
- 暂退法仅在训练期间使用。
练习
-
如果更改第一层和第二层的暂退法概率,会发生什么情况?具体地说,如果交换这两个层,会发生什么情况?设计一个实验来回答这些问题,定量描述该结果,并总结定性的结论。
答:一般而言,增加第一层的dropout可能会减少过拟合风险,适当调整第二层的dropout可能会影响模型的容量和性能。(瞎猜的,具体靠感觉)
可以写代码验证一下,不同的数据集可能有不一样的超参表现。
(0.5,0.2)表示第一层为0.5, 第二层dropout为0.2。
从测试集的角度来看,第一种组合更优。
-
发明另一种用于在每一层注入随机噪声的技术,该技术不同于标准的暂退法技术。尝试开发一种在Fashion-MNIST数据集(对于固定架构)上性能优于暂退法的方法。
答:每层加入高斯噪声训练,最后测试不用高斯噪声。(一定要用self.training参数控制)。