损失函数的构造是机器学习中的核心难点之一,但它的本质逻辑实则很朴素:用一个数学公式量化 “模型预测结果” 与 “真实结果” 之间的差异。差异越大,损失函数的值就越大;差异越小,损失函数的值就越小。模型训练的目标就是通过调整参数,让这个 “差异值” 尽可能小。
先从 “直观需求” 理解损失函数的构造逻辑
以多分类问题为例,我们希望模型满足两个核心需求:
- 对真实类别的预测概率尽可能高(列如样本实际是 “猫”,模型预测 “猫” 的概率最好接近 1);
- 对非真实类别的预测概率尽可能低(列如样本实际是 “猫”,模型预测 “狗”“鸟” 的概率最好接近 0)。
损失函数的构造,就是要把这两个需求翻译成数学公式。
多分类交叉熵损失的构造过程:从 “单个样本” 入手
假设我们有一个 3 分类问题(类别 A、B、C),某个样本的真实标签是 “B”。用独热编码表明真实标签就是 [0, 1, 0](只有真实类别位置为 1,其余为 0)。
模型对这个样本的预测概率是
(列如 [0.2, 0.7, 0.1]),其中
(softmax 保证)。
第一步:聚焦 “真实类别” 的预测概率
我们最关心的是模型对 “真实类别 B” 的预测概率
。显然:
- 如果
接近 1(列如 0.9),说明预测很好,损失应该很小; - 如果
接近 0(列如 0.1),说明预测很差,损失应该很大。
什么样的函数能满足 “输入越接近 1,输出越接近 0;输入越接近 0,输出越接近无穷大”?
答案是 -log(x) 函数(x 是预测概率,范围 (0,1)):
- 当 x→1 时,-log (x)→0(损失小);
- 当 x→0 时,-log (x)→+∞(损失大)。
这一步已经能满足对 “真实类别” 的惩罚需求:
就是针对真实类别 B 的损失。
第二步:如何处理 “非真实类别”?
在多分类问题中,“非真实类别的概率小” 是 “真实类别的概率大” 的自然结果,不需要额外在损失函数中单独惩罚非真实类别。
真实标签是 [0, 1, 0],非真实类别 A 和 C 的标签是 0。只要乘以标签 0,结果就是 0,不会增加损失。只有真实类别(标签为 1)的项会贡献损失。
因此,扩展到 K 个类别的通用公式就是:

其中,
是独热编码的真实标签(1 表明真实类别,0 表明其他),
是模型预测的类别 k 的概率。
举例:用具体数值感受损失的变化
- 案例 1:样本真实是 B,模型预测 [0.1, 0.8, 0.1](预测较好)
- 损失 = – [0・log (0.1) + 1・log (0.8) + 0・log (0.1)] = -log (0.8) ≈ 0.22(损失小)
- 案例 2:样本真实是 B,模型预测 [0.7, 0.2, 0.1](预测较差)
- 损失 = -log (0.2) ≈ 1.61(损失大)
- 案例 3:样本真实是 B,模型预测 [0.01, 0.99, 0.00](预测极好)
- 损失 = -log (0.99) ≈ 0.01(损失极小)
显然,这个公式完美符合我们的直观需求:真实类别预测越准,损失越小;越不准,损失越大。
总结:损失函数构造的通用思路
- 明确任务目标:分类问题关注 “类别概率的准确性”,回归问题关注 “数值预测的偏差”,目标不同,损失函数的设计方向不同。
- 定义 “好 / 坏” 的量化标准:列如分类中 “真实类别概率高 = 好”,用 – log (x) 惩罚低概率;回归中 “预测值与真实值接近 = 好”,用平方差或绝对值衡量偏差。
- 保证可优化性:损失函数需要连续、可导(或分段可导),才能用梯度下降等算法更新参数(列如 – log (x) 是光滑可导的,适合优化)。
交叉熵损失之所以成为分类问题的首选,正是由于它精准捕捉了 “概率分布匹配” 的核心需求,且数学性质友善(可导、惩罚合理)。多分类的交叉熵只是二分类的自然扩展(二分类中 K=2,损失简化为
),本质逻辑完全一致。


