损失函数
title: title
date: 2026.8月份
点击查看代码
# 深度学习中损失函数的选择(全解析)
## 1. 核心结论
**绝对不是!** 公式 **\(L = \frac{1}{2}(\hat{y} - y)^2\)**(半均方误差)只是万千损失函数中的一种。在深度学习中,**“没有万能损失函数”**,选择完全取决于**任务类型**(回归、分类、生成)和**输出层设计**。
---
## 2. 为什么公式里有个 \(\frac{1}{2}\)?(数学小彩蛋)
这个系数纯粹是为了**求导方便**。
- 标准平方误差的导数为:
\[
\frac{d}{d\hat{y}}(\hat{y} - y)^2 = 2(\hat{y} - y)
\]
- 乘以 \(\frac{1}{2}\) 后,导数变为干净的 **\((\hat{y} - y)\)**,反向传播时代码更简洁,无需额外处理系数 2。
> ⚠️ **注意**:在现代深度学习框架(如 PyTorch、TensorFlow)中,标准的 `MSE` 损失默认**不带**这个 \(\frac{1}{2}\) 系数,即直接使用 **\(L = (\hat{y} - y)^2\)**。
---
## 3. 三大主流任务对应的损失函数
### (1)回归任务(预测连续数值)
* **适用场景**:房价预测、温度预测、股价预测。
* **常用损失**:
* **MSE(均方误差)**:
\[
L = (\hat{y} - y)^2
\]
* 特点:对异常值(离群点)**极其敏感**(误差被平方放大,模型会拼命拟合离群点)。
* **MAE(平均绝对误差)**:
\[
L = |\hat{y} - y|
\]
* 特点:对异常值**鲁棒(不敏感)**,梯度恒定,不易受离群点干扰。
* **Huber Loss**:结合 MSE 和 MAE 的优点,当误差较小时类似 MSE(平滑可导),误差较大时类似 MAE(抗异常值)。
### (2)分类任务(预测离散类别)
> 🚨 **分类任务几乎从不使用 MSE!** 强行使用 MSE 会导致严重的**梯度消失**问题(当预测完全错误时,Sigmoid/Softmax 输出端的梯度反而接近 0,模型学不动)。
* **适用场景**:图像识别、垃圾邮件检测、医学诊断。
* **常用损失**:
* **二分类(输出层为 Sigmoid)**:使用 **二元交叉熵(BCE)**
\[
L = -[y \cdot \log(\hat{y}) + (1-y) \cdot \log(1-\hat{y})]
\]
其中 \(y \in \{0, 1\}\),\(\hat{y} \in (0, 1)\)。
* **多分类(输出层为 Softmax)**:使用 **分类交叉熵(CCE)**
\[
L = -\sum_{i=1}^{C} y_i \cdot \log(\hat{y}_i)
\]
其中 \(C\) 为类别总数,\(y_i\) 为独热编码(One-hot)标签。
### (3)复杂/生成任务
* **图像生成(GANs)**:对抗损失、Wasserstein 损失。
* **目标检测(YOLO 系列)**:组合损失(边界框回归用 **CIOU Loss / IoU Loss**,分类用交叉熵)。
* **自然语言翻译(Transformer)**:带标签平滑(Label Smoothing)的交叉熵。
---
## 4. 快速选择指南(一张表搞定)
| 你的任务类型 | 输出层激活函数 | 推荐损失函数 | 能否用 \(\frac{1}{2}MSE\)? |
| :--- | :--- | :--- | :--- |
| 预测任意实数(如房价) | 无(线性层) | **MSE** 或 **MAE** | ✅ 可以(但建议直接用 \(L = (\hat{y} - y)^2\)) |
| 二分类(是/否 / 猫/狗) | Sigmoid | **二元交叉熵(BCE)** | ❌ 绝对不行(会梯度消失) |
| 多分类(手写数字 0-9) | Softmax | **分类交叉熵(CCE)** | ❌ 绝对不行 |
| 多标签分类(图中同时有猫和狗) | Sigmoid(每个输出节点独立) | **二元交叉熵(BCE)**(每个标签独立计算) | ❌ 绝对不行 |
---
## 5. 为什么你的两层网络不适合用平方损失?(数学推导)
针对你之前提到的两层神经网络,输出层为:
\[
\hat{y} = \sigma(z_{out}) = \frac{1}{1 + e^{-z_{out}}}
\]
如果硬套平方损失 **\(L = \frac{1}{2}(\hat{y} - y)^2\)**,在反向传播时,输出层的梯度为:
\[
\frac{\partial L}{\partial z_{out}} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z_{out}} = (\hat{y} - y) \cdot \sigma'(z_{out})
\]
而 Sigmoid 的导数为:
\[
\sigma'(z_{out}) = \sigma(z_{out}) \cdot (1 - \sigma(z_{out})) = \hat{y}(1 - \hat{y})
\]
**灾难性的情况出现了**:
- 当预测完全错误时(例如真实标签 \(y = 1\),而预测值 \(\hat{y} \to 0\)),此时 **\(\hat{y}(1 - \hat{y}) \to 0\)**,导致整个梯度趋近于 0。
- 这意味着:**模型预测越错,梯度越小,几乎不更新权重**——这就是著名的“梯度消失”问题。
**而换成交叉熵(BCE)后**:
\[
L = -[y \log(\hat{y}) + (1-y) \log(1-\hat{y})]
\]
其输出层梯度为:
\[
\frac{\partial L}{\partial z_{out}} = \hat{y} - y
\]
此时,**预测越错(\(\hat{y}\) 离 \(y\) 越远),梯度绝对值越大**,模型能够快速修正,训练稳定且高效。
> 💡 **记忆口诀**:
> **“回归用欧氏距离(MSE),分类用概率距离(交叉熵)。”**
浙公网安备 33010602011771号