说说深度学习核心:损失函数完全解析 —— 从原理到 PyTorch 实战

刷到一个挺有意思的话题,结合自己之前的经验,整理了一下核心要点。

🔥深度学习核心:损失函数完全解析 —— 从原理到 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=1N​yi​cdotlog(pi​)

  • y
i

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
4. 多分类交叉熵黄金规则自带 Softmax,输出层禁止重复添加

掌握损失函数,就掌握了深度学习模型训练的 “方向盘”。无论模型结构如何变化,损失函数的优化逻辑始终是训练的核心💡。


以上就是这次整理的全部内容,希望对你有所启发。如果有不同见解,欢迎在评论区交流讨论。

评论 (0)

暂无评论