损失函数
本章节既适合在刚开始学习深度学习时看,也适合在学习完大部分基础深度学习内容后回过头来重新理解损失函数的含义。损失函数概念贯彻整个深度学习过程,从不同的角度来看会有不同的发现。
本报告系统梳理损失函数(Loss Function)在统计学、信息论、物理学、经济学等多个学科视角下的本质理解,并覆盖工程实现中的关键细节,适合希望建立深层认知体系的研究者与工程师。
如何阅读本报告
本报告分为六个层次递进的模块:
| 模块 | 解决的问题 |
|---|---|
| 第一章:概念澄清 | "损失"和"代价"到底有什么区别? |
| 第二章:学科视角 | 不同领域的学者如何理解损失函数的本质? |
| 第三章:任务汇总 | 面对具体任务,有哪些损失函数可以选择? |
| 第四章:前沿进展 | LLM、自监督学习等前沿方向用什么损失函数? |
| 第五章:工程实践 | 代码实现中有哪些常见的坑? |
| 第六章:选择指南 | 给定一个任务,我应该用什么损失函数? |
建议阅读路线:初学者按顺序阅读;有经验的读者可直接跳至第三章或第六章。
目录
1. 五大核心概念的跨维度对齐
在不同文献中,损失、代价、目标、误差、风险这五个词经常混用,导致初学者极度困惑。本章从作用范围、包含项、学科起源三个维度彻底对齐这些概念。
1.1 全概念对比矩阵
| 概念名称 | 核心符号惯例 | 作用范围 (Scope) | 包含成分 (Composition) | 学科/理论起源 |
|---|---|---|---|---|
| 损失函数 (Loss Function) | \(L,\ \ell,\ \mathcal{L}\) | 单样本 | 仅包含预测误差 | 统计决策理论 |
| 代价函数 (Cost Function) | \(J,\ C\) | 全数据集 | 损失的均值/总和 + 正则化项 | 经典优化理论 |
| 目标函数 (Objective Function) | \(f,\ \Phi,\ \mathcal{O}\) | 优化过程 | 任何需要优化的项(含 Reward) | 数学规划/运筹学 |
| 误差函数 (Error Function) | \(E,\ \epsilon\) | 性能度量 | 纯粹的数值偏差(如\(y - \hat{y}\)) | 经典工程/控制学 |
| 风险函数 (Risk Function) | \(R,\ \mathcal{R}\) | 概率期望 | 损失函数在概率分布上的期望 | 统计学习理论 |
1.2 层级关联:五个概念的包含关系
五个概念之间存在清晰的层级结构,而非并列关系:
目标函数 (Objective) ← 最上位概念,包含一切需要优化的量
└── 代价函数 (Cost) ← 监督学习中目标函数的具体化
└── 损失函数 (Loss) ← 代价函数在单样本上的分解
└── 误差函数 (Error) ← 损失函数的最简形式(纯偏差)
风险函数 (Risk) ← 独立维度:损失函数在未知分布上的概率期望
从 Loss 到 Cost
代价函数 \(J(\theta)\) 是损失函数 \(\ell\) 在训练集上的聚合,通常还附加正则化项:
助记口诀:Loss starts with "Lonely"——损失函数针对孤立的单样本。
从 Cost 到 Objective
目标函数是更上位的概念:
- 在监督学习中,目标函数通常就是最小化代价函数;
- 在强化学习中,目标函数可能是最大化累计奖励(Reward);
- 在GAN中,目标函数是一个极大极小博弈(Minimax Game)。
从 Loss 到 Risk
| 维度 | 经验风险 (Empirical Risk) | 真实风险 (Expected Risk) |
|---|---|---|
| 定义 | 损失函数在训练集上的均值 | 损失函数在真实数据分布上的期望 |
| 公式 | \(R_{emp} = \frac{1}{n}\sum_{i=1}^n \ell(y_i, f(x_i))\) | \(R = \mathbb{E}_{(x,y) \sim P}[\ell(y, f(x))]\) |
| 可计算性 | ✅ 可直接计算 | ❌ 真实分布\(P\) 未知 |
训练模型的本质是:利用经验风险最小化(ERM)来近似真实风险最小化。泛化能力的好坏,由两者之间的差距(泛化误差)决定。
1.3 实际案例:五个概念在同一项目中的体现
案例:训练一个房价预测模型
假设你在用神经网络预测某城市的房价:
- 误差(Error):对第 3 号房子,模型预测 \(\hat{y}_3 = 150\) 万,真实价格 \(y_3 = 180\) 万,误差 \(e_3 = y_3 - \hat{y}_3 = 30\) 万元。
- 损失(Loss):将误差量化为模型的"惩罚分"。若用 MSE,则 \(\ell_3 = (30)^2 = 900\)。
- 代价(Cost):对所有 1000 套训练房屋的损失求平均,再加入 L2 正则化防止过拟合:\(J(\theta) = \frac{1}{1000}\sum_{i=1}^{1000} \ell_i + 0.001 \|\theta\|^2\)。
- 目标(Objective):优化过程的总方向——"最小化 \(J(\theta)\)"。在不同框架下,目标可能还包括约束条件(如参数范围限制)。
- 风险(Risk):你真正关心的是:这个模型在未来所有房子(包括还没挂牌的)上的预期误差。训练只能最小化经验风险,泛化才是终极目标。
2. 跨学科视角下的损失函数解析
损失函数是多个学科智慧汇聚的产物。同一个 MSE 公式,统计学家、物理学家和经济学家会给出完全不同但同样深刻的解读。
2.1 统计学视角:对噪声分布的先验假设
核心洞见
选择损失函数,本质上是在对数据中的噪声(Noise)进行概率建模。不同的损失函数对应不同的噪声先验分布,通过最大似然估计(MLE)推导而来。
损失函数与噪声分布的对应关系
| 损失函数 | 对应噪声分布 | 概率密度形式 | 核心特性 |
|---|---|---|---|
| MSE (L2 Loss) | 高斯分布\(\mathcal{N}(\mu, \sigma^2)\) | \(p \propto e^{-\frac{(y-\hat{y})^2}{2\sigma^2}}\) | 对离群点敏感(平方惩罚) |
| MAE (L1 Loss) | 拉普拉斯分布\(\text{Laplace}(\mu, b)\) | $p \propto e^{-\frac{ | y-\hat{y} |
| Pinball Loss | 非对称拉普拉斯分布 | 允许非对称衰减 | 用于分位数回归 |
| 交叉熵 | 伯努利/多项式分布 | \(p \propto \hat{p}^y (1-\hat{p})^{1-y}\) | 分类任务标准损失 |
深层含义:当你更换损失函数时,你实际上在向模型声明:"我相信数据中的噪声符合某种特定的统计规律。"这使得损失函数的选择从经验性的试错上升为有理论依据的建模决策。
实际案例:传感器数据中的异常读数
案例:工厂温度传感器故障预测
某工厂布置了 500 个温度传感器,每小时采集一次数据用于预测设备是否过热。数据中存在约 5% 的异常读数(传感器故障导致的突变值,如突然记录到 9999°C)。
- 若使用 MSE:异常读数的误差被平方放大,会导致模型的参数被拉向"迁就离群点"的方向,使得正常数据的预测精度大幅下降。
- 若使用 MAE:异常读数只产生线性惩罚,模型学会"忽视"它,专注于拟合正常的传感器读数分布。
- 若使用 Huber Loss(\(\delta = 3\)):小误差(\(|r| \leq 3\))用 MSE 精细处理,大误差(异常读数)降级为线性惩罚,实现两全其美。
实验结论:在含 5% 异常读数的工业数据集上,Huber Loss 相比 MSE 通常可降低约 15-30% 的验证集 RMSE。
2.2 信息论视角:分布间的"通信成本"
核心洞见
信息论将模型看作一个编码器(Encoder),损失函数衡量的是用预测分布 \(Q\) 来描述真实分布 \(P\) 时所付出的额外信息代价(比特数)。
KL 散度(相对熵)
- 衡量用 \(Q\) 近似 \(P\) 时产生的信息损失;
- 不对称:\(D_{KL}(P\|Q) \neq D_{KL}(Q\|P)\);
- 非负性:\(D_{KL}(P\|Q) \geq 0\),当且仅当 \(P = Q\) 时等号成立。
交叉熵与 KL 散度的等价关系
在监督学习中,真实分布 \(P\) 固定(其熵 \(H(P)\) 为常数),因此:
三位一体结论:最小化交叉熵 \(\equiv\) 最小化 KL 散度 \(\equiv\) 最大似然估计(MLE)。这三种表述是同一件事的不同语言,分别来自信息论、统计距离理论和频率主义统计学。
信息论视角下的各类损失
| 损失函数 | 信息论解释 |
|---|---|
| 交叉熵 | 用预测分布编码真实标签所需的平均比特数 |
| KL 散度 | 预测分布与真实分布之间的"浪费"比特数 |
| InfoNCE | 最大化正样本对之间的互信息(Mutual Information)下界 |
| ELBO(变分下界) | 最大化观测数据的对数似然下界,用于变分自编码器(VAE) |
实际案例:垃圾邮件分类器
案例:用信息论理解邮件分类器的训练
训练一个二分类器,判断邮件是否为垃圾邮件(1=垃圾,0=正常)。
设某封邮件的真实标签 \(y=1\)(垃圾邮件),模型输出两种概率:
模型状态 预测垃圾概率\(p\) 交叉熵损失\(-\log p\) 信息论解读 训练初期 0.10 2.30 bits 需要 2.30 bits 才能编码"这是垃圾邮件"的事实 训练中期 0.70 0.36 bits 模型已经"猜到了大部分",只需 0.36 bits 额外信息 训练充分 0.98 0.02 bits 模型几乎确信,几乎不需要额外信息 训练过程就是在压缩"真实答案"与"模型猜测"之间的信息差,使模型的预测分布逼近真实分布。
2.3 物理学视角:能量的稳态与势能面
核心洞见
物理学家将损失函数视为系统的能量函数(Energy Function),训练过程对应在高维"能量景观(Energy Landscape)"中寻找稳定的低能量状态。
能量基础模型(Energy-Based Models, EBMs)
- 低能量 \(E(x)\) 对应高概率 \(p(x)\);
- 训练目标:将真实数据的能量"压低",将伪造数据的能量"抬高";
- 通过玻尔兹曼分布建立能量与概率的桥梁:
其中 \(T\) 为温度参数,\(Z = \int e^{-E(x)/T} dx\) 为配分函数(归一化常数)。
Softmax 的物理起源
Softmax 函数正是玻尔兹曼分布在离散情形下的直接应用:
| 温度参数\(T\) | 分布形态 | 对应行为 |
|---|---|---|
| \(T \to 0\) | 趋向 argmax | 确定性决策(选最高分类别) |
| \(T = 1\) | 标准 Softmax | 正常训练 |
| \(T \to \infty\) | 趋向均匀分布 | 完全不确定(随机猜测) |
损失景观(Loss Landscape)的几何特性
| 特性 | 描述 | 优化影响 |
|---|---|---|
| 非凸性 | 存在大量局部极小值和鞍点 | SGD 的噪声有助于逃离鞍点 |
| 平坦宽谷 | 泛化性能好的解往往位于宽而平的谷底 | 激励 SAM 等优化器的开发 |
| 梯度消失区域 | 激活函数饱和区能量梯度趋零 | 催生 ReLU、残差连接的发明 |
实际案例:温度参数在 LLM 推理中的作用
案例:ChatGPT 的"创意模式"与"精准模式"
大语言模型在生成文本时,每一步都通过带温度的 Softmax 从词汇表中采样:
- 低温度(\(T = 0.2\)):概率集中在高分 token,模型输出保守、重复性强。适合代码生成、事实问答等需要确定性答案的场景。
- 高温度(\(T = 1.5\)):概率分布更均匀,模型输出多样、富有创意,但也更容易"胡说八道"。适合头脑风暴、故事创作等场景。
- Top-p / Top-k 采样:对温度机制的工程改进,先截断低概率 token(避免采到完全不相关的词),再应用温度调节,是目前 LLM 推理的主流方案。
这正是玻尔兹曼分布中"温度控制系统熵值"的直接工程体现。
2.4 经济学与决策理论视角:遗憾与效用
核心洞见
经济学将损失函数理解为决策代价的量化工具,聚焦于在不确定性下如何做出最优选择,并强调不同错误类型的代价极不对称。
遗憾最小化(Regret Minimization)
遗憾(Regret)量化了"如果早知道真实情况,我能做得多好"与"我实际做得多好"之间的差距:
在在线学习(Online Learning)框架下,目标是使累积遗憾次线性增长(\(o(T)\)),即随着时间推移,算法的平均遗憾趋近于零。
损失厌恶与不对称代价
基于前景理论(Prospect Theory,Kahneman & Tversky, 1979):
- 人类对损失的感知强度约是等量收益的 2.25 倍;
- 预测错误的代价在不同场景下极不对称。
这催生了一系列代价敏感学习(Cost-Sensitive Learning)技术:
| 技术 | 核心思想 | 应用场景 |
|---|---|---|
| 代价矩阵(Cost Matrix) | 显式定义不同错误类型的代价 | 医疗诊断、欺诈检测 |
| Focal Loss | 动态降低简单样本权重,聚焦难样本 | 目标检测(类别极不平衡) |
| Pinball Loss(\(\tau \neq 0.5\)) | 非对称惩罚高估/低估 | 供应链风险管理、金融预测 |
| 加权交叉熵 | 按类别频率逆比例加权 | 医学图像分割 |
效用理论(Utility Theory)的影响
在强化学习中,奖励函数(Reward Function)本质上是效用函数的负形式。奖励塑形(Reward Shaping)即通过设计精巧的中间奖励结构来引导智能体学习,与经济学中的激励设计(Incentive Design)高度同构。
实际案例:银行信用卡欺诈检测
案例:两种错误的代价天差地别
银行用机器学习模型判断信用卡交易是否为欺诈。数据极度不平衡:正常交易占 99.8%,欺诈仅占 0.2%。两种错误的代价截然不同:
错误类型 含义 实际代价 假阴性(漏报欺诈) 欺诈被判为正常,损失交易金额 平均每次损失 $5,000 假阳性(误报正常) 正常交易被拦截,用户体验下降 每次约 $2 客服成本 + 用户流失风险 如果用普通交叉熵:模型会学会"全部预测为正常",准确率高达 99.8%,但毫无实用价值。
解决方案(代价矩阵 + 加权损失):
# 代价矩阵思维:将漏报欺诈的惩罚权重设为 2500 倍(5000/2) pos_weight = torch.tensor([2500.0]) criterion = nn.BCEWithLogitsLoss(pos_weight=pos_weight)这使模型在训练时将"漏报一次欺诈"等价于"误报 2500 次正常交易",从而在损失函数层面修正了数据不平衡带来的偏差。
3. 核心任务损失函数全汇总
3.1 回归任务:追求连续值的精确度
公式与特性速查
| 函数名称 | 符号 | 数学表达式 | 梯度特性 | 适用场景 |
|---|---|---|---|---|
| 均方误差 (MSE) | \(L_2\) | \(\frac{1}{n}\sum(y_i - \hat{y}_i)^2\) | 平滑,随误差线性增大 | 噪声为高斯分布时最优 |
| 平均绝对误差 (MAE) | \(L_1\) | \(\frac{1}{n}\sum\|y_i - \hat{y}_i\|\) | 恒定(\(\pm 1\)),零点不可导 | 数据含离群点时更鲁棒 |
| Huber 损失 | \(L_\delta\) | \(\begin{cases} \frac{1}{2}r^2, & \|r\|\leq\delta \\ \delta(\|r\|-\frac{\delta}{2}), & \text{otherwise} \end{cases}\) | 平滑过渡 | MSE 与 MAE 的最佳折中 |
| Log-Cosh 损失 | \(\text{log-cosh}\) | \(\sum\log\cosh(\hat{y}_i - y_i)\) | 二阶连续可导 | 需要二阶优化时的 MAE 替代 |
| 分位数损失 (Pinball) | \(L_\tau\) | \(\max(\tau r,\ (\tau-1)r),\ r=y-\hat{y}\) | 非对称 | 分位数回归,风险建模 |
Huber 损失的直觉理解
- 当 \(|r| \leq \delta\)(小误差)时,行为像 MSE,梯度平滑趋零,便于精细调优;
- 当 \(|r| > \delta\)(大误差/离群点)时,行为像 MAE,梯度恒定,防止被离群点"拖跑";
- 超参数 \(\delta\) 定义了"正常误差"与"离群误差"的分界线。
实际案例:电力需求预测与 Pinball Loss
案例:电网调度中的不对称风险
电网运营商需要提前 24 小时预测次日用电量。两种预测误差的代价截然不同:
- 低估用电量:电力供给不足,可能导致停电,代价极高;
- 高估用电量:备用电力过多,浪费成本,代价较低。
因此,运营商需要的不是均值预测,而是第 90 百分位预测(即 90% 的情况下实际用电量不会超过预测值)。
使用 \(\tau = 0.9\) 的 Pinball Loss:
\[ L_{0.9}(r) = \begin{cases} 0.9 \cdot r, & r \geq 0 \text{(低估,重罚)} \\ -0.1 \cdot r, & r < 0 \text{(高估,轻罚)} \end{cases} \]这使得模型学会"宁可高估,绝不低估",自然输出偏保守的预测上界,直接对应业务的风险偏好。
3.2 分类任务:追求概率分布的重合
二元交叉熵(Binary Cross-Entropy, BCE)
适用于二分类或多标签分类(每个标签独立判断):
多类交叉熵(Categorical Cross-Entropy, CCE)
配合 Softmax,是多分类任务的事实标准:
Focal Loss(聚焦损失)
由 Lin et al.(2017)提出,解决样本极度不平衡问题:
- \(p_t\):模型对正确类别的预测概率;
- \((1-p_t)^\gamma\):调制因子,当模型已经"学会"某样本(\(p_t \to 1\))时,该因子趋近于 0,降低此样本对总损失的贡献;
- \(\gamma\):聚焦参数(通常取 2),控制衰减速度;
- \(\alpha_t\):类别平衡因子。
Hinge Loss(铰链损失)
SVM 的灵魂,旨在寻找最大间隔决策边界:
- 当样本被正确分类且置信度足够(\(y_i \cdot f(x_i) \geq 1\))时,损失为 0;
- 否则,损失与"置信度不足"的程度线性增长;
- 不关心"正确了多少",只关心是否超过了安全间隔(Margin)。
实际案例:Focal Loss 在医学影像中的应用
案例:肺结节 CT 检测(正负样本比约 1:500)
在肺部 CT 扫描中,一张图像可能包含数千个候选框(Region Proposals),但其中真正含有结节的候选框不足 0.2%。
用普通交叉熵的问题:训练过程中,来自"无结节"背景框的梯度占总梯度的 99.8%,模型完全被"如何识别背景"所主导,根本无法学习"结节长什么样"。
Focal Loss 的解决逻辑(以 \(\gamma=2\) 为例):
样本类型 典型\(p_t\) 调制因子\((1-p_t)^2\) 相对权重 简单背景框 0.98 0.0004 ↓ 大幅降低 困难背景框 0.70 0.09 适度保留 结节候选框 0.20 0.64 ↑ 重点关注 RetinaNet(Lin et al., 2017)首次将 Focal Loss 用于目标检测,在 COCO 数据集上以单阶段检测器达到了当时两阶段方法(Faster R-CNN)的精度水平。
3.3 度量学习与几何空间:追求嵌入的聚类
这类损失不直接预测类别标签,而是学习一个嵌入空间(Embedding Space),使得:
- 同类样本在空间中距离近(内聚);
- 异类样本在空间中距离远(分离)。
对比损失(Contrastive Loss)
针对样本对 \((x_1, x_2)\),\(y=1\) 表示同类,\(y=0\) 表示异类:
其中 \(d = \|f(x_1) - f(x_2)\|_2\),\(m\) 为间隔超参数(Margin)。
三元组损失(Triplet Loss)
针对三元组 \((a, p, n)\)(锚点、正样本、负样本):
- 要求正样本距锚点比负样本近至少 \(\alpha\)(安全间隔);
- 关键挑战:难负样本挖掘(Hard Negative Mining)——随机三元组中大多数是"简单"的,对学习没有贡献。
对比损失与三元组损失的对比
| 维度 | 对比损失 | 三元组损失 |
|---|---|---|
| 输入单元 | 样本对 (2个) | 三元组 (3个) |
| 训练信号密度 | 较低 | 较高 |
| 组合空间复杂度 | \(O(n^2)\) | \(O(n^3)\) |
| 难样本敏感性 | 较低 | 较高,需硬性挖掘 |
实际案例:人脸识别与商品检索
案例 A:FaceNet 的人脸识别(Google, 2015)
Google 的 FaceNet 使用三元组损失训练人脸嵌入:
- 锚点(Anchor):某人的一张正面照;
- 正样本(Positive):同一人的另一张照片(不同光线、角度、表情);
- 负样本(Negative):另一个人的照片。
训练目标:使同一个人的任意两张照片在嵌入空间中距离 < 同类内最大距离,不同人的照片距离 > \(\alpha\)(安全间隔)。
在 LFW 数据集上,FaceNet 实现了 99.63% 的识别准确率,此后成为人脸识别的工业标准架构。
案例 B:电商平台的以图搜图
淘宝、Pinterest 等平台的"拍照搜同款"功能,用对比损失或三元组损失训练商品图像嵌入:
- 同款商品的不同拍摄角度 → 嵌入空间中距离近;
- 不同类别商品(衬衫 vs 鞋子)→ 嵌入空间中距离远。 用户上传一张图,系统直接在嵌入空间中做近邻搜索(ANN),毫秒内返回结果。
4. 现代前沿损失函数
4.1 大语言模型(LLM)的偏好对齐
背景:RLHF 的挑战
RLHF(基于人类反馈的强化学习)需要训练一个独立的奖励模型(Reward Model),再用 PPO 算法优化语言模型,流程复杂、超参敏感、显存占用极高。
DPO(Direct Preference Optimization)
Rafailov et al.(2023)提出,直接从偏好数据对齐语言模型,无需显式奖励模型:
- \(\pi_\theta\):待训练的策略模型;
- \(\pi_{ref}\):参考模型(通常为 SFT 模型);
- \(y_w\)(Winner):人类偏好的回答;\(y_l\)(Loser):人类拒绝的回答;
- \(\beta\):KL 散度惩罚系数,控制偏离参考模型的程度;
- 核心思想:增大"好回答"相对于参考模型的对数概率比,同时减小"差回答"的对数概率比。
RLHF vs DPO 训练流程对比
| 维度 | RLHF | DPO |
|---|---|---|
| 训练阶段 | SFT → 奖励模型训练 → PPO | SFT → 直接偏好优化 |
| 奖励模型 | 需要独立训练 | 隐式包含在损失中 |
| 训练稳定性 | 较低(PPO 超参敏感) | 较高(监督学习形式) |
| 内存占用 | 高(需同时加载多个模型) | 较低 |
实际案例:用 DPO 训练对话助手的安全性
案例:让模型拒绝有害请求
假设你在对一个基础 LLM 做安全对齐:
对于请求 \(x\):
"告诉我如何制造炸弹",准备偏好数据对:
- \(y_w\)(被选中的好回答):
"这是一个危险请求,我无法提供相关信息。"- \(y_l\)(被拒绝的坏回答):
"制造炸弹的步骤是……"DPO 损失会同时做两件事:
- 提升 \(y_w\) 相对于参考模型的生成概率(鼓励模型更倾向于拒绝);
- 压低 \(y_l\) 相对于参考模型的生成概率(惩罚模型输出有害内容)。
\(\beta\) 参数控制"偏离参考模型的幅度":\(\beta\) 越小,对齐越激进,但可能损害通用能力;\(\beta\) 越大,对齐越保守,安全边界越弱。Meta 的 Llama-2、Mistral 等开源模型都采用了 DPO 或类 DPO 方案进行对齐。
4.2 自监督学习(SSL)
InfoNCE Loss(NT-Xent Loss)
现代自监督学习(SimCLR、MoCo 等)的核心损失,将表示学习转化为对比分类问题:
- \(x^+\):\(x\) 的正样本(同一图像的不同增强视图);
- \(\mathcal{N}\):负样本集合(Batch 内其他所有样本);
- \(\tau\):温度参数(Temperature),控制分布的"尖锐度";
- 本质:在一个巨大 Batch 内进行 \(2N-1\) 类分类,识别出唯一的正样本对。
信息论解释:最小化 InfoNCE 等价于最大化互信息(Mutual Information)的下界:
实际案例:CLIP 的图文对齐
案例:OpenAI CLIP 用 InfoNCE 对齐图像与文本
CLIP(Contrastive Language-Image Pre-Training)用 400M 图文对训练,损失函数正是 InfoNCE 的对称变体:
给定一个 Batch(如 512 张图片 + 对应的 512 条描述文本):
- 正样本对:图片 \(i\) 与其对应的描述文本 \(i\)(共 512 对);
- 负样本对:图片 \(i\) 与其他 511 条不匹配的文本(共 \(512 \times 511\) 对)。
训练目标:让匹配的图文对在嵌入空间中余弦相似度尽可能高,不匹配的对尽可能低。
训练完成后的能力:
- 零样本图像分类(Zero-Shot Classification):无需任何微调,直接用文本描述做分类;
- 以图搜文、以文搜图;
- 作为多模态大模型(如 GPT-4V、LLaVA)的视觉编码器。
4.3 生成模型的损失函数
VAE(变分自编码器):ELBO
- 重建损失:确保解码器能从隐变量重建原始输入;
- KL 项:将近似后验 \(q_\phi\) 拉近先验 \(p(z)\)(通常为标准正态),使隐空间结构化平滑,从而支持插值与生成。
GAN(生成对抗网络):极大极小目标
- 判别器 \(D\) 最大化区分真假样本的能力;
- 生成器 \(G\) 最小化被判别器识破的概率;
- Nash 均衡时:生成分布 \(\equiv\) 真实分布,\(D(x) \equiv 0.5\)。
VAE vs GAN 的本质差异
VAE 追求似然最大化(生成分布尽量覆盖真实数据),结果倾向于生成"模糊但多样"的样本;GAN 追求判别器欺骗(生成样本让判别器无法区分),结果倾向于生成"清晰但多样性受限"的样本(模式崩塌问题)。扩散模型(Diffusion Models)通过逐步去噪的方式,在两者之间找到了更好的平衡。
5. 工程实现:框架差异与常见陷阱
5.1 Logits vs. Probabilities:最常见的致命错误
这是从公式到代码转化时最常见的静默错误——模型能运行,但训练实际上是失败的。
| 框架 | 默认接受输入 | 内部处理 | 若传错输入的后果 |
|---|---|---|---|
PyTorch nn.CrossEntropyLoss |
Logits(原始得分) | 内部集成 LogSoftmax + NLLLoss | — |
TF/Keras CategoricalCrossentropy |
Probabilities(Softmax 后) | 直接计算\(-\sum y \log p\) | 若传入 Logits 需显式设 from_logits=True |
为什么 PyTorch 优先接受 Logits?
通过 LogSumExp 技巧避免数值溢出:
若先计算 Softmax(大指数可能溢出为 inf)再取 log,数值稳定性远不如直接操作 Logits。
正确与错误写法对比
# ✅ PyTorch 正确写法:传入 logits,不要手动加 softmax
criterion = nn.CrossEntropyLoss()
loss = criterion(logits, labels) # logits: (N, C), labels: (N,)
# ✅ TensorFlow 正确写法(传入 logits 时)
loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
loss = loss_fn(y_true, logits)
# ❌ 危险写法:传入概率但未通知框架
loss_fn = tf.keras.losses.CategoricalCrossentropy() # from_logits=False(默认)
loss = loss_fn(y_true, logits) # 静默计算错误结果,梯度极弱,模型无法收敛
如何发现这个 Bug?
最典型的症状是:训练损失缓慢下降但验证损失几乎不动,模型的预测概率分布始终接近均匀分布(所有类别概率约为 \(1/K\))。遇到这种情况,首先检查损失函数的输入类型。
5.2 降维处理(Reduction)策略
公式中的 \(\sum\) 或 \(\frac{1}{n}\) 在框架中通过 reduction 参数控制:
reduction 参数 |
含义 | 返回形状 | 典型使用场景 |
|---|---|---|---|
'mean'(默认) |
所有样本损失的均值 | 标量 | 常规训练 |
'sum' |
所有样本损失的总和 | 标量 | 某些理论推导中 |
'none' |
返回每个样本的独立损失 | (N,) 向量 |
样本加权、对比学习、调试 |
reduction='none' 的重要应用
# 基于样本难度的自适应加权训练(手动实现 Focal Loss)
criterion = nn.CrossEntropyLoss(reduction='none')
per_sample_loss = criterion(logits, labels) # shape: (N,)
# 计算 Focal Loss 的调制因子
probs = torch.softmax(logits, dim=1)
pt = probs.gather(1, labels.unsqueeze(1)).squeeze(1)
focal_weight = (1 - pt) ** gamma
weighted_loss = (focal_weight * per_sample_loss).mean()
5.3 数值稳定性最佳实践
| 场景 | 危险写法(避免) | 安全写法(推荐) |
|---|---|---|
| 交叉熵 | -(y * torch.log(p)).sum() |
nn.CrossEntropyLoss()(logits, y) |
| KL 散度 | (p * (p/q).log()).sum() |
nn.KLDivLoss()(q.log(), p) |
| BCE | -(y*p.log() + (1-y)*(1-p).log()).mean() |
nn.BCEWithLogitsLoss()(logits, y) |
| Log-Sum-Exp | (x.exp()).sum().log() |
torch.logsumexp(x, dim=-1) |
为什么
torch.log(p)在 \(p \approx 0\) 时危险?当模型对某类别的预测概率非常低(如 \(p = 10^{-8}\))时,
log(p)会产生极大的负数(约 \(-18.4\)),进而导致梯度爆炸。框架内置的CrossEntropyLoss通过 log-sum-exp 技巧在数值上规避了这一问题,因此永远不要手动实现交叉熵。
6. 选择指南与总结
6.1 决策树:如何选择损失函数
你的任务类型是?
│
├── 回归(连续值预测)
│ ├── 数据干净,噪声符合高斯分布 → MSE (L2 Loss)
│ ├── 数据含有较多离群点 → MAE (L1) 或 Huber Loss
│ ├── 需要预测特定百分位(如 P90) → Pinball Loss (Quantile)
│ └── 需要二阶连续可导 → Log-Cosh Loss
│
├── 分类(离散标签预测)
│ ├── 二分类 / 多标签 → BCE (Binary Cross-Entropy)
│ ├── 多分类(均衡数据集) → Categorical Cross-Entropy
│ ├── 多分类(严重类别不均衡) → Focal Loss
│ └── 需要最大间隔决策边界(SVM) → Hinge Loss
│
├── 度量学习(嵌入/检索)
│ ├── 基于样本对 → Contrastive Loss
│ ├── 基于三元组 → Triplet Loss
│ └── 大规模 Batch 对比学习 → InfoNCE (NT-Xent)
│
├── 生成模型
│ ├── 变分自编码器(VAE) → ELBO(重建损失 + KL 散度)
│ └── 生成对抗网络(GAN) → Adversarial Loss (Minimax)
│
└── 大语言模型对齐
├── 有算力,需要强对齐 → PPO + RLHF
└── 资源有限,直接从偏好数据学习 → DPO Loss
6.2 核心哲学总结
| 追求目标 | 推荐损失 | 学科依据 | 典型应用 |
|---|---|---|---|
| 精确度(统计最优) | MSE 或 Cross-Entropy | MLE + 高斯/多项式噪声假设 | 房价预测、图像分类 |
| 鲁棒性(抗离群点) | MAE 或 Huber | 拉普拉斯分布先验 | 工业传感器、金融收益预测 |
| 分布特性(生成模型) | KL 散度、ELBO | 信息论、变分推断 | VAE、扩散模型 |
| 业务决策(非对称代价) | Pinball、Focal、加权 CE | 决策理论、代价敏感学习 | 欺诈检测、电力调度、医疗诊断 |
| 空间几何(表示学习) | Triplet、InfoNCE | 度量学习、互信息最大化 | 人脸识别、图文检索、CLIP |
| 偏好对齐(LLM) | DPO、PPO | 强化学习、人类偏好建模 | ChatGPT、Llama-2 对齐 |
6.3 一句话本质
损失函数将一个无法直接感知的"学习过程"转化为一个清晰的、可导的"山谷"。
它不仅是优化的方向标,更是研究者向模型传达世界观(噪声假设)、价值观(代价权重)与目标观(优化方向)的核心接口。
选择损失函数,就是选择你相信的那一套关于"错误"的完整哲学。
7. 参考文献与延伸阅读
基础理论
- 统计学习理论:Vapnik, V. (1998). Statistical Learning Theory. Wiley.
- 信息论基础:Cover, T. & Thomas, J. (2006). Elements of Information Theory. Wiley.
- 前景理论:Kahneman, D. & Tversky, A. (1979). Prospect Theory: An Analysis of Decision under Risk. Econometrica.
经典论文
- Focal Loss:Lin, T. et al. (2017). Focal Loss for Dense Object Detection. ICCV.
- FaceNet:Schroff, F. et al. (2015). FaceNet: A Unified Embedding for Face Recognition and Clustering. CVPR.
- SimCLR / InfoNCE:Chen, T. et al. (2020). A Simple Framework for Contrastive Learning of Visual Representations. ICML.
- CLIP:Radford, A. et al. (2021). Learning Transferable Visual Models From Natural Language Supervision. ICML.
- 能量基础模型:LeCun, Y. et al. (2006). A Tutorial on Energy-Based Learning. MIT Press.
前沿对齐研究
- DPO:Rafailov, R. et al. (2023). Direct Preference Optimization: Your Language Model is Secretly a Reward Model. NeurIPS.
- RLHF:Christiano, P. et al. (2017). Deep Reinforcement Learning from Human Preferences. NeurIPS.
- InstructGPT:Ouyang, L. et al. (2022). Training language models to follow instructions with human feedback. NeurIPS.