一文搞透交叉熵、sigmoid 与 softmax:从信息熵到神经网络的损失函数
深度学习中,交叉熵损失函数几乎无处不在——分类任务用它,排序任务用它,甚至连目标检测也在用。但你是否有过这样的困惑:
sigmoid 和 softmax 到底有什么区别?我应该在什么时候用哪个? KL 散度又是什么?它和交叉熵有什么关系?
这篇文章,我打算从信息论的基本概念出发,一步步把这些知识点串联起来。不会堆砌公式——每一步推导,我都会先给出直觉解释,再给出数学表达,确保你"知其然,更知其所以然"。
1. 从"惊讶程度"到信息量
让我们从一个最朴素的例子开始。
假设明天有 50% 的概率下雨,有 50% 的概率不下雨。如果天气预报说"明天大概会下雨",你会觉得:嗯,这句话没什么信息量——因为下雨与否本来就很随机,说不说都一样。
反过来,如果天气预报说"明天一定会下雨"(100% 概率),你才会真正感到意外:哦,这倒是条有用的消息。
这个"意外程度",就是信息量的直观来源。
信息论给出了它的数学定义——对于一个概率为 $p$ 的事件,它的信息量(Information)为:
$$I(p) = -\log(p)$$
几个关键性质:
- $p=1$(确定事件)→ $I=0$,不意外,没有信息
- $p\to 0$(极小概率事件发生)→ $I\to\infty$,极度意外,信息量巨大
- 独立事件的信息量可加:两件独立的事同时发生,总信息量等于各自信息量之和
💡 思考:为什么对数函数恰好满足这些性质?因为对数满足 $\log(ab)=\log(a)+\log(b)$,正好对应"独立事件可加"这一信息论基本假设。这不是巧合,而是数学与直觉的完美契合。
2. 信息熵:一个分布的"平均惊讶程度"
知道了单个事件的信息量,现在我们来看整个概率分布的平均信息量——这就是信息熵(Entropy)。
对于离散概率分布 $P=\{p_1,p_2,\ldots,p_K\}$:
$$H(P) = -\sum_{i=1}^{K} p_i \log p_i$$
或者写成期望的形式:
$$H(P) = \mathbb{E}_{x\sim P}[I(x)] = \mathbb{E}_{x\sim P}[-\log P(x)]$$
直观理解:信息熵衡量的是"从这个分布中随机抽样,期望得到的信息量"。它描述的是这个分布的不确定性或混乱程度。
两个极端例子:
- 抛一枚均匀硬币($p=0.5, 0.5$):$H = -0.5\log 0.5 - 0.5\log 0.5 = \log 2 \approx 0.693$
- 结果最不确定,熵最大
- 抛一枚永远正面朝上的硬币($p=1, 0$):$H = -1\cdot\log 1 - 0\cdot\log 0 = 0$
- 结果完全确定,熵为零
我的理解:熵不是"混乱",而是"不可预测性"。一个均匀分布是最难预测的(你需要抛硬币决定),所以熵最大;一个确定分布是最容易预测的,所以熵为零。
3. KL 散度:两个分布之间的距离(但不是距离)
现在我们有了信息熵,接下来引入一个更重要的概念——KL 散度(Kullback-Leibler Divergence)。
KL 散度用于衡量两个概率分布 $P$ 和 $Q$ 之间的差异:
$$D_{KL}(P\|Q) = \sum_{i} p_i \log\frac{p_i}{q_i} = \sum_{i} p_i(\log p_i - \log q_i)$$
直观理解:KL 散度衡量的是——如果我们用分布 $Q$ 来编码真实分布 $P$ 的信息,平均需要多付出多少额外的信息量(相对于用 $P$ 本身来编码)。
重要性质:
- 非负性(Gibbs 不等式):$D_{KL}(P\|Q) \geq 0$,当且仅当 $P=Q$ 时等于零
- 非对称性:$D_{KL}(P\|Q) \neq D_{KL}(Q\|P)$,因此 KL 散度不是严格意义上的"距离"(距离需要满足对称性)
⚠️ 这里有一个常见的误区:很多人把 KL 散度理解为"两个分布之间的距离",但它不是对称的——从 $P$ 到 $Q$ 的差异,不等于从 $Q$ 到 $P$ 的差异。这在机器学习中很重要,比如 VAE 和 ELBO 损失中用的是 $D_{KL}(P\|Q)$ 而非 $D_{KL}(Q\|P)$,方向不能随意交换。
4. 交叉熵:KL 散度的"兄弟"
把 KL 散度展开:
$$D_{KL}(P\|Q) = \sum_{i} p_i \log p_i - \sum_{i} p_i \log q_i$$
定义第一项为 $H(P)$(真实分布的信息熵),第二项为:
$$H(P, Q) = -\sum_{i} p_i \log q_i$$
这就是交叉熵(Cross-Entropy)。它与 KL 散度的关系为:
$$\boxed{H(P, Q) = H(P) + D_{KL}(P\|Q)}$$
在机器学习中,$P$ 是真实分布(Ground Truth),$Q$ 是模型预测的分布(Model Prediction)。由于 $H(P)$ 是不依赖于模型的常数(它只由真实标签决定),所以:
$$\text{最小化 } H(P, Q) \quad \Longleftrightarrow \quad \text{最小化 } D_{KL}(P\|Q)$$
这便是交叉熵损失函数的本质:它度量的是模型预测分布与真实分布之间的差异,最小化交叉熵等价于最小化 KL 散度。
5. sigmoid 和 softmax:两种概率化的方式
铺垫了这么多,终于要讲 sigmoid 和 softmax 了。
在二分类问题中,模型的输出是一个实数 $z$(称为 logits),我们需要把它转换为一个概率值 $\hat{y}\in[0,1]$,表示"属于正类的概率"。这就有两种经典的转换方式。
5.1 sigmoid
定义:
$$\sigma(z) = \frac{1}{1+e^{-z}}$$
性质:
- 输出范围:$(0,1)$
- 导数有一个优美的形式:$\sigma'(z) = \sigma(z)(1-\sigma(z))$,这个形式让反向传播的计算非常简洁
- 单调递增:以 $(0, 0.5)$ 为中心
5.2 softmax
softmax 是 sigmoid 在多分类上的自然推广。
定义:对于 $K$ 维向量 $\mathbf{z}=(z_1,\ldots,z_K)$:
$$\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}$$
性质:
- 输出为 $K$ 维向量,每个分量在 $(0,1)$ 之间
- 所有分量之和等于 1——天然满足概率分布的归一性
- 数值稳定性技巧:当 $z_i$ 较大时 $e^{z_i}$ 可能溢出,实际实现中通常用 $\text{Softmax}(z_i) = \frac{e^{z_i-\max(\mathbf{z})}}{\sum e^{z_j-\max(\mathbf{z})}}$ 避免溢出
5.3 两者的关系与区别
数学关系:当 $K=2$ 时,softmax 退化为 sigmoid。
设 $z_1 = z, z_2 = 0$,则:
$$\text{Softmax}(z_1) = \frac{e^z}{e^z + e^0} = \frac{1}{1+e^{-z}} = \sigma(z)$$
适用场景的决定性区别:
| sigmoid | softmax | |
|---|---|---|
| 类别关系 | 各输出相互独立 | 各输出相互竞争(和为1) |
| 典型任务 | 二分类、多标签分类 | 多分类(互斥分类) |
| 多标签场景 | ✅ 可以同时激活多个标签 | ❌ 所有类别概率之和必须为1,无法同时输出多个"正类" |
举一个直观的例子:
假设我们要识别一张图里有哪些物体(狗、猫、树、建筑)。一张图里可能同时有狗和猫,所以应该用 sigmoid 对每个类别分别做二分类;如果我们是要判断这张图属于哪个类别(动物 / 风景 / 建筑,三选一),则用 softmax——因为正确答案只有一个。
6. 二分类交叉熵损失(BCE)
现在把 sigmoid 和信息论串起来,推导二分类交叉熵损失。
对于单个样本,真实标签 $y \in \{0, 1\}$,模型预测 $\hat{y} = \sigma(z)$,交叉熵损失为:
$$\mathcal{L}_{BCE} = -[y \log \hat{y} + (1-y)\log(1-\hat{y})]$$
从最大似然估计推导:
假设数据服从伯努利分布:$P(y|x) = \hat{y}^y (1-\hat{y})^{1-y}$
对数似然:$\log P = y\log\hat{y} + (1-y)\log(1-\hat{y})$
负对数似然(NLL)恰好就是 BCE 损失。因此,最小化 BCE = 最大化似然估计。
批量形式:
$$\mathcal{L}_{BCE} = -\frac{1}{N}\sum_{n=1}^{N}\left[y^{(n)}\log\hat{y}^{(n)} + (1-y^{(n)})\log(1-\hat{y}^{(n)})\right]$$
7. 多分类交叉熵损失(CCE)
对于 $K$ 分类问题,真实标签 $\mathbf{y}$ 为 one-hot 向量(只有一个位置为 1,其余为 0),模型输出 $\hat{\mathbf{y}} = \text{Softmax}(\mathbf{z})$。
交叉熵损失为:
$$\mathcal{L}_{CCE} = -\sum_{k=1}^{K} y_k \log \hat{y}_k$$
由于 $\mathbf{y}$ 是 one-hot,这个求和实际只保留了一项——真实类别 $c$ 对应的预测概率的负对数:
$$\mathcal{L}_{CCE} = -\log \hat{y}_c$$
💡 有意思的地方:多分类 CCE 损失的物理含义非常清晰——它就是"正确类别的预测概率"的负对数。我们的目标就是让正确类别的概率尽可能接近 1(此时 $\log$ 接近 0,损失为 0)。
批量形式:
$$\mathcal{L}_{CCE} = -\frac{1}{N}\sum_{n=1}^{N} \log \hat{y}_{c^{(n)}}^{(n)}$$
8. 为什么分类任务用交叉熵而不是 MSE?
这是一个经典面试题。答案藏在梯度特性里。
考虑二分类场景下的梯度:
$$\frac{\partial \mathcal{L}_{BCE}}{\partial z} = \hat{y} - y$$
这个梯度有一个极其简洁的形式——预测值与真实值的差。
而如果用均方误差(MSE):
$$\mathcal{L}_{MSE} = \frac{1}{2}(y-\hat{y})^2, \quad \frac{\partial \mathcal{L}_{MSE}}{\partial z} = (\hat{y}-y)\cdot \hat{y}(1-\hat{y})$$
M SE 的梯度中多了一个 $\hat{y}(1-\hat{y})$ 因子。当 $\hat{y}$ 接近 0 或 1 时(即模型已经很有信心时),这个因子趋近于 0,导致梯度消失,模型几乎无法继续学习。
而 BCE 的梯度中,没有这个衰减因子——即使模型已经很有信心,梯度依然有合理的量级。交叉熵的这个特性,使得它成为分类任务的首选。
| 梯度 $\frac{\partial \mathcal{L}}{\partial z}$ | 梯度消失问题 | |
|---|---|---|
| 交叉熵 + sigmoid | $\hat{y}-y$(简洁、无衰减) | ✅ 不存在 |
| MSE + sigmoid | $(\hat{y}-y)\cdot\hat{y}(1-\hat{y})$ | ❌ 预测置信时梯度趋近 0 |
9. 总结:一条清晰的知识链路
让我们把整篇文章的知识链路串起来:
信息量: -log(p)
↓ 期望平均
信息熵: H(P) = -Σ p·log(p)
↓ 衡量两分布差异
KL散度: D_KL(P||Q) = Σ p·log(p/q) = H(P,Q) - H(P)
↓ 展开,固定P则H(P)为常数
交叉熵: H(P,Q) = -Σ p·log(q)
↓ 用于分类
交叉熵损失函数
├── 二分类 → BCE + sigmoid (sigmoid将logit映射到[0,1])
└── 多分类 → CCE + softmax (softmax将logits映射到概率分布)
↑
K=2时 softmax = sigmoid
最后,一句话收尾:
sigmoid 和 softmax 是将神经网络的原始输出(logits)转化为概率分布的两种方式,它们决定了我们能否用交叉熵损失来衡量"预测的不确定性"。而交叉熵损失之所以有效,根本原因在于它度量的是"真实分布"与"预测分布"之间的 KL 散度——最小化它,就是在让模型的预测越来越接近真实标签。
如果你觉得这篇文章有帮助,欢迎关注微信公众号「yellowswimming」,获取更多 AI 与机器学习的原创内容。