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 的区别和联系

KL Divergence

KL散度定义:
 
展开:
写成两个部分:

交叉熵 Cross Entropy

交叉熵定义:
所以:
注意:
于是:
其中 H(p) 是真实分布的
💡
在平常使用中 p 是真实标签、所以是常数。进一步地,如果是one-hot,则 H(p)=0。此时 CE = KL
 
上一篇
机器学习常用激活函数及其选型
下一篇
营销算法-增益模型(Uplift Model)