深度学习 —— 损失函数

目录

损失函数

[一、多分类交叉熵函数 ------ nn.CrossEntropyLoss()](#一、多分类交叉熵函数 —— nn.CrossEntropyLoss())

[二、二分类交叉熵函数 ------ nn.BCELoss()](#二、二分类交叉熵函数 —— nn.BCELoss())

三、回归任务

[1. MAE 损失函数](#1. MAE 损失函数)

[2. MSE损失函数](#2. MSE损失函数)

[3. Smooth L1 Loss (也称为 Huber Loss)](#3. Smooth L1 Loss (也称为 Huber Loss))

[4. 如何选择回归任务的损失函数](#4. 如何选择回归任务的损失函数)

[5. 代码](#5. 代码)


损失函数

是什么? 评估模型的预测值和真实值差距的函数,从而评估模型的好坏,损失值越小越好

(损失函数、代价函数、目标函数、误差函数)同一个意思。

一、多分类交叉熵函数 ------ nn.CrossEntropyLoss()

自带了SoftMax,模型的输出输出层不需要再softmax

例如:

带入公式

正确类别的预测概率 曲线

总结:

其中:y_logits是模型的原始输出/预测分数

softmax(y_logits)是模型输出的概率分布,也就是每个类别的预测概率,最大概率对应预测类别

注意:

多分类交叉熵CrossEntropLoss里面有softmax运算,所以模型的输出层不需要softmax。

但是如果要获取预测概率,则需要在模型输出的原始预测分数后面经过softmax

应用:

多分类问题,如:10个类别,预测图片属于哪一类

API:

nn.CrossEntropyLoss()

代码:

python 复制代码
import torch
import torch.nn as nn
python 复制代码
# 1.创建 样本的真实值,假设是一个三分类任务, 真实类别为[1,0,2,0]. 4个样本
y_true = torch.tensor([1,0,2,0], dtype=torch.long)

# 2.创建 模型的预测分数y_logits
y_logits = torch.tensor([
    [0.1,2.0,1.0],
    [0.2,0.5,0.3],
    [0.3,0.2,0.5],
    [0.5,0.2,0.3]
])

# 3.创建 多分类交叉熵损失函数对象
loss_fn = nn.CrossEntropyLoss()

# 4.计算损失
# y_logits: 2D(batch_size, 3), y_true: 1D(batch_size)
# 为什么是 3 ---->  三分类
loss = loss_fn(y_logits,y_true)
print(f"多分类交叉熵损失函数: {loss}")

二、二分类交叉熵函数 ------ nn.BCELoss()

二分类中使用

总结:

二分类交叉熵损失

公式:BCELoss = -y*log(y_hat)-(1-y)*log(1-y_hat)

其中:y_hat是模型的预测值,也就是经过sigmoid之后的预测概率,对应正类

y 是真实值,0或1,

负类:标签编码0,one-hot编码1,0,正类:标签编码1,one-hot0,1

注意:

二分类交叉熵损失BCELoss里面没有sigmoid,所以模型输出层最后需要添加sigmoid

API:

nn.BCELoss()

代码:

python 复制代码
# 1.创建 样本的真实值,假设是一个二分类任务, 真实类别为[0,1,0,1]
y_true = torch.tensor([0,1,0,1], dtype=torch.float)

# 2. 创建 预测分数, 1D (batch_size,)
y_logits = torch.tensor([10, -10, -50, 2.5], dtype=torch.float)

"""
    # 预测类别 [1,0,0,1]
    # 经过sigmoid,转换为概率,这里才是模型输出的预测值
"""
y_preds = torch.sigmoid(y_logits)

# 3. 创建 二分类交叉熵损失函数
loss_fn = nn.BCELoss()

# 4. 计算损失
# y_pred: 1D (4,). y_true:1D(4,)
loss = loss_fn(y_preds,y_true)

print(f"二分类交叉熵损失:: {loss}")

二分类任务可以用 多分类交叉熵损失。

三、回归任务

1. MAE 损失函数

公式:

特点:

① 损失 - 误差呈线性关系

② MAE损失函数本身不具有稀梳性,不会让权重衰减为0

③ 最大问题是梯度在零点不平滑,会跳过极小值

④ 适用于回归问题中存在异常值或噪声数据时,可以减少对离群点的敏感性

2. MSE损失函数

Mean Squared Loss / Quadratic Loss (MSE loss) 也被称为L2 loss,或欧氏距离。

++计算误差平方的平均值. =++ ++均差平方之和 / 样本总数++

公式:

特点:

① 损失-误差呈二次曲线关系

② 处处可导、梯度平滑,是 ++最常用++的回归损失函数

③ 误差大时候,容易梯度过大, 无法有效训练模型

④ 适用于大多数标准回归问题,如房价、温度预测等

3. Smooth L1 Loss (也称为 Huber Loss)

简单来说:

就是 MAE 和 MSE的结合,尤其是在面对异常值时,它能平滑过渡,避免大误差的影响

公式:

可以转换看做

< 1是 MSE. ≥ 1 是MAE

解决L1(MAE)在0点不平滑、以及L2(MSE)的梯度爆炸问题

4. 如何选择回归任务的损失函数

MSE > Smooth L1 > MAE

API:

nn.L1Loss()

nn.MSELoss()

nn.SoothL1Loss()

5. 代码

python 复制代码
# 1.创建 样本的真实值
# 4个样本
y_true = torch.tensor([20.0,21.0,22.0,23.0],dtype=torch.float32)
# 2.创建 模型的预测值
y_pred = torch.tensor([21.0,22.0,23.0,24.0],dtype=torch.float32,requires_grad=True)

# 3.定义损失函数对象

loss_fn1 = nn.L1Loss()
loss_fn2 = nn.MSELoss()
loss_fn3 = nn.SmoothL1Loss()

# 4.计算损失值
loss1 = loss_fn1(y_pred,y_true)
loss2 = loss_fn2(y_pred,y_true)
loss3 = loss_fn3(y_pred,y_true)

# 5.打印损失值
print(f"损失值 MAE:{loss1}")    # 1
print(f"损失值 MSE:{loss2}")    # 2
print(f"损失值 Smooth:{loss3}") # 3
相关推荐
IT_陈寒1 分钟前
React的这个渲染问题连官方文档都没说清楚
前端·人工智能·后端
金銀銅鐵33 分钟前
[Python] 扩展欧几里得算法
python·数学·算法
Duckdblab1 小时前
DuckDB 性能调优终极指南:打造闪电般的分析体验
python
不加辣椒1 小时前
第12章 工具调用与 Agent 提示工程
人工智能
用户1693176172661 小时前
前端给AI消息做日期分组与时间线
人工智能
带派擂总1 小时前
Python全栈开发精华版最全合集(包含各种面试题) Day24_异常和错误
python
i晟1 小时前
Claude Code Harness 深度拆解:从你敲回车到模型回复,中间发生了什么
人工智能
用户252736278143 小时前
【踩坑复盘】我在本地跑 RAG 知识库时踩了 5 个大坑,吐血整理避坑指南
人工智能
大模型真好玩3 小时前
LangChain DeepAgents 速通指南(九)—— 生产级智能体框架 DeepAgents Code 源码导读
人工智能·langchain·agent
金銀銅鐵4 小时前
n^5 和 n 的个位数是否总相等?
python·数学