前言
在大众的普遍认知里面我们都知道DROPOUT是一种正则化方法,通过在训练过程中以一定的概率随机地将神经元的输出设置为0来防止过拟合。这是早在2012年Hinton等人提出的观点且到现在为止的确经受住了各类实验的验证。今年的顶刊《Dropout Reduces Underfitting》中提出了Dropout层居然可以解决欠拟合问题。
精要概括
在神经网络训练中只是在训练的初始阶段使用 Dropout,训练一段时间之后不用了。这与没有 全程Dropout 的模型和未这样使用Dropout相比,训练初阶段使用Dropout模型的最终训练损失更低。作者也在很多模型中证明了这样可以解决模型欠拟合问题的,这种手段命名为Early Dropout。
基础回顾
在神经网络训练过程中欠拟合和过拟合是较为常遇见的两大类问题,在这里先做个基础回顾,温故而知新。
过拟合
在深度学习中,过拟合(overfitting)是指模型过度适应训练数据,导致在新的数据上表现不佳。也就是说,模型在训练集上的表现非常好,但是在测试集上的表现却很差。过拟合的原因通常是由于模型的容量过大,模型可以学习到训练数据中的噪声和随机性,从而导致模型对于训练数据过度拟合。过拟合还可能由于训练数据过少、噪声较多、特征工程不足等原因导致。过拟合会导致模型无法泛化到新的数据上,丧失了模型的实用价值。
在模型训练过程中,可以通过监控训练集和测试集的误差来判断模型是否出现了过拟合。如果模型在训练集上的误差持续下降,但在测试集上的误差反而开始上升,就说明模型出现了过拟合问题,需要及时采取相应的措施来解决。
欠拟合
在深度学习中,欠拟合(underfitting)是指模型无法充分拟合训练数据的特征,表现为模型在训练集和测试集上的误差都很大,不能很好地捕捉到数据的规律。也就是说,模型的表现能力过低,不能很好地适应数据;欠拟合的原因可能是模型的复杂度过低,模型无法拟合数据的复杂特征。欠拟合还可能由于训练数据过少、特征工程不足等原因导致。欠拟合会导致模型的预测能力很差,无法有效地利用训练数据,丧失了模型的实用价值。
在模型训练过程中,可以通过监控训练集和测试集的误差来判断模型是否出现了欠拟合。如果模型在训练集和测试集上的误差都很大,无法有效地适应数据,就说明模型出现了欠拟合问题,需要及时采取相应的措施来解决。
Dropout解决过拟合
Dropout是一种用于深度神经网络的正则化技术,可以有效地防止过拟合。Dropout的原理是在训练过程中随机地关闭一些神经元,从而减少模型中神经元之间的相互依赖,强制模型学习更加鲁棒和通用的特征。具体来说,Dropout在每一次训练迭代中以一定的概率随机地关闭神经元,这样相当于对每个神经元都添加了一个二元的掩码(0或1),如果掩码为0则表示该神经元被关闭了,不参与该次迭代的计算。这个概率一般是在0.2到0.5之间。
在测试时,Dropout则不再随机关闭神经元,而是保留所有的神经元,并且将每个神经元的输出乘以保留该神经元的概率,以保持网络的期望输出值不变。这个过程相当于对每个神经元的输出进行了加权平均,可以视作是集成了许多不同的子模型,从而使得模型更加稳健和泛化能力更强。
因此,Dropout在训练过程中可以避免过拟合的问题,提高模型的泛化能力,同时可以加速训练,避免神经元之间的相互适应和共适应。
python
复制代码
def dropout_layer(X, dropout): assert 0 <= dropout <= 1 # 在本情况中,所有元素都被丢弃 if dropout == 1: return torch.zeros_like(X) # 在本情况中,所有元素都被保留 if dropout == 0: return X mask = (torch.rand(X.shape) > dropout).float() return mask * X / (1.0 - dropout)
Dropout解决欠拟合
从精要概括中我们可得到Early Dropout的工作机制,那么我们分别从下述的几个角度来分析Dropout解决欠拟合的原因。
- 梯度的幅值
- 模型距离
- 梯度方向方差
- 梯度方向误差
- 偏差与方差权衡
上述的原因理论解释方面大家可详见博客前面的论文地址,这里我们只放实验结构图供大家参考学习。
梯度的幅值&模型距离
梯度方向方差
梯度方向误差