认识交叉熵

信息熵
提到交叉熵,首先我们要知道熵的定义。熵也叫信息熵 H ( x ) H(x) H(x)表示在信号源发出信号后每个信号的平均信息量,即该信号源的平均编码长度。也表示在信号输出前,信号源的不确定性。用信息熵 H ( x ) H(x) H(x)来表征变量 x x x的随机性。信息量越大则信号源的不确定性就越强。当变量 x x x发生的概率为1时,信息熵为0.
H ( x ) = − ∑ i = 1 n p ( x i ) l o g p ( x i ) H(x)=-\sum_{i=1}^np(x_i)logp(x_i) H(x)=i=1np(xi)logp(xi)
相对熵
在衡量两个分布之间的差异时,通常用相对熵即KL散度来表示。设 p p p为目标概率分布, q q q为近似 p p p的概率分布,则 D K L ( p ∣ ∣ q ) D_{KL}(p||q) DKL(pq)表示两个分布 p p p q q q之间的差异:
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g p ( x i ) q ( x i ) = ∑ i = 1 n p ( x i ) l o g p ( x i ) − ∑ i = 1 n p ( x i ) l o g q ( x i ) = − ∑ i = 1 n p ( x i ) l o g q ( x i ) − ( − ∑ i = 1 n p ( x i ) l o g p ( x i ) ) = H ( p , q ) − H ( p ) D_{KL}(p||q) =\sum_{i=1}^np(x_i)log\frac{p(x_i)}{q(x_i)}\\ =\sum_{i=1}^np(x_i)logp(x_i)-\sum_{i=1}^np(x_i)logq(x_i)\\ =-\sum_{i=1}^np(x_i)logq(x_i)-(-\sum_{i=1}^np(x_i)logp(x_i))\\=H(p,q)-H(p) DKL(pq)=i=1np(xi)logq(xi)p(xi)=i=1np(xi)logp(xi)i=1np(xi)logq(xi)=i=1np(xi)logq(xi)(i=1np(xi)logp(xi))=H(p,q)H(p)
通过上式得到,相对熵=交叉熵-信息熵。两个分布差异越大相对熵越大,差异越小相对熵越小。当两个分布相同时,差异为0.

为什么在神经网络中使用交叉熵作为优化函数,而不是相对熵
在神经网络中,我们通常用交叉熵作为损失函数,是因为我们要用概率分布 q q q尽量逼近概率分布 p p p,而真实概率分布 p p p时固定的,所以其信息熵为定值。当要最小化分布 p 和 q p和q pq之间的相对熵时就是要最小化它们之间的交叉熵。

为什么在神经网络中使用交叉熵作为优化函数,而不是均方误差
以二分类为例,设最后一层的输入为 x l x_l xl,对应的该层的权重为 w l w_l wl,偏置为 b l b_l bl,激活函数为sigmoid函数,用 σ ( x ) \sigma(x) σ(x)表示, y ^ \hat{y} y^表示预测输出的类别。
y ^ = σ ( w l x l + b l ) = σ ( z ) \hat{y}=\sigma(w_lx_l+b_l)=\sigma(z) y^=σ(wlxl+bl)=σ(z)
其中 σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1 σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x)=\sigma(x)(1-\sigma(x)) σ(x)=σ(x)(1σ(x)).
当使用均方误差时,优化函数为 l = 1 2 ( y − y ^ ) 2 l=\frac{1}{2}(y-\hat{y})^2 l=21(yy^)2,对参数 w l w_l wl求导为: ∂ l ∂ w l = ( y − y ^ ) σ ′ ( z ) x l \frac{\partial{l}}{\partial{w_l}}=(y-\hat{y})\sigma'(z)x_l wll=(yy^)σ(z)xl
由于 σ ′ ( z ) \sigma'(z) σ(z)在绝大部分情况下导数值都很小,因此梯度更新较慢。而且根据链式法则可知当神经网络层数越深时越容易出现梯度消失问题。
当使用交叉熵时,优化函数为 l = − y l o g ( y ^ ) − ( 1 − y ) l o g ( 1 − y ^ ) l=-ylog(\hat{y})-(1-y)log(1-\hat{y}) l=ylog(y^)(1y)log(1y^),对参数 w l w_l wl求导为:
∂ l ∂ w l = ( − y y ^ + 1 − y 1 − y ^ ) σ ′ ( z ) x l = ( − y y ^ + 1 − y 1 − y ^ ) ( y ^ ( 1 − y ^ ) ) x l = ( y ^ − y ) x l \frac{\partial{l}}{\partial{w_l}}=(-\frac{y}{\hat{y}}+\frac{1-y}{1-\hat{y}})\sigma'(z)x_l\\ =(-\frac{y}{\hat{y}}+\frac{1-y}{1-\hat{y}})(\hat{y}(1-\hat{y}))x_l\\ =(\hat{y}-y)x_l wll=(y^y+1y^1y)σ(z)xl=(y^y+1y^1y)(y^(1y^))xl=(y^y)xl
计算得到的梯度已经和sigmoid的导数无关,而是由预测值和真实值之间的误差影响,误差越大梯度下降越快,因此避免了训练慢的问题。

