当前位置: 首页 > web >正文

人工智能-python-深度学习-过拟合与欠拟合:概念、判断与解决方法

文章目录

  • 过拟合与欠拟合:概念、判断与解决方法
    • 一、概念认知
      • 1. 欠拟合(Underfitting)
      • 2. 过拟合(Overfitting)
    • 二、如何判断
    • 三、解决欠拟合的方法
    • 四、解决过拟合的方法
      • 1. **L2 正则化(权重衰减)**
      • 2. **L1 正则化**
      • 3. **Dropout**
      • 4. **数据增强**
    • 五、总结


过拟合与欠拟合:概念、判断与解决方法

在机器学习和深度学习的训练过程中,模型的性能往往受限于过拟合欠拟合问题。合理地识别和解决这两个问题,才能训练出泛化能力更强的模型。


一、概念认知

1. 欠拟合(Underfitting)

  • 定义:模型过于简单,无法捕捉数据中的规律。

  • 表现:在训练集和测试集上的准确率都很低。

  • 原因

    • 模型复杂度过低(如用线性模型拟合非线性数据)。
    • 特征不足,信息不够。
    • 训练时间过短,未收敛。

2. 过拟合(Overfitting)

  • 定义:模型过于复杂,把训练数据学“死记硬背”了,无法推广到新数据。

  • 表现:训练集上表现很好,但测试集上效果差。

  • 原因

    • 模型复杂度过高(层数太多、参数太多)。
    • 训练集数据不足。
    • 特征选择不合理,存在噪声。

二、如何判断

  1. 损失函数变化

    • 训练误差低,验证误差高 → 过拟合。
    • 训练误差和验证误差都高 → 欠拟合。
  2. 学习曲线

    • 欠拟合:训练曲线和验证曲线都没有收敛。
    • 过拟合:训练曲线下降快,但验证曲线提前上升。

三、解决欠拟合的方法

  • 增加模型复杂度(加层、加神经元)。
  • 提供更多特征。
  • 训练更久(调整学习率和迭代次数)。

四、解决过拟合的方法

1. L2 正则化(权重衰减)

  • 数学表示

    L=L0+λ∑iwi2L = L_{0} + \lambda \sum_{i} w_i^2 L=L0+λiwi2

  • 梯度更新

    w←w−η(∇L0+2λw)w \leftarrow w - \eta (\nabla L_{0} + 2\lambda w) wwη(L0+2λw)

  • 作用:让权重趋向于较小值,避免过大权重导致模型复杂化。

  • 代码实现

    optimizer = torch.optim.SGD(model.parameters(), lr=0.01, weight_decay=1e-4)
    

2. L1 正则化

  • 数学表示

    L=L0+λ∑i∣wi∣L = L_{0} + \lambda \sum_{i} |w_i| L=L0+λiwi

  • 梯度更新

    w←w−η(∇L0+λ⋅sign(w))w \leftarrow w - \eta (\nabla L_{0} + \lambda \cdot \text{sign}(w)) wwη(L0+λsign(w))

  • 特点:会使部分参数稀疏化(变为 0),具有特征选择的效果。

  • 与 L2 对比

    • L1 更适合稀疏特征选择。
    • L2 更适合防止过大权重。
  • 代码实现(通过自定义正则化项实现):

    l1_lambda = 0.001
    l1_norm = sum(p.abs().sum() for p in model.parameters())
    loss = loss_fn(outputs, targets) + l1_lambda * l1_norm
    

3. Dropout

  • 原理:训练时随机丢弃部分神经元(权重设为 0),防止过度依赖某些特征。

  • 影响:相当于集成多个子网络,提高泛化能力。

  • 代码实现

    import torch.nn as nn
    model = nn.Sequential(nn.Linear(256, 128),nn.ReLU(),nn.Dropout(0.5),  # 50% 概率丢弃nn.Linear(128, 10)
    )
    

4. 数据增强

通过人为扩大数据集,增加多样性,从而降低过拟合风险。
常见方法如下:

  • 图片缩放:调整大小。
  • 随机裁剪:模拟不同场景下的物体位置。
  • 随机水平翻转:让模型学到对称特征。
  • 调整图片颜色:亮度、对比度、饱和度。
  • 随机旋转:增加旋转不变性。
  • 图片转 Tensor:转为模型可用的张量。
  • Tensor 转图片:便于可视化。
  • 归一化:加速训练,提升稳定性。

整合示例:

import torchvision.transforms as transformstransform = transforms.Compose([transforms.RandomResizedCrop(224),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.RandomRotation(15),transforms.ToTensor(),transforms.Normalize(mean=[0.5,0.5,0.5], std=[0.5,0.5,0.5])
])

五、总结

在这里插入图片描述
这是一个 欠拟合、合适拟合和过拟合的损失曲线对比图 📊:

欠拟合:训练集和验证集 loss 都较高,下降也不明显。

合适拟合:训练 loss 持续下降,验证 loss 下降后趋于稳定。

过拟合:训练 loss 下降很快,但验证 loss 出现反弹。

  • 欠拟合:模型太简单,训练不足 → 解决方法:增加复杂度、更多特征、训练更久。
  • 过拟合:模型记住了训练集 → 解决方法:正则化、Dropout、数据增强。
  • 结果导向:所有这些方法的目的,都是提高模型的泛化能力,即让模型不仅能在训练集上表现好,也能在未知数据上保持较高精度。

要不要我帮你把这篇文章整理成 Markdown 表格 + 图示(比如过拟合与欠拟合的损失曲线对比图),这样发到 CSDN 会更直观?

http://www.xdnf.cn/news/19091.html

相关文章:

  • 【Bluedroid】A2DP Source设备音频数据读取机制分析(btif_a2dp_source_read_callback)
  • Solidity合约编程基础知识
  • Java 多线程环境下的全局变量缓存实践指南
  • jwt原理及Java中实现
  • Ckman部署clickhouse
  • 5.2 I/O软件
  • 横扫SQL面试——流量与转化率分类
  • C++《哈希表》
  • Unity游戏打包——iOS打包pod的重装和使用
  • Servlet 注解:简化配置的完整指南
  • 大模型微调示例四之Llama-Factory-DPO
  • 若依cloud集训总结
  • 汉字这颗穿越时空的智慧之光,在未来绽放出更加耀眼的光芒
  • 深入解析Java并发编程与单例模式
  • 文件系统挂载详细分析(《图解Linux内核》虚拟文件系统篇笔记三)
  • 神经网络为何能 “学习”?从神经元到深度学习模型的层级结构解析
  • 打破存储局限:CS 创世 SD NAND 如何优化瑞芯微(RK)与北京君正平台的贴片式 SD 卡性能
  • 【C++成长之旅】C++入门基础:从 Hello World 到命名空间与函数重载的系统学习
  • Bscan Bonding Chain
  • 印度尼西亚数据源 PHP 对接文档
  • Mysql——分库分表
  • Redis发布订阅:实时消息系统的极简解决方案
  • 从数字到价值:ESG评级的深层变革
  • Linux827 测试
  • 计算机日常答疑,一起寻找问题的最优解
  • LeetCode算法日记 - Day 24: 颜色分类、排序数组
  • PyTorch图像预处理完全指南:从基础操作到GPU加速实战
  • 完整实验命令解析:从集群搭建到负载均衡配置(2)
  • [vcpkg] Windows入门使用介绍
  • day22 回溯算法part01