softmax,极大似然,交叉熵,KL散度

softmax函数

Softmax 函数 是一种常用的激活函数,广泛应用于机器学习和深度学习中,尤其是在多分类问题的输出层。它能将一个含任意实数的向量转化为另一个向量,其中每个元素的值都在 (0,1) 区间内,并且所有元素之和为 1。这使得它非常适合表示概率分布。

数学表达式:

给定一个向量 image,Softmax 函数定义如下:

image

Softmax 示例

假设我们有一个输出向量:

image

计算其 Softmax:

  1. 计算指数:

image

  1. 求和:

image

  1. 归一化:

image

最终输出:

image

代码示例(Python)

1
2
3
4
5
6
7
8
9
import numpy as np

def softmax(z):
exp_z = np.exp(z - np.max(z)) # 防止数值溢出
return exp_z / np.sum(exp_z)

# 示例输入
z = np.array([2.0, 1.0, 0.1])
print(softmax(z))

输出可能为:

1
[0.65900114 0.24196469 0.09903417]

极大似然估计

极大似然估计(MLE) 是一种常用的参数估计方法。其核心思想是:

在已知观测数据的前提下,找出最有可能产生这些数据的模型参数值。

换句话说,MLE 回答的问题是:

“哪一组参数最可能生成我们观察到的数据?”

基本概念

  • 设有一个概率模型,其参数为 image
  • 给定一组观测数据 image
  • 我们的目标是:找到使 image 最大的参数 image

其中:

  • image 称为似然函数(Likelihood Function)
  • MLE 就是在所有可能的 image 中,最大化这个似然函数的过程:

image

数学推导步骤

步骤 1:写出似然函数

假设样本独立同分布(i.i.d.),则联合概率为乘积:

image

为了方便计算,通常取对数(因为 log 是单调递增函数):

image

步骤 2:最大化对数似然函数

通过求导并令导数为零,解出最优 image

image

或者使用数值优化方法(如梯度上升)来求解。

举例说明

示例 1:伯努利分布中的参数估计(抛硬币)

假设你抛了 10 次硬币,得到的结果是:

image

其中 1 表示正面,0 表示反面。设正面出现的概率为 image

1. 写出似然函数:

image

2. 取对数:

image

3. 对 image 求导并令导数为 0:

image

解得:

image

✅ 所以根据极大似然估计,这枚硬币正面朝上的概率为 0.7。


示例 2:高斯分布的均值估计

假设我们从一个正态分布中抽取了样本 image,我们要估计均值 image

1. 似然函数:

image

2. 对数似然函数:

image

忽略常数项后,只需最大化:

image

最小化平方误差 ⇒ 得到:

image

✅ 所以高斯分布的均值 MLE 就是样本均值。


MLE 的性质与优缺点

特性 描述
一致性 当样本量增大时,MLE 估计值会收敛于真实参数值
渐近无偏性 样本足够多时,MLE 估计值趋于无偏
渐近正态性 MLE 估计值在大样本下服从正态分布
计算复杂性 对某些复杂模型难以解析求解,需要数值方法
对异常值敏感 若数据中有异常点,可能会导致估计偏差

交叉熵损失

交叉熵损失(Cross-Entropy Loss) 是机器学习中用于衡量两个概率分布之间差异的指标,常用于分类任务中。它在逻辑回归、神经网络分类器中被广泛使用,尤其是在输出层使用 Softmax 函数 后。

基本思想:

给定一个真实标签的概率分布 image 和模型预测的概率分布 image,交叉熵衡量的是使用 image 来编码数据时的信息量(或者说“代价”)。值越小,说明预测越接近真实。

交叉熵的数学定义

信息论角度:

对于离散随机变量,交叉熵定义为:

image

其中:

  • image:真实分布(通常是 one-hot 编码)
  • image:模型预测的概率分布

分类任务中的交叉熵损失函数

场景一:多分类任务(Softmax + Cross-Entropy)

这是最常见的情形,例如图像分类问题。

输入:

  • 真实标签:one-hot 向量 image
  • 预测输出:Softmax 输出的概率分布 image

损失函数公式:

image

因为 image 是 one-hot 向量,只有一个位置是 1,其余是 0,所以也可以简化为:

image

其中 image 是真实类别的索引。

示例:

  • 真实类别是第 2 类(one-hot: [0, 1, 0])
  • 模型预测概率为:[0.2, 0.7, 0.1]

则交叉熵损失为:

image


场景二:二分类任务(Sigmoid + Binary Cross-Entropy)

适用于输出是两个类别的任务,如判断是否是猫。

损失函数公式:

image

其中:

  • image:真实标签
  • image:模型预测的概率(通常通过 Sigmoid 得到)

交叉熵与极大似然估计(MLE)的关系

交叉熵损失本质上是 负对数似然函数(Negative Log-Likelihood, NLL) 的推广。

我们希望最大化似然函数:

image

取对数后变为:

image

为了最小化损失,我们取负号:

image

这就是交叉熵损失的形式!

✅ 所以可以说:

最小化交叉熵损失 ≈ 最大化似然函数 ≈ 极大似然估计


Python 实现交叉熵损失

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

