【机器学习】分类问题-交叉熵(Cross-Entropy)

交叉熵是机器学习中用于衡量两个概率分布之间差异的一种损失函数,广泛用于分类问题(如逻辑回归、多分类神经网络)。交叉熵损失直接来源于信息论,特别适合概率建模问题。


1. 定义

交叉熵公式

给定真实分布 P 和预测分布 Q,交叉熵定义为:

H(P, Q) = -\sum_{i} P(i) \log Q(i)

  • P(i):真实分布中类别 i 的概率。
  • Q(i):预测分布中类别 i 的概率。
直观理解
  • 当 Q(i) 越接近 P(i),交叉熵值越小。
  • 如果预测 Q(i) 偏离真实分布 P(i),损失会快速增大。

2. 在分类问题中的应用

二分类问题

对于目标变量 y \in \{0, 1\},预测类别为 1 的概率记为 \hat{y},则交叉熵损失为:

\mathcal{L} = - \frac{1}{N} \sum_{i=1}^N \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right]

  • 直观解释
    • 如果 y_i = 1,只保留 -\log(\hat{y}_i),表示预测为正类的概率是否接近 1。
    • 如果 y_i = 0,只保留 -\log(1 - \hat{y}_i),表示预测为负类的概率是否接近 1。
示例

假设我们在做垃圾邮件分类任务,真实标签 yyy 表示邮件是否为垃圾邮件:

  • y = 1 表示垃圾邮件。
  • y = 0 表示非垃圾邮件。

模型的预测概率 \hat{y}​ 是邮件为垃圾邮件的概率。

  • 真实标签:y = 1(垃圾邮件)
  • 模型预测概率:\hat{y} = 0.8

交叉熵损失公式为:

\mathcal{L} = H(y, \hat{y}) = - \big[ y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \big]

将值代入公式:

H(y, \hat{y}) = - \big[ 1 \cdot \log(0.8) + (1 - 1) \cdot \log(1 - 0.8) \big]
H(y, \hat{y}) = - \log(0.8) \approx -(-0.2231) = 0.2231

因此,此样本的交叉熵损失为 0.2231

多分类问题

对于目标变量 y \in \{1, 2, \dots, K\},预测概率分布为 \hat{y} = [\hat{y}_1, \hat{y}_2, \dots, \hat{y}_K],真实类别的独热编码为 [0, \dots, 1, \dots, 0],则交叉熵损失为:

\mathcal{L} = -\frac{1}{N} \sum_{i=1}^N \sum_{k=1}^K 1(y_i = k) \log(\hat{y}_{i,k})

  • 1(y_i = k):指示函数,表示样本 i 是否属于类别 k。
  • \hat{y}_{i,k}:模型预测样本 i 属于类别 k 的概率。
示例

假设我们在做图片分类任务,有 3 个类别:

  • 类别 1:猫
  • 类别 2:狗
  • 类别 3:鸟

真实标签用 one-hot 编码表示:

  • y = [0, 1, 0],表示图片为“狗”。

模型输出的预测概率:

  • \hat{y} = [0.2, 0.7, 0.1]

交叉熵损失公式为:

\mathcal{L} =H(\mathbf{y}, \mathbf{\hat{y}}) = -\sum_{i} y(i) \log(\hat{y}(i))

将值代入公式:

H(\mathbf{y}, \mathbf{\hat{y}}) = - \big[ 0 \cdot \log(0.2) + 1 \cdot \log(0.7) + 0 \cdot \log(0.1) \big]
H(\mathbf{y}, \mathbf{\hat{y}}) = - \log(0.7) \approx 0.357

因此,此样本的交叉熵损失为 0.357


3. 与其他概念的关系

与负对数似然的关系

交叉熵损失是负对数似然(Negative Log-Likelihood, NLL)的具体形式,特别是对于分类问题:

  • 二分类交叉熵 = 负对数似然损失。
  • 多分类交叉熵 = Softmax + 负对数似然。
与信息论的关系
  • 交叉熵来源于信息熵:
    • 信息熵(Entropy):描述单一分布的不确定性。 H(P) = -\sum_{i} P(i) \log P(i)
    • 交叉熵:衡量一个分布 P 如何被另一个分布 Q 表示。
与 Kullback-Leibler 散度的关系

交叉熵和 KL 散度的关系为:

H(P, Q) = H(P) + D_{\text{KL}}(P || Q)

  • H(P):真实分布 P 的信息熵。
  • D_{\text{KL}}(P || Q):预测分布 Q 与真实分布 P 的差异。

. 性质与特点

优点
  1. 概率解释清晰:直接衡量预测分布与真实分布的差异。
  2. 数值敏感:能捕捉预测分布与目标分布之间的细微差别。
  3. 凸优化:在许多情况下,交叉熵损失是凸的,便于优化。
