训练过程中的 Loss ?

文章目录

  • 在我们训练的过程中,设置好这个epochs也就是训练的轮次,然后计算这个损失函数,我们可以知道这个具体的训练的情况,那么在训练的过程中,这个损失函数的变化有哪些情况?对应的一个解释情况是怎么样的?

正常下降

Starting Epoch 1/50
Epoch [1/50] Average Loss: 0.5908
Starting Epoch 2/50
Epoch [2/50] Average Loss: 0.5720
Starting Epoch 3/50
Epoch [3/50] Average Loss: 0.5709
Starting Epoch 4/50
Epoch [4/50] Average Loss: 0.5550
Starting Epoch 5/50
Epoch [5/50] Average Loss: 0.5342
Starting Epoch 6/50
Epoch [6/50] Average Loss: 0.5057
Starting Epoch 7/50
Epoch [7/50] Average Loss: 0.4768
Starting Epoch 8/50
Epoch [8/50] Average Loss: 0.4469
Starting Epoch 9/50
Epoch [9/50] Average Loss: 0.4155
Starting Epoch 10/50
Epoch [10/50] Average Loss: 0.4037
Starting Epoch 11/50
Epoch [11/50] Average Loss: 0.3958
Starting Epoch 12/50
Epoch [12/50] Average Loss: 0.3643
  • 理解:
  • 这种趋势表明模型正在有效地学习训练数据中的模式。损失值持续稳定地下降,意味着模型在每个训练周期中都在减少预测错误,逐渐逼近数据中的真实关系。这是我们最希望看到的训练初期和中期表现。

对应解释:

  • 模型正在学习: 模型通过反向传播和优化器不断调整其内部参数(权重和偏置),以使预测结果更接近真实标签。
  • 特征提取有效: 模型能够从输入数据中提取出有用的特征,并利用这些特征进行分类或回归。
  • 优化器和学习率设置合理: 当前的学习率和优化器能够有效地引导模型向损失函数的最小值收敛。
  • 数据质量良好: 训练数据噪声较小,能够被模型有效学习。

下降后又不断上升

Epoch [14/50] Average Loss: 0.3641
Starting Epoch 15/50
Epoch [15/50] Average Loss: 0.3594
Starting Epoch 16/50
Epoch [16/50] Average Loss: 0.3235
Starting Epoch 17/50
Epoch [17/50] Average Loss: 0.3024
Starting Epoch 18/50
Epoch [18/50] Average Loss: 0.2847
Starting Epoch 19/50
Epoch [19/50] Average Loss: 0.2966
Starting Epoch 20/50
Epoch [20/50] Average Loss: 0.3149
Starting Epoch 21/50
Epoch [21/50] Average Loss: 0.3959
Starting Epoch 22/50
Epoch [22/50] Average Loss: 0.4231
  • 这种情况下,模型最可能出现了过拟合(Overfitting)。即使你只在一个数据集上训练,训练损失的上升仍然是过拟合的强烈信号。

  • 模型过度学习噪声: 在 Epoch 18 达到最低点后,模型可能已经充分学习了训练数据中的有效模式。继续训练时,它不再学习通用的规律,而是开始“记忆”训练数据中特有的、随机的噪声和细节。这些噪声对于泛化到新数据是无用的,甚至是干扰。

  • 泛化能力下降: 当模型开始拟合噪声时,它的泛化能力(对未见过的数据进行准确预测的能力)就会下降。即使训练损失本身在某个时刻可能看似还在下降,或者像你这个例子一样,在达到一个低点后显著上升,但模型的实际性能(尤其是在验证集或测试集上)会急剧恶化。

  • 学习率可能过高: 在损失函数接近最小值时,如果学习率仍然过高,优化器可能会“跳过”最优解,导致损失值在最低点之后反弹并持续上升,因为它无法精确地停留在或收敛到最小值。

  • 为什么即使训练损失上升也可能导致模型在后期表现尚可?

  • 你可能想问,如果训练损失上升了,模型是不是就完全失败了?不一定。

  • 局部过拟合和后期调整: 有时,模型在某个阶段会出现过拟合,但如果训练轮次足够多,并且有学习率调度器(如 ReduceLROnPlateau) 的介入,它可能会在后续的 Epoch 中降低学习率,从而帮助模型从过拟合的状态中部分恢复,重新找到更优的收敛路径,导致损失在后期再次下降。

  • 训练集与测试集的差异: 即使训练损失上升,如果测试集或验证集足够大且具有代表性,模型在某个最佳点停止训练(例如在这个例子中 Epoch 18 附近),其在测试集上的表现可能仍然不错。而你看到的“后面又继续下降了”可能就是调度器发挥作用后的结果。

  • 如何处理这种损失上升的情况?

  • 当发现训练损失下降后开始上升时,应立即采取措施,因为这表明模型正在走向过拟合的深渊:

  • 核心:早停(Early Stopping):

    • 最重要且最有效的方法。 你不应该等到损失上升到很高才停止。在训练过程中,除了监控训练损失,更重要的是监控验证损失(Validation Loss) 和验证指标(如准确率、F1 Score)。
    • 一旦验证损失开始上升,或者验证指标不再改善并开始下降,就应该停止训练,并回溯到验证集上表现最佳的那个 Epoch 所对应的模型权重。
  • 正则化(Regularization):

    • 权重衰减(Weight Decay / L2 正则化): 在优化器中加入或增加 weight_decay 参数。它会惩罚模型参数的大小,防止模型过度拟合训练数据。
    • Dropout: 在模型的全连接层(fc_reduce 或 fc)之间添加 nn.Dropout() 层。Dropout 会随机地“关闭”一部分神经元,迫使模型学习更鲁棒的特征,减少对单个特征的依赖。
  • 学习率调整:

    • 使用学习率调度器,尤其是 ReduceLROnPlateau。它会监控验证损失(或训练损失),当损失在一定时间内没有改善时,自动降低学习率。这可以帮助模型在接近最优解时进行更精细的调整,避免“跳过”最优解。
    • 如果发现训练损失上升,可以尝试手动降低学习率并继续观察。
  • 数据增强(Data Augmentation):

    • 增加训练数据的多样性。越是多样化的训练数据,模型就越难过拟合到特定的样本,从而学习到更通用的特征。
  • 简化模型:

    • 如果模型过于复杂,参数过多,它更容易记忆训练数据。可以考虑减少模型的层数、每层神经元数量,或者使用更简单的模型架构。