参考链接:
1、如何通俗的解释交叉熵与相对熵?

### 关于二元交叉熵损失函数的研究 二元交叉熵是一种广泛应用于机器学习和深度学习领域中的损失函数,尤其适合处理二分类问题。它通过衡量真实分布与预测分布之间的差异来评估模型性能[^5]。 #### 二元交叉熵的定义 对于二分类问题,假设 \( y_i \in \{0, 1\} \) 表示样本的真实标签,\( p(y_i) \) 是模型对该样本属于正类别的概率估计,则二元交叉熵可以表示为: \[ L = -\frac{1}{N}\sum_{i=1}^{N}[y_i \cdot \log(p(y_i)) + (1-y_i)\cdot \log(1-p(y_i))] \] 其中 \( N \) 是样本总数。该公式能够有效捕捉到模型预测值与实际值之间的差距,并引导优化方向。 #### 相关研究论文推荐 以下是几篇涉及二元交叉熵及其应用的重要学术文章: 1. **Goodfellow et al., "Deep Learning"** 这本书全面介绍了深度学习的基础理论和技术细节,其中包括对不同类型的损失函数(如二元交叉熵)进行了深入探讨。书中不仅解释了为什么在某些场景下选择特定的损失函数更为合适,还提供了实现这些方法的具体指导[^3]。 2. **Hastie T., Tibshirani R., Friedman J.H., “The Elements of Statistical Learning”** 此书涵盖了统计学视角下的监督学习技术,特别强调了如何根据不同任务特性选取合适的评价指标或目标函数。作者讨论了最大似然估计原理同交叉熵之间关系等内容,这对于理解二元交叉熵的本质非常有帮助[^2]。 3. **Lin T.Y., Goyal P., Girshick R., He K., Dollar P., "Focal Loss for Dense Object Detection"** 虽然本文主要聚焦于解决密集物体检测中存在的类别不平衡问题而提出的焦点损失(focal loss),但它同样基于传统交叉熵构建而来,并对其局限性做了分析改进。因此阅读这篇文献可以帮助读者更好地认识标准形式之外变体版本的设计思路[^4]。 4. **Bishop C.M., Pattern Recognition and Machine Intelligence(Pattern Recognition And Machine Learning)** Bishop 的著作详尽阐述了许多模式识别算法背后的数学基础,包括但不限于贝叶斯决策论框架内的最小化期望风险准则推导出的各种成本敏感型距离测度表达式——这正是构成现代意义上的“loss function”的核心思想所在之处;同时也有专门章节讲述有关信息量测量工具即所谓的“entropy family”,从而为进一步探索诸如binary cross-entropy之类的特殊实例奠定坚实理论根基[^1]。 #### 实现代码示例 下面给出一段简单的 Python 实现用于计算给定数据集上的平均二元交叉熵误差: ```python import numpy as np def binary_cross_entropy_loss(y_true, y_pred): epsilon = 1e-7 # 防止取 log(0) y_pred_clipped = np.clip(y_pred, epsilon, 1 - epsilon) term_0 = (1 - y_true) * np.log(1 - y_pred_clipped + epsilon) term_1 = y_true * np.log(y_pred_clipped + epsilon) return -np.mean(term_0 + term_1) # 测试用例 if __name__ == "__main__": true_labels = np.array([0, 1]) predicted_probs = np.array([0.2, 0.8]) bce_loss = binary_cross_entropy_loss(true_labels, predicted_probs) print("Binary Cross Entropy Loss:", bce_loss) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值