唐豆的秘密基地

交叉熵公式推导(为啥分类问题用交叉熵作为损失函数)

解密逻辑回归:为什么我们选择交叉熵作为损失函数,交叉熵是怎么来的?

很多初学者在学习机器学习,特别是分类问题时,可能会对损失函数的选择感到困惑。一个常见的问题是:为什么我们通常使用交叉熵 (Cross-Entropy) 作为损失函数,而不是像回归问题中那样直观的均方误差 (Mean Squared Error) 呢?毕竟,均方误差听起来也是衡量“错误”的一种方式。

本文将以逻辑回归中的二分类问题为例,一步步带您深入理解交叉熵损失函数的由来及其统计学意义,揭示其在分类任务中的天然优势。


理解背景:从二分类任务说起

让我们从一个典型的二分类场景开始。想象一下,我们需要根据一些特征来判断一个东西属于两个类别中的哪一个,比如判断一封邮件是否为垃圾邮件,或者一张图片中的动物是猫还是狗。

  • 输入特征 (Input Features): 我们拥有一系列数据样本,每个样本都包含一些可描述其特性的特征。我们将第 $n$ 个输入样本表示为 $x^n$。所以我们有输入特征 $x^1, x^2, x^3, \dots$。
  • 类别标签 (Class Labels): 原始的类别标签可能是文字描述,如 $C_1$ (例如“是垃圾邮件”) 或 $C_2$ (例如“非垃圾邮件”)。
  • 目标输出 (Target Output): 为了方便模型处理,我们将这些类别标签转换为二元数字标签。对于第 $n$ 个样本 $x^n$,其对应的目标输出为 $\hat{y}^n$。约定 $\hat{y}^n = 1$ 代表样本属于类别1,而 $\hat{y}^n = 0$ 代表样本属于类别2。于是,原始的类别标签 $C_1, C_1, C_2, \dots$ 就转换成了 $\hat{y}^1=1, \hat{y}^2=1, \hat{y}^3=0, \dots$。
  • 我们的模型 (Our Model): 我们的目标是构建一个函数 $f_{w,b}(x)$,它能够根据输入特征 $x$ 来预测其属于类别1的概率。这里的 $w$ 和 $b$ 是模型的参数(通常指权重和偏置)。在逻辑回归中,$f_{w,b}(x)$ 通常采用 Sigmoid 函数(也称逻辑函数),该函数可以将任意实数输入映射到 (0, 1) 的区间,这正好符合概率的定义。

核心思想:似然函数 L(w,b)

现在,我们有了数据和模型框架,如何找到最优的参数 $w$ 和 $b$ 呢?答案在于最大化似然 (Maximizing Likelihood)

我们定义一个似然函数 $L(w,b)$。这个函数的核心思想是:在给定一组模型参数 $w$ 和 $b$ 的条件下,我们实际观测到的这组训练数据 $(\hat{y}^1, \hat{y}^2, \hat{y}^3, \dots)$ 出现的概率有多大。

$$L(w, b) = f_{w,b}(x^1) f_{w,b}(x^2) (1 - f_{w,b}(x^3)) \cdots$$

为什么是这样的乘积形式呢?

这里我们假设每个样本的类别预测是相互独立的事件。

  • 对于第一个样本 $x^1$,如果它的真实标签 $\hat{y}^1 = 1$ (即属于类别1),我们自然希望模型预测它属于类别1的概率 $f_{w,b}(x^1)$ 尽可能大(接近1)。
  • 对于第二个样本 $x^2$,如果它的真实标签 $\hat{y}^2 = 1$ (即属于类别1),我们同样希望 $f_{w,b}(x^2)$ 尽可能大。
  • 对于第三个样本 $x^3$,如果它的真实标签 $\hat{y}^3 = 0$ (即属于类别2),这意味着我们希望模型预测它属于类别1的概率 $f_{w,b}(x^3)$ 尽可能小(接近0)。这等价于希望模型预测它属于类别2的概率 $1 - f_{w,b}(x^3)$ 尽可能大(接近1)。

因此,似然函数 $L(w,b)$ 就是将每个样本根据其真实标签所对应的模型预测概率相乘起来。我们的目标是找到一组参数 $w^*$ 和 $b^\*$,使得这个总的似然度 $L(w,b)$ 最大化。这意味着我们选择的参数能够使得当前观测到的数据出现的概率最大,即模型预测的结果与真实数据最为吻合。

