刷到一个挺有意思的话题,结合自己之前的经验,整理了一下核心要点。
🔥深度学习核心:损失函数完全解析 —— 从原理到 PyTorch 实战
二、损失函数分类:按任务对号入座三、重点精讲:多分类交叉熵损失(Cross Entropy Loss) 四、PyTorch 代码实战:多分类交叉熵损失 五、总结与工程要点Bilibili 视频
图形学入门|漫反射光照原理:从光能吸收到像素着色全解析
在深度学习的世界里,当大家搭建好神经网络架构后,如何衡量模型的优劣就成为了核心问题。而答案,正是损失函数✨。它如同模型的 “裁判官”,用精准的数值告诉大家:当前的网络预测,与真实标签之间究竟存在多大偏差。
本文将带你彻底吃透损失函数的本质、分类,并重点拆解多分类交叉熵损失的原理与代码实现,让你从理论到落地一步到位。
一、损失函数:模型的 “质量标尺”
1.1 核心定义
损失函数,是深度学习中用于衡量模型参数质量的关键工具。
它的核心逻辑挺直白:
计算「模型输出的预测值」与「数据真实标签」之间的差异,这个差异值就是误差,误差越小,代表模型拟合效果越好。
也能用一句话总结:
损失函数 → 衡量模型拟合好坏 → 指导网络参数更新
1.2 别名大全(一义多词)
在不同论文、框架、教材中,你会看到它有各种 “马甲”,但本质完全一致:
- 损失函数(Loss Function)
- 代价函数(Cost Function)
- 目标函数(Objective Function)
- 误差函数(Error Function)
二、损失函数分类:按任务对号入座
根据深度学习的两大核心任务,损失函数分为分类任务损失与回归任务损失两大类,常用的共 5 种,是工程中高频使用的核心选型👇。
任务类型损失函数英文名称核心特点分类任务二分类交叉熵BCE Loss专门用于二分类场景多分类交叉熵Cross Entropy Loss多分类标配,自带 Softmax回归任务平均绝对误差MAE对异常值鲁棒性较强均方误差MSE梯度平滑,易优化平滑 L1 损失Smooth L1融合 MAE+MSE,更稳定
✍️ 工程建议:回归任务优先使用 Smooth L1,兼顾稳定性与梯度特性。
三、重点精讲:多分类交叉熵损失(Cross Entropy Loss)
多分类问题是深度学习最常用的场景(图像分类、文本分类等),而交叉熵损失是绝对的主流选择。
3.1 核心特性:内置 Softmax
这是多分类交叉熵最关键的知识点,务必牢记:
Cross Entropy Loss = Softmax 激活 + 损失计算
这意味着:
使用多分类交叉熵时,网络输出层无需手动写 Softmax!框架底层已自动完成。
3.2 原理流程
大家用 Mermaid 流程图清晰展示计算链路:
输入样本X
全连接层/加权求和
Logits(预测分数)
Softmax激活 → 概率分布
计算 -y·log(p)
累加求和 → 最终损失
流程图说明:
1. 样本经过网络得到原始预测分数(Logits);
2. Softmax 将分数转为 0~1 之间的概率,且所有类别概率和为 1;
3. 用真实标签y(仅正确类别为 1,其余为 0)与预测概率计算损失;
4. 对所有样本累加,得到最终损失值。
3.3 公式与白话解释
损失公式:
L
=
−
s
u
m
i
=
1
N
y
i
c
d
o
t
l
o
g
(
p
i
)
L = -sum_{i=1}^{N} y_i cdot log(p_i)
L=−sumi=1Nyicdotlog(pi)
- y
y_i
yi:真实概率(0 或 1,正确类别为 1)
- p
i
p_i
pi:模型预测的类别概率
- N
N
N:样本数量
大白话搞懂:
我们的优化目标,就是最小化「正确类别对应预测概率的对数的负值」。
由于真实标签只有正确类为 1,其余为 0,计算时只有正确类别项生效,错误类别会被直接忽略。
四、PyTorch 代码实战:多分类交叉熵损失
理论落地才是硬道理,下面用 PyTorch 完整实现多分类交叉熵计算,可直接复制运行✅。
4.1 完整代码
# 1. 导包
import torch
import torch.nn as nn
def demo_cross_entropy():
# 2. 定义真实标签(one-hot/类别索引均可)
# one-hot形式:010 代表第2个类别为正确类别
y_true = torch.tensor([[0, 1, 0]], dtype=torch.float32)
# 索引形式:等价于 010,直接写类别序号
# y_true = torch.tensor([1])
# 3. 定义模型预测值(Logits,未经过Softmax!)
y_pred = torch.tensor([[0.12, 1.0, 0.3]], dtype=torch.float32, requires_grad=True)
# 4. 定义多分类交叉熵损失(自动包含Softmax)
criterion = nn.CrossEntropyLoss()
# 5. 计算损失
loss = criterion(y_pred, y_true)
# 6. 输出结果
print("多分类交叉熵损失值:", loss.item())
if __name__ == "__main__":
demo_cross_entropy()
4.2 代码关键说明
1. 预测值无需 Softmax:直接传入网络原始输出(Logits);
2. 标签支持两种格式:One-hot 编码 或 类别索引;
3. requires_grad=True:开启梯度,用于后续参数更新;
4. 默认计算平均损失:reduction="mean",符合训练习惯。
五、总结与工程要点
1. 损失函数本质:衡量预测值与标签的差异,指导模型优化;
2. 别名统一认知:Loss/Cost/Objective/Error 完全等价;
3. 任务选型:
- 分类 → BCE(二分类)/CrossEntropy(多分类)
- 回归 → MAE/MSE/SmoothL1
掌握损失函数,就掌握了深度学习模型训练的 “方向盘”。无论模型结构如何变化,损失函数的优化逻辑始终是训练的核心💡。
以上就是这次整理的全部内容,希望对你有所启发。如果有不同见解,欢迎在评论区交流讨论。
评论 (0)
暂无评论