深度学习之过拟合

什么是过拟合

举一个简单的例子:我们设计了一个模型来判断 一件物品是否为树叶。喂养这个模型的数据集中含有几张带有尖刺边缘的树叶。模型的设计者希望模型能满足每一个训练数据,模型就将尖刺边缘也纳入了参数中。当我们测试这个模型的泛化性能时,就会发现效果很差,因为模型钻牛角尖,它认为树叶必须带有尖刺边缘,所以它排除了所有没有带有尖刺边缘的树叶,但事实上,我们知道树叶并不一定带有尖刺边缘。结果为什么会这样?因为模型设计者的强迫症使得这个模型过分贴合整个训练集,结果把噪音点也拟合上了。

过拟合(overfitting):模型过于复杂,在训练集上面的拟合效果非常好甚至可以达到损失为0,但是在测试集的拟合效果很不好

欠拟合(underfitting): 模型过于简单 在训练集和测试集的拟合的效果都不好

欠拟合与过拟合

我们以“波士顿房价预测”为例,来从图像的角度直观感受一下什么叫过拟合,顺便也介绍一下欠拟合:

例子1:线性回归(房价预测)

Fig.1 Linear regression(截屏自吴恩达机器学习)

我们看到第一张图的模型过于简单,而且损失函数的收敛速度很慢。这就使得优化算法做得再好,我们的模型的泛化性能也会很差,因为这条直线在训练集上的cost就很大,我们把这种训练集上的偏差很大的情况叫做欠拟合(Underfitting),也有一种历史叫法:高偏差(High bias)

第二张图是我们合理假设的一个模型。可以看到,选取了合理的模型后,图像大致穿过了样本点。像极了做物理实验时,最后用一条曲线大致地穿过既定的样本点;和第一张图比起来,至少损失值大大下降了。

第三张图引入了高次项,就题论题来说,这太复杂了。虽然事实上对于是任意n个点,总能找到n+1次曲线方程将这n个点全部穿过,但是从模型的角度来讲,这显然不是好模型(姑且不说要用一个高次模型去拟合离散点要迭代多少次,学习率要调到多低)。即使它一板一眼地穿过了所有样本点,但谁能保证这种奇形怪状的曲线能穿过下一个随机给出的样本点呢?我们把这种和预测值和样本标签值几乎完全一致的情况叫做过拟合(Overfitting),历史上也称为高方差(High variance)

 所以过拟合就是损失函数极小但泛化性能差的情况。落实在分类问题上就是训练集的损失函数值很小,但是验证集/测试集上的损失函数值很大

解决过拟合

我们一般有两种方法来减小过拟合的影响:

1.减少属性值(特征值)的数量。

  • 人工选择哪些特征需要保留。
  • 使用模型选择算法。

2.实行正则化

  • 保留所有特征值,但是减小参数θ_j的值或数量级。
  • 当我们有许多特征时,效果较好。其中每一个特征值都会对y造成影响

抑制过拟合的方法

 1增加训练的样本数量

2在损失函数上面添加正则项

3改变数据生成模型的噪声生成的方差

### 深度学习过拟合与欠拟合的概念 在深度学习领域,模型的表现可以分为三种情况:过拟合、欠拟合以及适度拟合。当模型既能在训练集上取得良好效果,在测试集上也能保持稳定性能时,则认为达到了适度拟合的状态。 对于过拟合而言,指的是模型对训练数据的学习过于精细以至于记住了噪声和其他不重要的细节,从而导致其泛化能力下降,在未见过的数据上的预测准确性降低[^1]。而欠拟合则是指模型未能充分捕捉到输入特征与目标变量之间的关系,使得无论是在训练还是验证阶段都表现出较差的成绩[^2]。 ### 判断标准 - **欠拟合**:如果一个模型在训练集和测试集上的误差都很高,那么这个模型可能处于欠拟合状态。 - **过拟合**:相反地,若某模型仅在训练集中有较低错误率而在独立样本(如交叉验证集或测试集)里却显示出较高偏差,则表明该网络发生了过拟合现象。 - **适度拟合**:理想情况下,希望找到一种平衡点使我们的算法既能很好地适应已知实例又能合理推测未知案例。 ### 导致的原因 #### 过拟合原因 - 数据量不足:有限数量的例子不足以支撑复杂函数空间的有效探索; - 特征维度过多:存在大量冗余属性增加了不必要的参数估计难度; - 正则约束不够强:缺乏有效的惩罚机制来抑制权重增长; #### 欠拟合原因 - 学习速率设置不当:过高会跳过全局最小值附近区域,太低又难以收敛至最优解; - 网络结构简单:隐藏层节点数太少无法表达复杂的映射规律; - 初始化方式不合理:某些极端初始值可能会阻碍梯度传播过程正常进行; ### 解决策略 针对上述两种异常状况有不同的处理手段: #### 应对过拟合的方法 ##### L2正则化 通过向损失函数添加一项关于权值平方和的形式,鼓励较小绝对值的系数分布,有助于减少过拟合风险。 ```python weight_decay = 0.01 # 调整此超参控制强度 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate, weight_decay=weight_decay) ``` ##### Dropout随机失活 每次迭代过程中按照一定概率丢弃部分神经元连接,迫使其他路径承担更多责任,提高整体鲁棒性和抗干扰性。 ```python dropout_prob = 0.5 # 设置丢失比例 model = nn.Sequential( ..., nn.Dropout(p=dropout_prob), ... ) ``` #### 应对欠拟合的办法 增加模型容量是最直接有效的方式之一,比如加深层数或者拓宽每层宽度以增强表征力。除此之外还可以尝试调整优化器配置文件里的各项参数直至获得满意的结果为止[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值