反复震荡

Epoch [37/50] Average Loss: 0.2566
Starting Epoch 38/50
Epoch [38/50] Average Loss: 0.2463
Starting Epoch 39/50
Epoch [39/50] Average Loss: 0.2579
Starting Epoch 40/50
Epoch [40/50] Average Loss: 0.2437
Starting Epoch 41/50
Epoch [41/50] Average Loss: 0.2357
Starting Epoch 42/50
Epoch [42/50] Average Loss: 0.2466
Starting Epoch 43/50
Epoch [43/50] Average Loss: 0.2442
Starting Epoch 44/50
Epoch [44/50] Average Loss: 0.2504
  • 理解:
  • 这种趋势表明损失函数在某个低点附近来回波动,没有进一步显著下降。这可能是模型在寻找最优解的过程中,在损失函数的“碗底”来回跳动,或者陷入了局部最优解。

对应解释:

  • 学习率不当:
  • 学习率过高: 导致模型在损失函数的最低点附近“跳来跳去”,无法精确收敛。这是最常见的原因。
  • 学习率过低: 虽然这通常导致损失下降非常缓慢而不是震荡,但在某些情况下,如果损失已经非常接近最小值,过低的学习率也可能导致模型在微小波动中停留。
  • 局部最优解/鞍点: 损失函数表面可能存在多个局部最小值或鞍点,模型陷入其中并难以逃脱。
  • 批量大小(Batch Size)过小: 小批量数据计算出的梯度噪声较大,导致优化方向不稳定,从而引起震荡。
  • 数据噪声: 训练数据中存在较多的噪声,模型在试图拟合这些噪声时导致波动。
  • 梯度爆炸/消失(不太常见于这种稳定震荡): 虽然会导致训练不稳定,但通常表现为损失值剧烈波动,而不是在某个区间内稳定震荡。

如何处理:

  • 降低学习率: 这是最直接有效的办法。通过学习率调度器(如 ReduceLROnPlateau)在损失停止下降或开始震荡时自动降低学习率。
  • 调整优化器: 尝试不同的优化器(如 Adam, SGD, RMSprop 等)或调整其参数。
  • 增加批量大小: 使用更大的批量可以使梯度估计更稳定,减少震荡。但这可能需要更多的内存。
  • 引入动量(Momentum): 优化器中的动量参数可以帮助模型平滑地越过小的波动,加速收敛。
  • 正则化: 适当的正则化也能帮助模型避免过拟合,从而减少在训练后期对噪声的拟合造成的震荡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

S2B2B农产品供应链交易多平台开发有哪些发展前景?如何维护?

一、S2B2B农产品供应链交易多平台开发的未来发展前景 本文将由小编为您介绍关于S2B2B农产品供应链交易多平台开发的内容,希望能够帮助大家。在数字化时代,农产品供应链的数字化转型成为了一种必然趋势。S2B2B(Supplier to Business to Business)模式通过…

关于有害的过度使用 std::move

翻译:2023 11 月 24 日On harmful overuse of std::move cppreference std::move 论 std::move 的有害过度使用 - The Old New Thing C 的 std::move 函数将其参数转换为右值引用,这使得其内容可以被另一个操作“消费”(移动)。…

Ubuntu24.04 onnx 模型转 rknn

前面的环境配置有点懒得写,教程也很多,可以自己找 rknn-toolkit2 gitee 地址:pingli/rknn-toolkit2 试了很多开源的代码,都没办法跑通, 最后自己改了一版 微调后的 qwen2 模型适用 from rknn.api import RKNN impor…

Electron通信流程

前言 今天讲Electron框架的通信流程,首先我们需要知道为什么需要通信。这得益于Electron的多进程模型,它主要模仿chrome的多进程模型如下图: 作为应用开发者,我们将控制两种类型的进程:主进程和渲染器进程 。 …

