深度学习过拟合

本文深入探讨深度学习中过拟合现象的本质及其危害,并详细介绍了多种有效的过拟合解决方案,包括获取更多数据、采用合适模型、Dropout、权重衰减、EarlyStopping、可变化学习率、Batch_Normalization等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是过拟合。
在深度学习中,模型对于所提供的数据进行一致性假设而使模型变得过度复杂称为过拟合。

2、过拟合的危害。
“一个过配的模型试图连误差(噪音)都去解释(而实际上噪音又不是需要解释的),导致泛化能力比较差,显然就过犹不及了。”具体表现在:深度学习的模型在提供的训练集上效果非常好,但在未经过训练集观察的测试集上,模型的效果很差,即输出的泛化能力很弱。

3、解决过拟合的方法
1)获取和使用更多的数据集
对于解决过拟合的办法就是给予足够多的数据集,让模型在更可能多的数据上尽心“观察”和拟合,从而不断修正自己。然而收集无限多的数据集似乎是不可能的,因此一个常用的办法就是调整已有的数据,添加大量的“噪音”,或者对图形进行锐化、旋转、明暗度调整等优化。
卷积神经网络在图像识别的过程中有强大的“不变性”规则,即待识别的物体在图像中的形状、姿势、位置、明暗度都不会影响分类结果。

2)采用合适的模型
目前来说,针对不同情况和分类要求,对使用的模型也是千差万别。过于简单或者过于复杂的模型都会带来过拟合问题。

3)使用Dropout
Dropout是一个非常有用和常用的方法。Dropout指的是在训练模型的过程中每次按50%的几率关闭或忽略某些层的节点。使得模型在使用同样的数据进行训练时相当于从不同的模型中随机选择一个进行训练。
Dropout起作用的原因,可以简单的理解成在训练过程中会产生不同的训练模型,不同的训练模型也会产生不同的计算结果,随着训练的不断进行,计算结果会在一个范围内波动,但是均值不会有很大变化,因此可以把最终的训练结果看作不同模型的平均输出。

4)权重衰减
权重衰减又被称为正则化,具体做法是将权值的大小加入到损失函数中。Loss=loss+reg(wi)Loss=loss + reg(w_i)Loss=loss+reg(wi)
在实际中分为L1正则化和L2正则,即:
        L1=λn∑0n∣wi∣L1=\frac{λ}{n}\displaystyle\sum_{0}^{n}|w_i|L1=nλ0nwi 所有权重w的绝对值求和,之后乘以λn\frac{λ}{n}nλ
        L2=λ2n∑0nwi2L2=\frac{λ}{2n}\displaystyle\sum_{0}^{n}w_i^2L2=2nλ0nwi2 所有权重w的平方求和,之后乘以λ2n\frac{λ}{2n}2nλ
正则化可以防止过拟合的原因。神经网络的计算核心是误差的反向传播,即增大的误差项会对每个神经元的权重产生影响。利用公式可以说明,即:
        w=w−η∂c0∂ww=w-η\frac{∂c_0}{∂w}w=wηwc0 未使用正则化计算出权重
        w=(1−ηλn)w−η∂c0∂ww=(1-\frac{ηλ}{n})w-η\frac{∂c_0}{∂w}w=(1nηλ)wηwc0 使用L2正则后权重变化
可以看到,相对于不实用L2正则化时,w的值变为(1−ηλn)(1-\frac{ηλ}{n})(1nηλ),因为其中的参数均为正,可以知道括号内的值小于1,其效果就是减少w的值,这就是权重衰减名称的由来。
在过拟合产生的时候,模型因为要对所有特征进行拟合,因此在一个原本平滑的拟合曲线上会产生大量的急促变化的凸起或凹陷,从数学上表示就是某点的导数值非常大,如下图所示:
在这里插入图片描述
过大的导数值从拟合出的模型上来看,数学模型的系数会非常大,即权重值也会非常大,这也是模型设计人员所不希望产生的。而正则化的加入在一定程度上缓解了此问题,通过对权重值在一定范围内的修正,使其不要偏离一个均值太大从而减少过拟合的产生。

5)Early Stopping
Early Stopping是参数微调中的一种,即在每次循环结束一次以后(这里的循环可能是full data batch,也可能是mini batch size),计算模型的准确率。当准确率不在增加时,就停止训练。
准确率不再增加时就停止训练,防止模型对已有数据继续训练。问题在于准确率在每个循环之后的计算是变化的,没有任何人和任何模型能保证准确率不会变化。建议方法是人为地设定一个范围。例如当连续10次准确率在此范围内波动事就停止训练。

6)可变化的学习率
可变化的学习率是根据模型计算出的准确率进行调整。在认为设定的准确率范围内达到要求后,依次修改准确率,知道最终的准确率满足要求。
5)、6)起作用的原因,随着训练时间的延长,部分神经元已经达到拟合状态,对其继续训练的话,这部分预先达到饱和的神经元会继续增长从而带来模型的过拟合。

7)使用Batch_Normalization
数据在经过卷积层之后,真正进入激活函数之前需要对其进行一次Batch_Normalization,分批对输入的数据求取均值和方差之后重新对数据进行归一化计算。
这样做的好处是对数据进行一定程度上的预处理,使得无论是训练数据还是测试集都在一定范围内进行分布和波动,对数据点中包含的误差进行掩盖化粗粒,从而增大模型的泛化能力。

除了上面的方法,还有常用的交叉验证、PCA特征提取、增加各种噪音等。这样实际上还是属于增加了数据集,增加数据集是解决过拟合的根本性方法。除此之外对于模型,尽量选择较为简单的模型也是解决过拟合的一个常用方法。

### 深度学习中的过拟合原因 在深度学习中,过拟合通常发生在模型过于复杂的情况下,即当模型参数过多而训练样本数量相对较少时。此时,模型可能会记住训练数据的具体特征而非其潜在规律,导致在测试集上的性能显著下降[^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)** 批量标准化不仅加速收敛还能间接起到一定的抗过拟合作用。通过规范化每一层输入数据的均值和方差,减少了内部协变量偏移的影响,进而简化优化过程。 --- ### 总结 综合以上几种技术可以看出,它们各自从不同角度出发应对过拟合挑战——无论是直接约束模型结构还是调整梯度更新策略。然而需要注意的是,任何单一措施都不足以完全消除这一风险;实际操作中常常需要结合多种方式共同发挥作用。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值