缺点
  1. 对错误预测敏感:如果预测概率接近 0,-\log(Q(i)) 会趋向无穷大。
  2. 数值问题:需对 \hat{y} 进行裁剪,如 \hat{y} = \text{clip}(\hat{y}, \epsilon, 1 - \epsilon),以避免 \log(0) 错误。

5. 代码实现

二分类交叉熵损失
import numpy as np

def binary_cross_entropy(y_true, y_pred):
    y_pred = np.clip(y_pred, 1e-10, 1 - 1e-10)  # 防止 log(0)
    return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))

# 示例
y_true = np.array([1, 0, 1, 0])
y_pred = np.array([0.9, 0.1, 0.8, 0.4])
loss = binary_cross_entropy(y_true, y_pred)
print("Binary Cross-Entropy Loss:", loss)

输出结果

Binary Cross-Entropy Loss: 0.23617255159896325
多分类交叉熵损失
from sklearn.metrics import log_loss

# 示例
y_true = [0, 2, 1, 2]  # 真实类别
y_pred = [
    [0.9, 0.05, 0.05],  # 预测概率分布
    [0.1, 0.1, 0.8],
    [0.2, 0.7, 0.1],
    [0.05, 0.1, 0.85]
]

loss = log_loss(y_true, y_pred)
print("Multi-class Cross-Entropy Loss:", loss)

输出结果

Multi-class Cross-Entropy Loss: 0.2119244851021358

6. 交叉熵损失的应用

  1. 逻辑回归

    • 使用二分类交叉熵来优化模型参数。
  2. 神经网络

    • 输出层结合 Sigmoid(用于二分类)或 Softmax(用于多分类)激活,常配合交叉熵损失。
  3. 生成模型

    • 衡量生成分布与真实分布的差异。
  4. 概率分布拟合

    • 对预测分布进行监督,提升模型对类别概率的建模能力。

交叉熵作为一种衡量概率分布差异的工具,不仅在分类任务中表现优异,还为概率建模问题提供了坚实的理论基础。

交叉熵损失函数在机器学习中,尤其是在分类任务中,具有广泛的应用。其核心思想是通过衡量两个概率分布之间的差异来优化模型的性能。交叉熵损失函数特别适用于输出为概率分布的模型,如逻辑回归和神经网络。 ### 交叉熵损失函数的原理 交叉熵损失函数的基本形式可以表示为: $$ H(y, \hat{y}) = -\sum_{i} y_i \log(\hat{y}_i) $$ 其中 $ y $ 是真实标签的概率分布,而 $ \hat{y} $ 是模型预测的概率分布。在二分类问题中,交叉熵损失函数通常被简化为: $$ L = -y \log(\hat{y}) - (1-y) \log(1-\hat{y}) $$ 对于多分类问题交叉熵损失函数则扩展为: $$ L = -\sum_{i=1}^{C} y_i \log(\hat{y}_i) $$ 其中 $ C $ 是类别数量,$ y_i $ 是样本属于第 $ i $ 类的真实标签(0或1),$ \hat{y}_i $ 是模型预测的该类概率[^1]。 ### 交叉熵损失函数的优点 1. **凸性与优化效率**:交叉熵损失函数的曲线是凸的,这意味着在使用梯度下降等优化算法时,能够更容易地找到全局最优解。loss越大,梯度越大,这有助于反向传播过程中更快地收敛。 2. **概率解释**:交叉熵损失函数直接衡量了真实分布与预测分布之间的差异,因此它能够很好地反映模型对概率的预测能力。 3. **梯度计算**:在梯度下降法中,交叉熵损失函数的梯度计算相对简单,且具有良好的数值稳定性。这对于训练深度神经网络尤为重要。 ### 交叉熵损失函数的应用 1. **逻辑回归**:在逻辑回归中,交叉熵损失函数与sigmoid激活函数结合使用,用于二分类任务。逻辑回归的输出是一个介于0和1之间的概率值,表示样本属于某一类的概率。 2. **神经网络**:在深度学习中,交叉熵损失函数通常与softmax激活函数一起使用,用于多分类任务。softmax函数将神经网络的输出转换为一个概率分布,而交叉熵损失函数则衡量这个分布与真实标签之间的差异。 3. **自然语言处理**:在自然语言处理领域,交叉熵损失函数常用于语言模型的训练。语言模型的目标是预测下一个词的概率分布,交叉熵损失函数能够有效地衡量模型预测的分布与实际词频分布之间的差异。 ### 示例代码 以下是一个简单的Python示例,展示了如何在逻辑回归中使用交叉熵损失函数: ```python import numpy as np def sigmoid(z): return 1 / (1 + np.exp(-z)) def cross_entropy_loss(y_true, y_pred): m = y_true.shape[0] loss = -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) return loss # 示例数据 X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]]) y = np.array([0, 0, 1, 1]) # 初始化权重 w = np.random.randn(2) b = 0 # 前向传播 z = np.dot(X, w) + b y_pred = sigmoid(z) # 计算损失 loss = cross_entropy_loss(y, y_pred) print("Cross Entropy Loss:", loss) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值