type
Post
status
Published
date
Nov 22, 2025
slug
summary
在机器学习与深度学习实践中,损失函数(Loss Function)是连接模型预测与优化目标的核心组件,它定义了模型“什么样的预测是好的”。不同任务(如回归、分类、排序或表征学习)对应的损失函数形式和优化目标也各不相同,因此合理选择损失函数往往对模型效果具有决定性影响。本文整理了工程与论文中常见的损失函数,并按照回归、分类(Pointwise)、排序(Pairwise/Listwise)以及表征学习等典型任务场景进行分类,总结其数学形式、核心思想和适用条件,帮助读者在实际建模与系统设计中快速理解各类损失函数的作用及选型依据。
tags
DL
开发
思考
精选
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)
当 时才为0 | 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
部分细节补充
Hinge Loss
根据svm的设定,当样本点分类正确的时候,有:
对于正类:
对于负累:
根据上面两个公式可以推出,理想情况:
- ≥m:分对,且在最大间隔之外,完美(Loss直接为0,不关注)
- 0~m:分对,但挤进间隔里,不完美
- ≤0:分错,严重错误
SVM 最终模型只由少数样本决定,这些样本叫支持向量。损失=0的样本:对模型完全没影响。损失>0的样本:在间隔上/间隔内/分错 → 就是支持向量
提到二分类的损失函数,我们经常能想到0/1损失函数,但是在经典二分类器SVM中却没有使用0/1损失函数,而是采用诸如Hinge损失的替代损失函数,这是何故?
损失 | 特点 | SVM 为什么不用 |
0-1 损失 | 对就 0,错就 1,不连续、不可导 | 没法梯度下降 |
交叉熵损失 | 永远在惩罚,越近越罚 | 不强调 “间隔” |
Hinge Loss | 只惩罚错分 + 间隔内的点,间隔外一律 0 | 完美匹配 SVM 最大间隔思想 |
- 图中绿色的线为 Square Loss
- 蓝色的线为 Hinge Loss
- 红的的线为负 Logistic 损失
- 黑色的线为0-1损失。
Reference
zhuanlan.zhihu.com
zhuanlan.zhihu.com
Programmathically - A Blog on Building Machine Learning SolutionsUnderstanding Hinge Loss and the SVM Cost Function - Programmathically
Understanding Hinge Loss and the SVM Cost Function - Programmathically
Sharing is caringTweetIn this post, we develop an understanding of the hinge loss and how it is used in the cost function of support vector machines. Hinge Loss The hinge loss is a specific type of cost function that incorporates a margin or distance from the classification boundary into the cost calculation. Even if new […]


- 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!