$$w^\*, b^\* = \underset{w,b}{\arg \max} L(w,b)$$

优化技巧:最小化负对数似然

直接最大化 $L(w,b)$ 这个连乘积在计算上可能不太方便,尤其是当样本数量很多时,多个小于1的概率相乘可能会导致数值下溢。因此,在实践中,我们通常会对其进行一些转换:

$$w^\*, b^\* = \underset{w,b}{\arg \max} L(w,b) = \underset{w,b}{\arg \min} [-\ln L(w,b)]$$

为什么要取对数再取负号呢?

  1. 计算方便 (Logarithm for Numerical Stability and Simplicity): 对数函数 ($\ln$) 是一个单调递增函数。这意味着如果 $L(w,b)$ 越大,那么 $\ln L(w,b)$ 也越大。因此,最大化 $L(w,b)$ 与最大化 $\ln L(w,b)$ 是等价的。
  2. 乘积变求和 (Product to Sum): 对数运算可以将原来的概率连乘转换为对数概率的连加,即 $\ln(A \cdot B \cdot C) = \ln(A) + \ln(B) + \ln(C)$。求和形式在后续的求导和优化过程中通常更为简洁和稳定。
  3. 优化方向 (Minimization Convention): 在机器学习领域,我们通常习惯于将优化问题表述为最小化一个“损失函数”或“代价函数”。因此,我们将最大化 $\ln L(w,b)$ 的问题进一步转换为最小化其相反数 $-\ln L(w,b)$ 的问题。这个 $-\ln L(w,b)$ 就构成了我们所说的损失函数。

推导过程:负对数似然函数的具体形式

现在,我们来具体展开 $-\ln L(w,b)$ 并进行简化。 以上述例子(假设 $\hat{y}^1=1, \hat{y}^2=1, \hat{y}^3=0, \dots$)为例:

$$L(w, b) = f_{w,b}(x^1) f_{w,b}(x^2) (1 - f_{w,b}(x^3)) \cdots$$

1. 应用对数性质

对 $L(w,b)$ 取负对数:

$$-\ln L(w, b) = -\ln \left[ f_{w,b}(x^1) f_{w,b}(x^2) (1 - f_{w,b}(x^3)) \cdots \right]$$

利用对数性质 $\ln(ABC) = \ln(A) + \ln(B) + \ln(C)$,以及 $-\ln(AB) = -\ln(A) - \ln(B)$,我们将乘积转换为求和:

$$-\ln L(w, b) = - \left[ \ln(f_{w,b}(x^1)) + \ln(f_{w,b}(x^2)) + \ln(1 - f_{w,b}(x^3)) + \cdots \right]$$

即:

$$-\ln L(w, b) = -\ln(f_{w,b}(x^1)) -\ln(f_{w,b}(x^2)) -\ln(1 - f_{w,b}(x^3)) - \cdots$$

2. 引入目标标签 $\hat{y}^n$ 实现统一表达

观察上述展开式,我们可以发现一个规律:

  • 对于真实标签 $\hat{y}^n = 1$ 的样本 $x^n$(属于类别1),其对负对数似然的贡献项是 $-\ln(f_{w,b}(x^n))$。我们希望 $f_{w,b}(x^n)$ 接近1,这样 $-\ln(f_{w,b}(x^n))$ 就会接近0,表示损失很小。
  • 对于真实标签 $\hat{y}^n = 0$ 的样本 $x^n$(属于类别2),其对负对数似然的贡献项是 $-\ln(1 - f_{w,b}(x^n))$。我们希望 $f_{w,b}(x^n)$ 接近0,从而 $1 - f_{w,b}(x^n)$ 接近1,这样 $-\ln(1 - f_{w,b}(x^n))$ 也会接近0,表示损失很小。

我们可以利用 $\hat{y}^n$ 的取值(0或1)来巧妙地将这两种情况统一成一个表达式。对于单个样本 $x^n$,其对负对数似然的贡献可以表示为:

$$\text{Loss}\_n = - \left[ \hat{y}^n \ln(f_{w,b}(x^n)) + (1 - \hat{y}^n)\ln(1 - f_{w,b}(x^n)) \right]$$

