深度学习之几种防止过拟合的方法

防止过拟合的方法主要有:

  1. 正则化
  2. dropout
  3. 增加训练数据
  4. 提前停止训练过程

1. 正则化

正则化是在损失函数中加入一个额外项,使得在反向传播时能够达到权重衰减的目的。常见的正则化包括L1正则化L2正则化,又称为L1 和L2范数
常规的损失函数: J(w,b)=1/mL(y^y)J(w,b)=1/m∑L(y^−y)
加入L1范数: Jl(w,b)=J(w,b)+λmnxi=1wi)Jl(w,b)=J(w,b)+λm∑i=1nxwi)
加入L2范数: Jl(w,b)=J(w,b)+λ2mnxi=1(wi)Jl(w,b)=J(w,b)+λ2m∑i=1nx(wi)

2. dropout

对网络中的每一层,设置消除概率,随机消除当中的某些网络节点,简化模型。比如下图,中间层虚线表示的神经元在传播时不传入参数,即把它当做不存在,只选择其中某一部分进行传递。
这个方法只用于训练模型,但是无法完成反向传播的调试,因为每次随机删除的节点不一样,因此不能计算J。

dropout

3. 增加训练数据

模型容易发生过拟合,有时是因为数据太少,拟合得到的结果学的过于详细,比如如果训练数据中给模型很多树叶,但这种树叶都是绿色的,那在测试的时候,如果输入一片黄色的树叶就会发生错误,让机器误以为树叶全是绿色的。此时,我们需要增加更多的训练数据,可以对数据进行旋转,变形,改变颜色等等。

4.提前终止训练

在训练过度前停止训练。通常在训练时,训练的损失函数值会越来越小,但在验证级中,损失函数会在减小到一定程度后增大,而这个时候我们设置的训练停止条件还没有达到,因此会继续学习,得到了结果就是训练的损失函数很小,但验证时的损失函数不是最小值,就像下图这样:选择在转折点处停止训练过程。提前停止训练

5.从偏差和方差觉得应该怎样调节参数

偏差方差调优过程

在训练模型时,我们都会根据偏差和方差进行调优,决定下一步做什么。
像上面这幅图表示的:

  • 测试结果如果偏差高,则是欠拟合,应该用一个更大的神经网络进行训练或者认为的选择更为重要的特征进行训练;
  • 否则判断,如果是方差高,则说明发生了过拟合,这个时候就可以用我上面提到的防止过拟合的方法进行训练
  • 重复以上两个步骤,知道得到了一个比较满意的偏差和方差
### 深度学习中的过拟合原因 在深度学习中,过拟合通常发生在模型过于复杂的情况下,即当模型参数过多而训练样本数量相对较少时。此时,模型可能会记住训练数据的具体特征而非其潜在规律,导致在测试集上的性能显著下降[^1]。 具体来说,权重较大的情况更容易引发过拟合现象。这是因为大权重往往意味着模型对某些输入变量赋予了过高的重要性,从而使模型倾向于捕捉噪声而不是真实的数据分布模式[^3]。 --- ### 过拟合的解决方法 #### 1. **正则化** 正则化是一种有效的手段来缓解过拟合问题。它通过向损失函数添加额外的惩罚项,限制模型参数的大小,从而避免模型变得过于复杂。常见的正则化形式有 L2 和 L1 正则化: - **L2 正则化**:也称为 Ridge 回归,在损失函数中增加了一个与权重平方成比例的惩罚项。这种方法能够有效地减小权重值,降低模型复杂度并提升泛化能力。 - **效果分析**:尽管正则化有助于改善大多数场景下的过拟合问题,但在特定条件下也可能适得其反,表现为训练结果不如未应用正则化的版本好[^2]。 以下是 PyTorch 中实现带 L2 正则化的简单代码示例: ```python import torch.nn as nn import torch.optim as optim model = YourModel() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=0.001) # 设置weight_decay作为L2正则化系数 ``` --- #### 2. **Dropout** Dropout 是另一种广泛使用的防止过拟合的技术。它的基本思想是在每次前向传播过程中随机丢弃一部分神经元(将其输出置零),以此强制网络学会冗余表示,增强鲁棒性[^4]。 PyTorch 提供了内置模块 `nn.Dropout` 来轻松实现 Dropout 功能: ```python class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(784, 500) self.dropout = nn.Dropout(p=0.5) # p 表示被丢弃的概率 self.fc2 = nn.Linear(500, 10) def forward(self, x): x = F.relu(self.fc1(x)) x = self.dropout(x) # 应用dropout层 x = self.fc2(x) return x ``` --- #### 3. **Batch Normalization (BN)** 批量标准化不仅加速收敛还能间接起到一定的抗过拟合作用。通过规范化每一层输入数据的均值和方差,减少了内部协变量偏移的影响,进而简化优化过程。 --- ### 总结 综合以上几种技术可以看出,它们各自从不同角度出发应对过拟合挑战——无论是直接约束模型结构还是调整梯度更新策略。然而需要注意的是,任何单一措施都不足以完全消除这一风险;实际操作中常常需要结合多种方式共同发挥作用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值