uni-app项目实战笔记1--创建项目和实现首页轮播图功能

ps:本笔记来自B站咸虾米壁纸项目 一.创建项目,完成项目初始化搭建 1.在HBuilder X创建wallper项目,使用默认模块,选择vue; 2.在项目根目录下创建common目录,用于存放静态资源,创建项目时自动生成static目…

机械制造系统中 PROFINET 与 PROFIBUS-DP 的融合应用及捷米科技解决方案

在机械制造领域,工业通信网络的兼容性与灵活性直接影响产线的自动化水平与生产效率。当前,多数机械制造系统采用PROFINET 控制器构建核心网络架构,并通过微波无线连接实现设备互联。随着工业网络的发展,系统中常需同时集成PROFINE…

MCP 协议系列序言篇:开启 AI 应用融合新时代的钥匙

文章目录 序言:AI 应用层进入 MCP 时代为什么 MCP 开启 AI 应用融合新时代的钥匙为什么是 MCP?它与 Function Calling、Agent 有什么区别?Function CallingAI AgentMCP(Model Context Protocol) MCP 如何工作MCP Serve…

【threejs】每天一个小案例讲解:光照

代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 常见光照类型及其特点如下: 1. 环境光(Ambi…

大模型在输尿管下段积水预测及临床应用的研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究范围与限制 1.4 文献综述 1.5 研究方法和框架 二、相关理论与概念 2.1 大模型技术原理 2.2 输尿管下段积水病理机制 2.3 大模型在医学预测领域的应用 三、大模型预测输尿管下段积水的方法 3.1 数据收集 3.…

gitlab相关操作

2025.06.11今天我学习了如何在终端使用git相关操作: 一、需要修改新的仓库git地址的时候: (1)检查当前远程仓库 git remote -v 输出示例: origin https://github.com/old-repo.git (fetch) origin https://github.c…

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…

通过共享内存在多程序之间实现数据通信

注:以下内容为与 GPT-4O 共同创作完成 以共享内存的方式实现多程序之间的数据通信,尤其适合在一台机器上的多程序之间进行高频数据交换。 以下示例展示了 sender.py 向 receiver.py 发送数据并接收经 receiver.py 处理后的数据,以及如何通过…

[论文阅读] 人工智能+软件工程 | 理解GitGoodBench:评估AI代理在Git中表现的新基准

理解GitGoodBench:评估AI代理在Git中表现的新基准 论文信息 GitGoodBench: A Novel Benchmark For Evaluating Agentic Performance On Git Tobias Lindenbauer, Egor Bogomolov, Yaroslav Zharov Cite as: arXiv:2505.22583 [cs.SE] 研究背景:当AI走进…

开源 java android app 开发(十二)封库.aar

文章的目的为了记录使用java 进行android app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。 相关链接: 开源 java an…

ubuntu + nginx 1.26 + php7.4 + mysql8.0 调优

服务器配置 8核 16G 查看内存 free -h nginx配置 worker_processes auto; # 自动检测CPU核心数 worker_rlimit_nofile 65535; # 提高文件描述符限制 ​ events {worker_connections 8192; # 每个worker的最大连接数multi_accept on; # 一次性接受…

[未验证]abaqus2022 更改内置python

如何在 Abaqus 2022 中更改内置 Python 在 Abaqus 中,Python 是常用的脚本语言,它使得用户能够自动化模型的创建、分析和后处理。可能有时候你需要更改默认的 Python 版本,比如使用特定库或者功能。本文将为您详细说明如何在 Abaqus 2022 中更…

RAG文档解析难点2:excel数据“大海捞针”,超大Excel解析与精准行列查询指南

写在前面 在构建检索增强生成(RAG)应用时,Excel文件是不可或缺的数据源。它们通常包含了企业运营、市场分析、科学研究等各个领域的宝贵数据。然而,当这些Excel文件变得“超大”——可能包含数十万甚至数百万行数据时,传统的解析方法和RAG数据处理流程将面临严峻的内存、…

深度掌控,智启未来 —— 基于 STM32F103RBT6 的控制板

在科技浪潮奔涌向前的时代,电子领域的创新发展从未停歇。对于电子工程师、科研工作者以及电子技术爱好者,在校电子专业学生而言,一款性能卓越、功能全面且稳定可靠的开发板,是探索电子世界奥秘、实现创意构想的关键基石。今天&…

什么样的登录方式才是最安全的?

目录 一、基础协议:HTTP与HTTPS HTTP协议 HTTPS协议 二、常见Web攻击与防御 2.1 XSS 常见攻击手段 针对XSS 攻击窃取 Cookie 2.2 CSRF CSRF攻击的核心特点 与XSS的区别 常见防御措施 三、疑问解答 四、登录方式演变 4.1 方案一🐶狗都不用 …

android studio底部导航栏

实现底部导航栏切换 将java文件return的xml文件赋值给页面FrameLayout控件 java文件BottomNavigationView,监听器setOnNavigationItemSelectedListener MainActivity.java代码 package com.example.myapplication;import android.os.Bundle;import androidx.appc…