让我们验证一下这个统一表达式的巧妙之处:

  • 当 $\hat{y}^n = 1$ 时(样本属于类别1): $$\text{Loss}\_n = - \left[ 1 \cdot \ln(f_{w,b}(x^n)) + (1-1) \cdot \ln(1 - f_{w,b}(x^n)) \right] = -\ln(f_{w,b}(x^n))$$
  • 当 $\hat{y}^n = 0$ 时(样本属于类别2): $$\text{Loss}\_n = - \left[ 0 \cdot \ln(f_{w,b}(x^n)) + (1-0) \cdot \ln(1 - f_{w,b}(x^n)) \right] = -\ln(1 - f_{w,b}(x^n))$$ 可以看到,这个表达式完美地概括了两种情况。

3. 对所有样本求和得到总损失

最后,我们将所有 $N$ 个训练样本的损失项加起来,就得到了总的负对数似然函数,也就是我们最终的损失函数:

$$-\ln L(w, b) = \sum_{n=1}^{N} - \left[ \hat{y}^n \ln(f_{w,b}(x^n)) + (1 - \hat{y}^n)\ln(1 - f_{w,b}(x^n)) \right]$$

关键一步:与交叉熵的联系 🔗

这个推导出来的损失函数形式,和我们常说的交叉熵 (Cross-Entropy) 有什么关系呢?

在信息论中,交叉熵 $H(p, q)$ 是用来衡量两个概率分布 $p$(真实分布)和 $q$(预测分布)之间差异性的一种度量。其一般定义为:

$$H(p, q) = - \sum_{x} p(x) \ln(q(x))$$

其中 $x$ 代表所有可能的事件。

在我们的二分类问题中,对于单个样本 $x^n$:

  • 真实分布 $p$: 由真实标签 $\hat{y}^n$ 决定。
    • $p(\text{类别}=1 \text{ for } x^n) = \hat{y}^n$ (样本 $x^n$ 真实为类别1的概率)
    • $p(\text{类别}=0 \text{ for } x^n) = 1 - \hat{y}^n$ (样本 $x^n$ 真实为类别2的概率)
  • 模型预测分布 $q$: 由模型输出的概率 $f_{w,b}(x^n)$ 决定。
    • $q(\text{类别}=1 \text{ for } x^n) = f_{w,b}(x^n)$ (模型预测 $x^n$ 为类别1的概率)
    • $q(\text{类别}=0 \text{ for } x^n) = 1 - f_{w,b}(x^n)$ (模型预测 $x^n$ 为类别2的概率)

将这两个分布代入二元情况下的交叉熵公式(只有两个可能事件:类别1和类别0):

$$H(p_{\text{true for } x^n}, q_{\text{model for } x^n}) = - \left[ p(\text{类别}=1) \ln(q(\text{类别}=1)) + p(\text{类别}=0) \ln(q(\text{类别}=0)) \right]$$

代入具体的 $\hat{y}^n$ 和 $f_{w,b}(x^n)$:

$$H(p_{\text{true for } x^n}, q_{\text{model for } x^n}) = - \left[ \hat{y}^n \ln(f_{w,b}(x^n)) + (1 - \hat{y}^n) \ln(1 - f_{w,b}(x^n)) \right]$$

这与我们前面推导出的负对数似然函数中,单个样本的损失项是完全一致的!


总结:所以,为什么是交叉熵?

通过上述一步步的推导,我们可以清晰地看到:

对于逻辑回归(以及许多其他输出概率的分类模型),最小化负对数似然函数的过程,实际上等价于最小化真实标签所代表的概率分布与模型预测的概率分布之间的交叉熵

因此,交叉熵作为损失函数并非是研究人员拍脑袋想出来的,而是源自统计学中非常核心的最大似然估计 (Maximum Likelihood Estimation, MLE) 原则。它自然地成为了衡量分类模型(尤其是输出概率的模型)预测好坏的损失函数。

当我们训练模型,试图通过调整参数 $w$ 和 $b$ 来使得交叉熵损失函数尽可能小时,我们实际上是在驱动模型的预测概率分布去无限逼近数据的真实概率分布。这正是我们期望模型能做到的——准确地反映数据中蕴含的模式和规律。

这也就解释了为什么在处理分类问题,特别是那些模型输出是概率值的场景下,交叉熵通常比均方误差更为合适和有效。均方误差主要衡量的是预测值与真实数值标签之间的欧氏距离,而交叉熵则更深刻地从信息论和概率分布的角度衡量了预测的“准确性”。