type
Post
status
Published
date
Nov 22, 2025
slug
summary
在机器学习与深度学习实践中,损失函数(Loss Function)是连接模型预测与优化目标的核心组件,它定义了模型“什么样的预测是好的”。不同任务(如回归、分类、排序或表征学习)对应的损失函数形式和优化目标也各不相同,因此合理选择损失函数往往对模型效果具有决定性影响。本文整理了工程与论文中常见的损失函数,并按照回归、分类(Pointwise)、排序(Pairwise/Listwise)以及表征学习等典型任务场景进行分类,总结其数学形式、核心思想和适用条件,帮助读者在实际建模与系统设计中快速理解各类损失函数的作用及选型依据。
tags
DL
NLP
ST
LLM
思考
精选
category
知行合一
icon
password
在机器学习与深度学习实践中,损失函数(Loss Function)是连接模型预测与优化目标的核心组件,它定义了模型“什么样的预测是好的”。不同任务(如回归、分类、排序或表征学习)对应的损失函数形式和优化目标也各不相同,因此合理选择损失函数往往对模型效果具有决定性影响。本文整理了工程与论文中常见的损失函数,并按照回归、分类(Pointwise)、排序(Pairwise/Listwise)以及表征学习等典型任务场景进行分类,总结其数学形式、核心思想和适用条件,帮助读者在实际建模与系统设计中快速理解各类损失函数的作用及选型依据。
回归模型
此类 Loss 主要计算「预测值」和「目标值」之间的差异,又称 Error
样本组织形式:
- 预测:[3.0, 4.5]
- 真实:[2.0, 5.0]
Loss函数 | 数学公式 | 取值范围 | 核心特点 | PyTorch 手搓实现代码(纯数学公式版) | 适用场景 | 为什么会出现 / 解决的问题 | 计算量 | 参数 |
MSE 均方误差
(Mean Squared Error) | [0,+∞) | 平滑可导、对大误差敏感 | ((y_pred - y_true)**2).mean() | 通用回归、离群值少 | 最早的回归优化目标 | 低 | 无 | |
MAE 平均绝对误差
(Mean Absolute Error) | [0,+∞) | 抗离群值、量纲一致、收敛慢 | torch.abs(y_pred - y_true).mean() | 含离群值回归 | 解决MSE对离群值敏感 | 低 | 无 | |
RMSE 均方根误差
(Root Mean Squared Error) | [0,+∞) | 量纲一致、可解释 | torch.sqrt(((y_pred - y_true)**2).mean()) | 需直观解释误差的回归 | 解决MSE量纲不直观 | 低 | 无 | |
MAPE 平均绝对百分比误差
(Mean Absolute Percentage Error) | [0,1] | 百分比、跨任务对比、零值无效 | (torch.abs((y_true-y_pred)/y_true)).mean()*100 | 销售额预测(无0值)、跨任务对比 | 解决误差跨任务不可比 | 低 | 无 | |
SMAPE 平滑平均绝对百分比误差
(Symmetric Mean Absolute Percentage Error) | [0,1] | 解决零值问题、百分比稳定 | (torch.abs(y_true-y_pred)/(torch.abs(y_true)+torch.abs(y_pred))).mean()*100 | 含0值的百分比误差对比 | 解决MAPE零值无效问题 | 低 | 无 | |
Huber Loss | [0,+∞) | 兼顾MSE/MAE、梯度平滑 | torch.where(torch.abs(e)<delta,0.5e**2,delta(torch.abs(e)-0.5*delta)).mean() | 抗离群值+稳定优化 | 解决MSE/MAE各自缺陷 | 低 | delta
阈值 |
分类模型
主要是计算「目标概率」和「预测概率」之间的差异,常用于 Pointwise 模型
样本组织形式:
- 二分类:预测概率:0.8,真实:1
- 多分类:预测:[0.1,0.7,0.2],真实:[0,1,0]
Loss函数 | 数学公式 | 取值范围 | 核心特点 | PyTorch 手搓实现代码(纯数学公式版) | 数据例子 | 适用场景 | 为什么会出现 / 解决的问题 | 计算量 | 参数 |
BCE 二分类交叉熵
(Binary Cross Entropy) | [0,+∞) | 概率分类标准 loss
自动切换正负 | -(y*torch.log(p)+(1-y)*torch.log(1-p)).mean() | 预测概率:0.8
真实:1 | CTR、二分类 | 最大似然估计,将分类问题转为概率优化 | 低 | 无 | |
多分类交叉熵
(Categorical Cross Entropy) | [0,+∞) | 多分类标准 loss | -(y_true*torch.log(p)).sum(dim=1).mean() | 预测:[0.1,0.7,0.2]
真实:[0,1,0] one-hot | 多分类 | softmax 分类概率最大化 | 中 | 无 | |
Weighted BCE 加权二分类交叉熵
*改进版BCE、有两种版本、扩展学习 | [0,+∞) | 对少数类加权 | -(w*(y*torch.log(p)+(1-y)*torch.log(1-p))).mean() | p=0.6,y=1,w=2 | CTR、广告 | 解决正负样本比例失衡 | 低 | weight | |
Sparse Cross Entropy
*改进版CCE,不用one-hot,指定某个类是正确的 | [0,+∞) | label不用one-hot | -torch.log(p[range(n), y]).mean() | 预测:[0.1,0.7,0.2]
label=1 | NLP、多分类 | 避免构造one-hot节省内存 | 低 | 无 | |
Label Smoothing CE
*改进版CCE | [0,+∞) | 防止模型过度自信 | -(y_smooth*torch.log(p)).sum(dim=1).mean() | 原标签:[1,0,0]
平滑后:[0.9,0.05,0.05] | 大模型训练、分类 | 缓解过拟合和过度置信 | 中 | smoothing | |
Focal Loss
*改进版CE | [0,+∞) | 关注困难样本 | -(1-p)**gamma * y * torch.log(p) | p=0.95
y=1 | 长尾分类、目标检测 | 解决类别不平衡 | 中 | γ |
Focal Loss 中的 有所不同,,()代表偏离正确标签的程度,偏离越大、越困难,损失越大。
https://blog.csdn.net/BIgHAo1/article/details/121783011
排序模型
主要计算「分数差异」或「分数排名」,常用于 Pairwise + Listwise 模型
样本组织形式:
- pairwise:正样本分数=3.5,负样本分数=2.1
- listwise:正样本分数=3.5,负样本分数=[2.1,1.2] 或者 衡量预测分数和真实排序的差异
Loss函数 | 数学公式 | 取值范围 | 核心特点 | PyTorch 手搓实现代码(纯数学公式版) | 数据例子 | 适用场景 | 为什么会出现 / 解决的问题 | 计算量 | 参数 |
BPR Loss | [0,+∞) | pairwise排序 | -torch.log(torch.sigmoid(pos - neg)).mean() | 正样本分数=3.5
负样本分数=2.1 | 推荐排序 | 推荐系统隐式反馈排序 | 中 | 无 | |
Margin Ranking Loss | [0,+∞) | pairwise+margin排序 | torch.clamp(m - (pos - neg), min=0).mean() | 正样本分数=3.5
负样本分数=2.1,m=1 | 排序学习 | 强制正样本比分数更高 | 低 | margin | |
Hinge Loss | [0,+∞) | pairwise+margin排序 | torch.clamp(m - y * y_pred, min=0).mean() | 预测y_pred score=0.4
标签=1 (-1或者+1) | SVM、排序 | 希望正确类别和错误类别有 margin | 低 | margin
默认为1 | |
Softmax Ranking | [0,+∞) | listwise 排序 | -torch.log(torch.exp(pos) / torch.exp(scores).sum()) | 正样本分数=3.5
负样本分数=[2.1,1.2] | 推荐排序 | listwise ranking
强制正样本比负样本分数更高 | 中 | 无 | |
ListNet | [0,+∞) | listwise 排序 | -(P_y * torch.log(P_r)).sum(dim=1).mean() | 预测score=[3.5,2.1,1.2]
真实排序=[A,B,C] | 推荐排序 | 直接优化排序分布 | 中 | 无 | |
LambdaRank | [0,+∞) | listwise 排序、ranking metric 优化 | torch.log(1 + torch.exp(-(pos - neg))) * lambda_ij | 正样本分数=3.5
负样本分数=2.1 | 搜索 / 推荐排序 | 近似优化 NDCG 等指标 | 中 | λ |
表征模型
主要计算「距离」,特别是在嵌入空间中,常用于嵌入模型
Loss函数 | 数学公式 | 取值范围 | 核心特点 | PyTorch 手搓实现代码(纯数学公式版) | 数据例子 | 适用场景 | 为什么会出现 / 解决的问题 | 计算量 | 参数 |
Triplet Loss | [0,+∞) | embedding 距离学习 | torch.clamp(d_ap-d_an+m,min=0).mean() | d(a,p)=0.4
d(a,n)=0.7 | embedding、召回 | 学习相似度空间,离正样本更近、负样本更远 | 中 | margin | |
InfoNCE | [0,+∞) | 对比学习 | -torch.log(pos/(pos+neg.sum())) | pos=2.3
neg=[1.2,0.9] | 自监督 | 表示学习,相比Triplet可以有多个负样本 | 高 | temperature | |
Contrastive Loss | [0,+∞) | 正负样本距离 | y*d**2 + (1-y)*torch.clamp(m-d,min=0)**2 | 距离= 0.3
label=1 | siamese | 度量学习 | 中 | margin |
概率分布模型
Loss函数 | 数学公式 | 取值范围 | 核心特点 | PyTorch 手搓实现代码(纯数学公式版) | 数据例子 | 适用场景 | 为什么会出现 / 解决的问题 | 计算量 | 参数 |
KL Divergence | [0,+∞) | 衡量两个概率分布差异 | (p * torch.log(p/q)).sum(dim=1).mean() | p=[0.7,0.3]
q=[0.6,0.4] | 知识蒸馏、生成模型 | 让预测分布接近目标分布、不一定one-hot、one-hot时 | 中 | 无 |
其他
工程上的优化
Loss函数 | 数学公式 | 取值范围 | 核心特点 | PyTorch 手搓实现代码(纯数学公式版) | 数据例子 | 适用场景 | 为什么会出现 / 解决的问题 | 计算量 | 参数 |
*Sampled Softmax | [0,+∞) | 采样 softmax | -torch.log(torch.exp(pos) / (torch.exp(pos) + torch.exp(neg).sum())) | 正样本分数=3.5
采样负样本分数=[1.2,0.5] | 大规模推荐 | 减少 softmax 计算 | 低 | 采样数 |
推荐系统场景比较重要的
- MSE、MAE
- Cross Entropy (BCE / CE)
- BPR Loss
- LambdaRank / Listwise Loss
- Hinge Loss / Focal Loss
- Triplet Loss / InfoNCE / Contrastive Loss
- KL Divergence
类型 | Loss |
CTR预测 | LogLoss / BCE |
排序 | BPR Loss |
排序指标优化 | LambdaRank |
embedding学习 | Triplet / Contrastive |
大规模item | Sampled Softmax |
题外话1: Cross Entropy 和 KL Divergence 的区别和联系
在平常使用中 p 是真实标签、所以是常数。进一步地,如果是one-hot,则 H(p)=0。此时 CE = KL
- Author:YelloooBlue
- URL:https://tangly1024.com/article/31be32f0-1b7f-80a9-ad86-d2a638b7256d
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!