def cross_entropy_loss(y_true, y_pred):
"""
y_true: 真实标签 one-hot 编码
y_pred: 经过 softmax 的预测概率
"""
epsilon = 1e-15 # 防止 log(0)
y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
return -np.sum(y_true * np.log(y_pred))

# 示例
y_true = np.array([0, 1, 0]) # 真实类别是第2类
y_pred = np.array([0.2, 0.7, 0.1]) # 模型预测的概率
print("Cross-Entropy Loss:", cross_entropy_loss(y_true, y_pred))

输出:

1
Cross-Entropy Loss: 0.3566749439387324

交叉熵是怎么来的

交叉熵(Cross-Entropy)的定义公式来源于信息论中的 香农信息论(Shannon Information Theory),它的提出是为了衡量两个概率分布之间的差异,特别是在编码理论和机器学习中被广泛使用。

下面我将从 信息量、熵、KL散度 的角度出发,一步步推导出 交叉熵的定义公式,并解释它为什么是这个形式。

信息量(Information Content)

在信息论中,一个事件的信息量与它的发生概率成反比:

image

  • 概率越小的事件,其发生时携带的信息越多。
  • 比如抛硬币出现“连续10次正面”的信息量就远大于“一次正反交替”。

信息熵(Shannon Entropy)

信息熵是对一个随机变量所有可能取值的平均信息量:

image

简称“熵”,表示系统的不确定性。熵越大,系统越不确定;熵越小,越确定。

KL 散度(Kullback–Leibler Divergence)

KL 散度用于衡量两个概率分布 imageimage 之间的差异:

image

也可以写成:

image

其中:

  • image:真实分布的信息熵
  • imageimageimage 的交叉熵(见下文)

KL 散度具有以下性质:

  • 非对称性:image
  • 始终 ≥ 0,当且仅当 image 时等于 0

交叉熵(Cross-Entropy)

根据 KL 散度的定义:

image

于是我们定义交叉熵为:

image

✅ 所以,交叉熵的本质是:

在使用模型预测分布 image 来编码真实分布 image 时所需的平均比特数(信息量)。
它包含了两部分:

  • 真实分布本身的熵 image
  • 使用 image 编码带来的额外代价(即 KL 散度)

在分类任务中应用交叉熵

在机器学习中,尤其是分类问题中,我们通常有:

  • 真实标签 image 是 one-hot 向量(例如 [0, 1, 0]
  • 模型输出的概率分布 image(例如通过 Softmax 得到)

所以交叉熵损失函数为:

image

由于 one-hot 编码只有一个位置是 1,其余为 0,所以可以简化为:

image

其中 image 是真实类别对应的索引。

KL散度

非常好的问题!KL 散度(Kullback–Leibler Divergence)的定义形式:

image

这个公式看起来有些“神秘”,但其实它有着非常深刻的 信息论背景统计意义。下面我们从多个角度来解释:


KL 散度的本质:衡量两个分布之间的差异

KL 散度是用来衡量两个概率分布 imageimage 之间的“距离”的,但它不是真正的距离(不满足对称性、三角不等式)。它的核心思想是:

当我们用一个不准确的分布 image 去近似真实分布 image 时,会带来多少额外的信息成本?


从编码理论的角度理解 KL 散度

在信息论中,我们希望用尽可能少的比特数来编码数据。

  • 如果我们知道数据的真实分布是 image,我们可以使用最优编码长度为:

image

  • 如果我们不知道真实分布,而是假设它是 image,那么我们使用的编码长度是:

image

那么平均来看,我们多用了多少比特?

这就是 KL 散度的含义:

image

✅ 所以,KL 散度就是使用错误分布 image 编码带来的平均额外比特数


从极大似然估计(MLE)和交叉熵的角度理解

我们再回顾一下:

  • 真实分布 image
  • 模型预测分布 image

KL 散度可以写成:

image

其中:

  • image 是真实分布的信息熵
  • image 是交叉熵

所以,最小化 KL 散度等价于最小化交叉熵,也等价于最大化似然函数(MLE)。

✅ KL 散度的定义本质上是为了让我们能定量地比较模型输出与真实分布之间的差距。


为什么是 image 这个形式?

我们来看看这个比值的含义:

情况 含义 对 KL 的影响
image 真实事件 image 很可能发生,但模型低估了它 导致 KL 很大(代价高)
image 模型高估了一个不太可能发生的事 KL 也会增大
image 分布一致 KL = 0

而选择 对数形式 是因为:

  1. 可加性:独立事件的信息量可以相加(符合香农信息论)
  2. 单调性:当 image,KL → 0
  3. 数学性质良好:便于求导、优化等操作

🔄 五、KL 散度 vs 交叉熵 vs 信息熵

这三个概念密切相关:

image

  • image:真实分布的信息熵(不可减少)
  • image:使用 image 来表示 image 所需的信息量
  • image:多出来的那部分信息量(即误差)

KL 散度的局限性

局限性 解释
不对称性 image
不满足三角不等式 不是严格意义上的“距离”
对零点敏感 imageimage,KL 散度无穷大

因此,在某些情况下我们会使用:

  • JS 散度(Jensen-Shannon Divergence)——对称且有界
  • Wasserstein 距离(Earth Mover’s Distance)——更适用于连续分布