2025-05-27 Python深度学习7——损失函数和反向传播

文章目录

  • 1 损失函数
    • 1.1 L1Loss
    • 1.2 MSELoss
    • 1.3 CrossEntropyLoss
  • 2 反向传播

本文环境:

  • Pycharm 2025.1
  • Python 3.12.9
  • Pytorch 2.6.0+cu124

1 损失函数

​ 损失函数 (loss function) 是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的"风险"或"损失"的函数。在机器学习中,损失函数通常作为学习准则与优化问题相联系,通过最小化损失函数来求解和评估模型。

​ 损失函数主要分为两类:

  • 回归问题:常用 L1 损失函数 (MAE) 和 L2 损失函数 (MSE)。
  • 分类问题:常用 0-1 损失函数及其代理损失 (如交叉熵损失、铰链损失等)。

1.1 L1Loss

image-20250527202547146

​ L1Loss 计算输入 ( x x x) 和目标 ( y y y) 之间的平均绝对误差 (MAE)。数学公式如下:
l n = ∣ x n − y n ∣ l_n=|x_n-y_n| ln=xnyn

参数类型说明
size_average(bool, 可选)已弃用(请使用reduction)。默认情况下,损失会对批中每个损失元素求平均。注意对于某些损失,每个样本可能有多个元素。如果设为False,则对每个minibatch的损失求和。当reduce为False时被忽略。默认: True
reduce(bool, 可选)已弃用(请使用reduction)。默认情况下,根据size_average对每个minibatch的观测值求平均或求和。当reduce为False时,返回每个批元素的损失并忽略size_average。默认: True
reduction(str, 可选)指定应用于输出的缩减方式: ‘none’|‘mean’|‘sum’。
- ‘none’: 不应用缩减,
- ‘mean’: 输出总和除以元素数量,
- ‘sum’: 输出求和。
注意: size_average和reduce正在被弃用,目前指定这两个参数中的任何一个都会覆盖reduction。默认: ‘mean’

