机器学习中的损失函数:什么是损失函数?为什么要有损失函数?怎样选择合适的损失函数? - 指南
一、什么是损失函数?为什么要有损失函数?
核心定义:
- 损失函数(也称为代价函数, Cost Function)是一个数学函数。
- 输入:
- 模型对单个样本或一批样本的预测值(
ŷ,模型输出的结果)。 - 该样本或批样本对应的真实值/目标值(
y,数据标签或真实测量值)。
- 模型对单个样本或一批样本的预测值(
- 输出: 一个标量值(Scalar Value),表示模型预测值与真实值之间的差异或“错误”的程度。这个值越大,表示模型预测得越差;值越小(通常趋近于0),表示模型预测得越好。
为什么要有损失函数?
- 量化模型性能:模型预测的好坏需要一个客观、可计算的指标来衡量。损失函数就是这个指标。它把抽象的“预测准不准”转化成了一个具体的数字。
- 指导模型学习(训练阶段的核心):这是损失函数最关键的作用。在训练阶段:
- 模型通过前向传播得到预测
ŷ。 - 损失函数计算
ŷ和y的差异L(ŷ, y)。 - 优化算法(如梯度下降)的核心目标就是最小化这个损失函数
L。 优化算法会计算损失函数关于模型参数(权重w和偏置b)的梯度(导数)∇L(w, b)。 - 梯度指示了参数应该朝哪个方向调整(增加或减少)才能让损失函数减小。
- 模型参数根据梯度的反方向进行更新:
w = w - η * ∇L(w, b)(η是学习率)。 - 这个过程反复迭代,目的是找到一组模型参数,使得在训练数据上的平均损失最小。模型就是在不断“学习”如何减小预测错误。
- 模型通过前向传播得到预测
- 模型比较与选择:不同模型架构或不同超参数设置可以用在相同验证集上的损失值来比较优劣,选择损失更小的模型。
- 定义优化目标:损失函数明确地定义了模型需要优化的具体目标(例如,最小化预测误差的平方和、最大化预测正确的概率等)。
总结:损失函数是模型学习的“指南针”和“成绩单”。它告诉模型当前错在哪、错得多严重(计算损失值),并指引模型如何改进(提供梯度方向)。没有损失函数,模型就失去了学习和优化的方向。
二、训练时的损失函数 vs. 推理时的损失函数
这里存在一个重点的概念区分:
**训练阶段区分:
训练阶段 (Training Stage):
- 目的:学习模型参数,使模型能够从数据中捕捉模式和关系。
- 损失函数的作用:
- 核心驱动:如前所述,损失函数是优化算法的核心输入。通过计算损失和梯度,直接驱动模型参数的更新。
- 监控训练过程:观察训练损失随迭代次数的变化(训练曲线),可以判断模型是否在学习(损失是否在下降)、是否过拟合(训练损失持续下降但验证损失开始上升)或欠拟合(训练损失居高不下)。
- 可能包含正则化项:训练损失函数通常会包含正则化项(如L1正则化、L2正则化),用于惩罚模型复杂度,防止过拟合。此时总损失 = 数据损失(预测误差) + λ * 正则化项。
λ是控制正则化强度的超参数。
- 计算频率:计算非常频繁,每个批次(batch)的数据都会计算一次损失并更新梯度。
推理阶段 (Inference Stage / Evaluation Stage):
- 目的:使用训练好的模型对新的、未见过的数据进行预测。
- 损失函数的作用:
- 评估模型性能:这是推理阶段损失函数的主要作用。计算模型在测试集(Test Set) 或验证集(Validation Set)上的平均损失(如平均交叉熵、平均MSE),提供一个客观、定量的指标来评估模型在真实世界数据上的泛化能力。这个指标通常是我们报告模型性能的核心依据(如Test Loss, Test Accuracy)。
- 模型选择与调优的依据:比较不同模型或超参数在验证集上的损失(或相关指标,如准确率),决定最终采用哪个模型或参数配置。
- 不用于参数更新:在推理阶段,:在推理阶段,模型参数是固定不变的,不会根据损失函数的计算结果进行梯度下降或参数更新。
- 通常不包含正则化项:模型在数据本身上的表现,因此计算损失时通常只使用纯粹的材料损失部分,就是评估模型泛化性能时,大家关心的不包括训练时添加的正则化项。
- 计算频率:通常在训练完成后或固定周期(如每个epoch结束时)在整个验证集/测试集上计算一次。
关键区别总结:
| 特性 | 训练阶段 (Training) | 推理阶段 (Inference/Evaluation) |
|---|---|---|
| 目的 | 学习模型参数 | 采用模型进行预测,评估模型性能 |
| 损失作用 | 驱动优化(计算梯度更新参数) + 监控训练过程 | 仅用于评估性能(不更新参数) |
| 参数更新 | 是(基于损失梯度) | 否(参数冻结) |
| 正则化 | 通常涵盖(防止过拟合) | 通常不包含(只评估资料损失) |
| 计算频率 | 每个批次(Batch) | 每个Epoch结束或训练完成后(整个信息集) |
| 核心数据 | 训练集(Training Set) | 验证集(Validation Set)/测试集(Test Set) |
三、损失函数的作用(再强调与扩展)
损失函数的核心作用贯穿整个机器学习工作流:
- 量化预测误差 (Quantifying Error): 将预测值
ŷ与真实值y的差异转化为一个单一可比较的数值L。 - 指导模型优化 (Guiding Optimization - 训练核心): 提供梯度
∇L,告诉优化器如何调整模型参数才能减少预测误差。这是模型“学习”的驱动力。 - 评估模型性能 (Evaluating Performance):在训练和验证/测试集上计算损失,监控学习进度、诊断问题(过拟合/欠拟合)、比较不同模型或配置的优劣。
- 定义学习目标 (Defining the Learning Objective):明确模型应该学习什么。不同的损失函数引导模型优化不同的目标(如最小化平方误差 vs 最大化似然)。
- 融入先验知识/约束 (Incorporating Prior Knowledge/Constraints):借助设计特殊的损失函数或添加正则化项,可以引导模型学习符合特定领域知识或满足某些约束的解决方案(例如,稀疏性、平滑性)。
四、常见的损失函数类型(全面讲解)
损失函数的选择高度依赖于具体的机器学习任务类型(回归、分类、排序等)以及对错误的容忍度或关注点否强调概率校准等)。以下分类介绍常见的重要损失函数:就是(是否对离群点敏感、
1. 回归任务 (Regression - 预测回归任务 (Regression - 预测连续值)
**均连续值)
均方误差 (Mean Squared Error, MSE / L2 Loss):
- 公式:
MSE = (1/N) * Σ(ŷ_i - y_i)² - 解释:计算预测值与真实值之差的平方的平均值。
- 特性:
- 对离群点(Outliers)敏感:平方项放大了大误差的惩罚,模型会极力避免大的错误。
- 连续可导,优化方便。
- 假设误差服从高斯分布(正态分布)时,MSE 对应于极大似然估计。
- 应用场景:房价预测、股票价格预测、温度预测等大多数回归问题。当大误差代价高昂时尤其适用。
- 公式:
平均绝对误差 (Mean Absolute Error, MAE / L1 Loss):
- 公式:
MAE = (1/N) * Σ|ŷ_i - y_i| - 解释:计算预测值与真实值之差的绝对值的平均值。
- 特性:
- 对离群点鲁棒:不像 MSE 那样放大离群点的影响,对异常值不敏感。
- 在零点不可导(需要特殊处理,如次梯度),但优化依然可行。
- 假设误差服从拉普拉斯分布时,MAE 对应于极大似然估计。
- 应用场景:当数据中存在显著离群点,且希望模型不过分受其影响时(如预测收入、某些传感器材料)。也常用于应该稀疏性的场景(与 L1 正则化结合)。
- 公式:
Huber Loss:
- 公式:
解释:MSE 和 MAE 的混合体/平滑过渡。当误差绝对值小于阈值 `δ` 时,表现像 MSE(二次函数,可导性强);当误差大于 `δ` 时,表现像 MAE(线性增长,对离群点鲁棒)。
特性:结合了 MSE 和 MAE 的优点:在误差较小时利用 MSE 的良好收敛性,在误差较大时保持 MAE 的鲁棒性。超参数 `鲁棒性。超参数 `δ` 控制着从二次到线性的切换点。
应用场景:回归疑问,特殊是数据中可能存在离群点,但又不想完全放弃 MSE 在误差小区域的优化特性的情况。
- 分位数损失 (Quantile Loss):
- 公式:
L_τ(ŷ, y) = { τ * |y - ŷ| if y >= ŷ (1 - τ) * |y - ŷ| if y < ŷ } - 解释:用于预测特定分位数均值。就是(如中位数 τ=0.5,90%分位数 τ=0.9)而不仅仅
- 特性: 通过调整
τ(分位点),可以控制对预测值过高或过低的惩罚不对称性(例如,τ=0.9 时,低估的惩罚是高估惩罚的9倍)。MAE 是 τ=0.5 时的特例。 - 应用场景: 金融 应用场景:金融风险(VaR预测)、需要预测区间(预测值 + 置信区间)、资源规划(如库存管理,高估和低估成本不同)等对预测分布不同位置感兴趣或需要非对称损失的情况。
- 公式:
2. 分类任务 (Classification - 预测离散标签)
- 交叉熵损失 (Cross-Entropy Loss):
- 二元交叉熵 (Binary Cross-Entropy, BCE):
- 公式:
BCE = - [y * log(ŷ) + (1 - y) * log(1 - ŷ)](其中y是其中y是二值标签0或1,ŷ是预测为正类的概率) - 应用:二分类问题(如垃圾邮件检测、点击率预测)。
- 公式:
- 分类交叉熵/负对数似然 (Categorical Cross-Entropy, CCE / Negative Log-Likelihood, NLL):
- 公式:
CCE = - Σ_c y_c * log(ŷ_c)(其中c遍历所有类别,y_c是真实标签的one-hot编码,即真实类别为1其他为0,ŷ_c是模型预测的类别c的概率) - 应用:多分类问题的标准损失函数分类问题的标准损失函数**(如图像分类、文本分类)。通常与Softmax激活函数配合启用。
- 公式:
- 稀疏分类交叉熵 (Sparse Categorical Cross-Entropy):
- 公式: 与CCE本质相同,但输入形式不同。
y直接是类别的整数索引(而非one-hot向量),ŷ仍然是每个类别的概率向量。内部计算时会自动转换为one-hot形式(效率更高)。
- 公式: 与CCE本质相同,但输入形式不同。
- 特性:
- 衡量两个概率分布(真实标签的分布 - 通常是one-hot,和预测概率分布)之间的差异。
- 当预测概率
ŷ_c非常接近真实标签y_c(对于正确类别接近1,错误类别接近0)时,损失值很小。 - 当预测概率分布与真实分布差异很大时(尤其是正确类别的概率低),损失值急剧增大。对“确信但错误”的预测惩罚极其严厉(log(接近0)会得到一个很大的负数,再取负号变成很大的正损失),这强烈驱动模型提高正确类别的预测置信度。
- 是极大似然估计(MLE)框架下分类问题的自然损失函数。
- 二元交叉熵 (Binary Cross-Entropy, BCE):
- 合页损失 (Hinge Loss):
- 公式:
Hinge = max(0, 1 - ŷ * y)(其中y是真实标签 ±1,ŷ是模型输出的“原始”分数/决策函数值,未经概率化) - 应用:支持向量机(SVM)的标准损失函数。
- 特性:
- 不仅要求分类正确(
ŷ * y > 0),还要求其置信度足够高(ŷ * y >= 1)。只有当分数超过边界(margin)时,损失才为0。 - 对正确分类但置信度不高的样本(0 <
ŷ * y< 1)和错误分类的样本(ŷ * y< 0)都进行惩罚。 - 为不同类别的样本之间创建一个明显的“间隔”(margin)。就是目标
- 不仅要求分类正确(
- 公式:
- KL散度 (Kullback-Leibler Divergence):
- 公式:
KL(P || Q):**KL(P || Q) = Σ_i P(i) * log(P(i) / Q(i))(其中P是目标分布,Q` 是模型分布) - 解释: 衡量一个概率分布
P与另一个概率分布Q之间的差异或信息 之间的差异或信息损失**。它不是对称的(KL(P||Q) ≠ KL(Q||P))。 - 应用:
- 知识蒸馏: KL散度是知识蒸馏中常用的损失函数,用于使学生模型的输出概率分布
Q逼近教师模型的“软目标”概率分布P。 - 变分自编码器 (VAE):用于衡量学习到的隐变量后验分布与预设的先验分布之间的差异(作为正则项)。
- 模型压缩、概率模型校准:衡量模型预测分布与真实数据分布的差异。
- 知识蒸馏: KL散度是知识蒸馏中常用的损失函数,用于使学生模型的输出概率分布
- 公式:
- Focal Loss:
- 公式:
FL = - α_t * (1 - ŷ_t)^γ * log(ŷ_t)(其中ŷ_t是模型对真实类别t的预测概率,α_t是类别权重因子,γ是可调节参数) - 解释:对标准交叉熵的改进,用于解除类别极度不平衡问题。
- 特性:
(1 - ŷ_t)^γ是一个调制因子。对于容易分类的样本(ŷ_t接近1),该因子接近0,大幅降低其损失贡献。对于难分类的样本(ŷ_t较小),该因子接近1,损失基本保持不变或略有调整。α_t用于手动调节不同类别的重要性(常对稀有类别给予更大的权重)。- 借助降低简单样本的权重,使模型在训练时更加关注困难的、稀有的样本。
- 应用:目标检测(如RetinaNet)、医学图像分割等存在严重类别不平衡的场景。
- 公式:
3. 其他任务与高级损失
- 对比损失 (Contrastive Loss)、三元组损失 (Triplet Loss):
- 目的: 学习一个嵌入空间(Embedding Space),使得相似样本的嵌入距离近,不相似样本的嵌入距离远。
- 公式 (Triplet Loss 示例):
L = max(0, d(anchor, positive) - d(anchor, negative) + margin)其中d是距离度量(如欧氏距离),anchor是锚样本,positive是与anchor同类的样本,negative是不同类的样本,margin是边界。 - 应用:人脸识别、图像检索、语义相似度学习、表示学习。
- Wasserstein Loss (Earth Mover's Distance - EMD):
- 目的:衡量两个概率分布之间的距离,在度量空间上定义,考虑了分布的整体几何结构。
- 应用:生成对抗网络(GANs)尤其是Wasserstein GAN (WGAN),用于提供更稳定、更合理的梯度信号;最优传输障碍。
- 自定义损失函数 (Custom Loss Functions):
- 目的:针对特定业务需求或领域知识设计独特的优化目标。
- 示例:
- 在推荐框架中,对顶部推荐位置的错误给予更高惩罚。
- 在医疗诊断中,对漏诊(False Negative)的惩罚远高于误诊(False Positive)。
- 在机器人控制中,结合任务完成度、能量消耗、安全性等多个目标。
- 要求:设计自定义损失必须深入理解问题、数学表达能力和对优化过程的影响评估。
五、如何选择损失函数?
选择损失函数没有绝对的金科玉律,需要考虑以下因素:
- 任务类型:这是首要决定因素。
- 回归任务:MSE, MAE, Huber, Quantile Loss.
- 二分类:Binary Cross-Entropy, Hinge Loss.
- 多分类:Categorical Cross-Entropy / Sparse Categorical Cross-Ent / Sparse Categorical Cross-Entropy.
- 学习嵌入/度量:Contrastive Loss, Triplet Loss.
- 概率分布匹配:KL Divergence, Wasserstein Loss.
- 极度类别不平衡:Focal Loss.
- 数据特性:
- 离群点:数据有离群点?有离群点?考虑 MAE 或 Huber Loss(比 MSE 更 Loss(比 MSE 更鲁棒)。
- 类别不平衡:分类问题中类别样本数差异巨大?考虑 Focal Loss 或对交叉熵进行 Loss 或对交叉熵进行类别加权。
- **类别加权。
- 预测目标:需要预测均值(MSE)?中位数(MAE/Quantile τ=0.5)?特定分位数(Quantile Loss)?概率分布(交叉熵)?
- 模型输出:
- 输出是概率(如Softmax后)?运用交叉熵。
- 输出是实数分数(如SVM)?利用Hinge Loss。
- 输出是分布?使用KL或Wasserstein距离。
- 优化稳定性:函数是否光滑可导(影响梯度下降)?Hinge Loss在零点不可导需要次梯度,MAE在零点不可导,而MSE、交叉熵处处可导。
- 业务需求:不同类型的错误代价是否不同?需要非对称惩罚?需要关注特定样本?使用自定义损失或调整现有损失(如加权交叉熵、分位数损失)。
- 经验与实践:参考相关领域成功应用的经典损失函数,并在自己的数据集上进行实验比较(A/B测试不同损失函数在验证集上的性能)。
总结
损失函数是机器学习的基石。它:
- 量化预测误差,为模型性能献出客观度量。
- 驱动模型训练,通过梯度下降指导参数优化(这是其在训练阶段的核心作用)。
- 评估模型泛化能力(在推理/评估阶段)。
- 定义学习目标,不同的损失函数引导模型关注不同的优化方向。
- 类型多样,需根据任务(回归/分类/其他)、资料特性(离群点、不平衡)、输出形式、业务需求等谨慎选择。从基础的 MSE、MAE、交叉熵到麻烦的对比损失、Wasserstein损失、Focal损失以及自定义损失,各有其适用场景。
理解损失函数的原理和作用,是理解和应用机器学习模型的关键一步。选择合适的损失函数,能显著提升模型的训练效果和最终性能。
浙公网安备 33010602011771号