​ 依据reduction的不同,输出结果也不同:
ℓ ( x , y ) = { 1 N ∑ n = 1 N l n , if reduction = ’mean’ . ∑ n = 1 N l n , if reduction = ’sum’ . \ell(x,y)= \begin{cases} \displaystyle\frac{1}{N}\sum_{n=1}^N l_n,&\text{if reduction}=\text{'mean'}.\\\\ \displaystyle\sum_{n=1}^N l_n,&\text{ if reduction}=\text{'sum'}. \end{cases} (x,y)= N1n=1Nln,n=1Nln,if reduction=’mean’. if reduction=’sum’.
​ 其中, N N N 为每个批次的数量。

  • 输入: (∗), 其中 ∗ 表示任意维数。
  • 目标: (∗), 与输入形状相同。
  • 输出: 标量。如果reduction为’none’,则形状与输入相同(∗)。
import torch
from torch import nninputs = torch.tensor([1., 2, 3])
targets = torch.tensor([1, 2, 5])loss = nn.L1Loss()
result = loss(inputs, targets)  # 计算平均绝对误差
print(result)  # tensor(0.6667) 计算:(0 + 0 + 2)/3 = 0.6667

特点:

  • 对异常值不敏感,具有较好的鲁棒性。
  • 梯度恒定(±1),在接近最优解时可能导致震荡。
  • 适用于对异常值敏感的场景。

1.2 MSELoss

image-20250527203806901

​ MSELoss 计算输入 ( x x x) 和目标 ( y y y) 之间的均方误差 (MSE)。
l n = ( x n − y n ) 2 l_n=(x_n-y_n)^2 ln=(xnyn)2

参数类型说明
size_average(bool, 可选)已弃用(请使用reduction)。默认对批中每个损失元素求平均。设为False则对每个minibatch的损失求和。当reduce为False时被忽略。默认: True
reduce(bool, 可选)已弃用(请使用reduction)。默认根据size_average对观测值求平均或求和。当reduce为False时,返回每个批元素的损失。默认: True
reduction(str, 可选)指定输出缩减方式: ‘none’|‘mean’|‘sum’。
- ‘none’: 不缩减,
- ‘mean’: 输出总和除以元素数量,
- ‘sum’: 输出求和。
注意: size_average和reduce将被弃用。默认: ‘mean’

​ 依据reduction的不同,输出结果也不同:
ℓ ( x , y ) = { 1 N ∑ n = 1 N l n , if reduction = ’mean’ . ∑ n = 1 N l n , if reduction = ’sum’ . \ell(x,y)= \begin{cases} \displaystyle\frac{1}{N}\sum_{n=1}^N l_n,&\text{if reduction}=\text{'mean'}.\\\\ \displaystyle\sum_{n=1}^N l_n,&\text{ if reduction}=\text{'sum'}. \end{cases} (x,y)= N1n=1Nln,n=1Nln,if reduction=’mean’. if reduction=’sum’.
​ 其中, N N N 为每个批次的数量。

  • 输入: (∗), 其中 ∗ 表示任意维数
  • 目标: (∗), 与输入形状相同
  • 输出: 标量。如果reduction为’none’,则形状与输入相同(∗)
解释import torch
from torch import nninputs = torch.tensor([1., 2, 3])
targets = torch.tensor([1, 2, 5])loss_mse = nn.MSELoss()
result_mse = loss_mse(inputs, targets)
print(result_mse)  # tensor(1.3333) 计算:(0 + 0 + 4)/3 = 1.3333

特点:

  • 对较大误差惩罚更重(平方放大效应)。
  • 对异常值敏感。
  • 梯度随误差减小而减小,收敛速度较快。
  • 适用于数据质量较好的场景。

1.3 CrossEntropyLoss

image-20250527214211838 ​ CrossEntropyLoss 计算输入 ($x$) 和目标 ($y$) 之间的交叉熵。该损失函数结合 LogSoftmax 和 NLLLoss (负对数似然损失) 的操作,适用于多类分类任务。

l n = − ∑ c = 1 C w c log ⁡ exp ⁡ ( x n , c ) ∑ i = 1 C exp ⁡ ( x n , i ) y n , c l_n=-\sum_{c=1}^Cw_c\log\frac{\exp(x_{n,c})}{\sum_{i=1}^C\exp(x_{n,i})}y_{n,c} ln=c=1Cwclogi=1Cexp(xn,i)exp(xn,c)yn,c
​ 其中 w w w 为权重, C C C 为类别数。

参数类型说明
weight(Tensor, 可选)为每个类别分配权重的一维张量,用于处理类别不平衡问题
ignore_index(int, 可选)指定要忽略的目标值,不参与梯度计算
reduction(str, 可选)指定输出缩减方式: ‘none’|‘mean’|‘sum’。默认: ‘mean’
label_smoothing(float, 可选)标签平滑系数,范围[0.0,1.0]。0.0表示无平滑

​ 依据reduction的不同,输出结果也不同:
ℓ ( x , y ) = { 1 N ∑ n = 1 N l n , if reduction = ’mean’ . ∑ n = 1 N l n , if reduction = ’sum’ . \ell(x,y)= \begin{cases} \displaystyle\frac{1}{N}\sum_{n=1}^N l_n,&\text{if reduction}=\text{'mean'}.\\\\ \displaystyle\sum_{n=1}^N l_n,&\text{ if reduction}=\text{'sum'}. \end{cases} (x,y)= N1n=1Nln,n=1Nln,if reduction=’mean’. if reduction=’sum’.
​ 其中, N N N 为每个批次的数量。

输入形状

  • 无批处理: ( C ) (C) (C)
  • 批处理: ( N , C ) (N, C) (N,C) ( N , C , d 1 , d 2 , . . . , d K ) , K ≥ 1 (N, C, d₁, d₂,...,d_K), K≥1 (N,C,d1,d2,...,dK),K1

目标形状

  • 类别索引: ( ) , ( N ) (), (N) (),(N) ( N , d 1 , d 2 , . . . , d K ) (N, d₁, d₂,...,d_K) (N,d1,d2,...,dK)
  • 类别概率: 必须与输入形状相同。
from torch import nnx = torch.tensor([0.1, 0.2, 0.3])  # 预测值(未归一化)
y = torch.tensor([1])  # 真实类别索引
x = x.reshape(1, -1)  # 调整为(batch_size, num_classes)loss_cross = nn.CrossEntropyLoss()
result_cross = loss_cross(x, y)
print(result_cross)  # tensor(1.1019)

计算过程:

  1. 对 x 应用 softmax 得到概率分布:[0.3006,0.3322,0.3672]。
  2. 取真实类别 (1) 的概率:0.3322。
  3. 计算负对数: − l o g ( 0.3322 ) ≈ 1.1019 -log(0.3322)\approx1.1019 log(0.3322)1.1019

特点:

  • 结合了 Softmax 和负对数似然。
  • 梯度计算高效,适合多分类问题。
  • 对预测概率与真实标签的差异敏感。

2 反向传播

​ 反向传播(Backpropagation)是神经网络训练的核心算法,通过链式法则计算损失函数对网络参数的梯度。关键步骤:

  1. 前向传播:计算网络输出和损失值。
  2. 反向传播
    • 计算损失函数对输出的梯度。
    • 逐层传播梯度到各参数。
    • 应用链式法则计算参数梯度。
  3. 参数更新:使用优化器根据梯度更新参数。

​ 以 CIFAR10 网络为例:

from collections import OrderedDictimport torch
import torchvision
from torch import nnfrom torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms# 加载CIFAR10数据集
dataset = torchvision.datasets.CIFAR10(root='./dataset',  # 数据集存放路径train=False,  # 是否为训练集download=True,  # 是否下载数据集transform=transforms.ToTensor()  # 数据预处理
)# 加载数据集
dataloader = DataLoader(dataset, batch_size=1)class MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.model1 = nn.Sequential(OrderedDict([('conv1', nn.Conv2d(3, 32, 5, padding=2)),('maxpool1', nn.MaxPool2d(2)),('conv2', nn.Conv2d(32, 32, 5, padding=2)),('maxpool2', nn.MaxPool2d(2)),('conv3', nn.Conv2d(32, 64, 5, padding=2)),('maxpool3', nn.MaxPool2d(2)),('flatten', nn.Flatten()),('linear1', nn.Linear(64 * 4 * 4, 64)),('linear2', nn.Linear(64, 10))]))def forward(self, x):x = self.model1(x)return xloss = nn.CrossEntropyLoss()model = MyModel()
for data in dataloader:imgs, targets = dataoutputs = model(imgs)result_loss = loss(outputs, targets)result_loss.backward()  # 使用反向传播print(result_loss)

​ 在 Pycharm 中,将第 48 行注释,点击调试。

image-20250527211328521

​ 依次在变量窗口中展开“model”-》“model1”-》“conv1”,可看到 conv1 层中的权重参数 weight。

image-20250527211446267

​ 展开“weight”,其 grad 属性此时为 None。

image-20250527211608982

​ 点击“步过”按钮,运行 48 行,“weight”的 grad 属性被赋值。此值即为本次迭代的梯度数据。

image-20250527211725204

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

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

相关文章

python+tkinter实现GUI界面调用即梦AI文生图片API接口

背景 目前字节跳动公司提供了即梦AI的接口免费试用,但是并发量只有1,不过足够我们使用了。我这里想做个使用pythontkinter实现的GUI可视化界面客户端,这样就不用每次都登录官方网站去进行文生图片,当然文生视频,或者图…

#git 储藏库意外被清空 Error: bad index – Fatal: index file corrupt

问题:通常是由于 Git 的索引文件损坏导致 原因:系统崩溃或断电、硬盘故障、Git 操作错误等 方案:重建索引文件:将当前的索引文件重命名为其他名称或删除,比如 index.m,然后命令行重建索引,git…

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【二】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…

车载网关策略 --- 车载网关通信故障处理机制深度解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

Unity数字人开发笔记

开源工程地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit 先致敬zhangliwei7758,开放这个源码 一、建立工程 建立Unity工程(UnityAiChat)拖入Unity-AI-Chat-Toolkit.unitypackage打开chatSample工程,可…

Cherry Studio连接配置MCP服务器

之前写了一篇关于Cherry Studio的文章,不了解的可以先看一下 AI工具——Cherry Studio,搭建满血DeepSeek R1的AI对话客户端【硅基流动DeepSeek API】-CSDN博客 最近Cherry Studio更新了一个新功能:MCP服务器 在 v1.2.9 版本中,…

OpenSSH 服务配置与会话保活完全指南

一、/etc/ssh/sshd_config 配置机制 1. 配置文件基础 文件作用 OpenSSH 服务器 (sshd) 的主配置文件,控制连接、认证、端口转发等行为。 加载与生效 修改后需重启服务:sudo systemctl restart sshd # Systemd 系统 sudo service ssh restart # S…

阿里云国际版注册邮箱格式详解

“为什么我的阿里云国际版注册总提示邮箱无效?” 这是许多初次接触阿里云国际版(Alibaba Cloud International)的用户常遇到的困惑。随着全球化进程加速,越来越多的企业选择阿里云国际版部署海外业务,而注册环节中邮箱…

【IDEA问题】springboot本地启动应用报错:程序包不存在;找不到符号

问题: springboot本地启动应用报错: 程序包xxx不存在;找不到符号 解决方案: 1.确保用maven重新导入依赖 2.删除.idea文件夹 3.invalidate caches里,把能选择的都勾选上,然后清除缓存重启 4.再在上方工具栏…

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制 一、回绕处理函数 /** * Wrap a given time stamp, if there is an indication for an overflow * * param st stream // 传入一个指向AVStream结构体的指针,代表流信息 * pa…

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 -1 项目功能描述

1 项目功能描述 # 智慧社区-小程序-1 欢迎页-加载后端:动态变化-2 首页-轮播图:动态-公共栏:动态-信息采集,社区活动,人脸检测,语音识别,心率检测,积分商城-3 信息采集页面-采集人数…

5.27 day 30

知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 我们复盘下学习py…

【GitHub Pages】部署指南

vue项目 编辑你的 vite.config.ts 文件,加上 base 路径,设置为你的 GitHub 仓库名 import { defineConfig } from vite import vue from vitejs/plugin-vue// 假设你的仓库是 https://github.com/your-username/my-vue-app export default defineConfi…

远程控制技术全面解析:找到适合你的最佳方案

背景:远程控制为何成为企业核心需求? 随着企业数字化转型的推进,远程控制技术已成为异地办公和运维的关键工具。无论是跨国企业需要高效管理全球设备,还是中小型企业追求经济高效的解决方案,选择合适的远程控制技术&a…

触觉智能RK3506星闪开发板规格书 型号IDO-EVB3506-V1

产品概述 触觉智能RK3506星闪开发板,型号IDO-EVB3506-V1采用 Rockchip RK3506(三核 Cortex-A7单核Cortex-M0, 主频最高1.5GHz)设计的评估开发板,专为家电显控、显示HMI、手持终端、工业IOT网关、工业控制、PLC等领域而设计。内置…

九级融智台阶与五大要素协同的量子化解析

九级融智台阶与五大要素协同的量子化解析 摘要:本文构建了一个量子力学框架下的九级融智模型,将企业创新过程映射为量子能级跃迁。研究发现五大要素协同态决定系统跃迁概率(P∣⟨Ψ_m∣H_协同∣Ψ_n⟩∣^2),当要素协同…

Kotlin学习34-data数据类1

定义如下:与普通类对比学习 //普通类 class NormalClass(val name: String, val age: Int, val sex: Char) //数据类 data class DataClass(val name: String, val age: Int, val sex: Char)对应找到java反编译的代码路径:Tool-->Kotlin-->Show K…

博图SCL基础知识-表达式及赋值运算

S7-1200 从 V2.2 版本开始支持 SCL 语言。 语言元素 SCL 除了包含 PLC 的典型元素(例如,输入、输出、定时器或存储器位)外,还包含高级编程语言表达式、赋值运算和运算符。 程序控制语句 SCL 提供了简便的指令进行程序控制。例…

海思3519V200ARM Linux 下移植 Qt5.8.0

一、移植背景及意义 海思3519V200是一款基于ARM架构的嵌入式芯片,广泛应用于智能安防、工业控制等领域。在这些应用场景中,对设备的图形用户界面(GUI)有着越来越高的要求。Qt5.8.0作为一个功能强大、跨平台的GUI开发框架,能够帮助开发者快速开发出美观、高效的用户界面。…

msql的乐观锁和幂等性问题解决方案

目录 1、介绍 2、乐观锁 2.1、核心思想 2.2、实现方式 1. 使用 version 字段(推荐) 2. 使用 timestamp 字段 2.3、如何处理冲突 2.4、乐观锁局限性 3、幂等性 3.1、什么是幂等性 3.2、乐观锁与幂等性的关系 1. 乐观锁如何辅助幂等性&#xf…