1. 基本概念:熵与交叉熵
要理解多分类交叉熵损失的由来,首先需要掌握信息论中的两个基础概念:熵(Entropy)和交叉熵(Cross-Entropy)。
熵(Entropy)
熵衡量一个随机变量的不确定性。对于一个离散随机变量 X X X(例如类别分布),其熵定义为: H ( X ) = − ∑ i = 1 C p i log ( p i ) H(X) = -\sum_{i=1}^{C} p_i \log(p_i) H(X)=−i=1∑Cpilog(pi)- C C C:可能的类别数。
- p i p_i pi:类别 i i i 发生的真实概率。
- 意义:熵越大,分布的不确定性越高。例如,若所有类别概率相等,熵最大;若某类别概率为 1,其余为 0,熵为 0。
交叉熵(Cross-Entropy)
交叉熵衡量两个概率分布 P P P(真实分布)和 Q Q Q(预测分布)之间的差异,定义为: H ( P , Q ) = − ∑ i = 1 C p i log ( q i ) H(P, Q) = -\sum_{i=1}^{C} p_i \log(q_i) H(P,Q)=−i=1∑Cpilog(qi)- p i p_i pi:真实分布 P P P 中类别 i i i 的概率。
- q i q_i qi:预测分布 Q Q Q 中类别 i i i 的概率。
- 意义:交叉熵越小,说明预测分布 Q Q Q 越接近真实分布 P P P。交叉熵总是大于等于熵 H ( P ) H(P) H(P)(根据 KL 散度的非负性)。
在分类问题中,交叉熵损失函数正是基于这一概念,用于量化模型预测概率与真实标签之间的差距。
2. 多分类问题的设置
在多分类任务中,假设有 C C C 个类别,每个样本属于其中一个类别。以下是问题的数学建模:
真实标签
真实标签通常采用 one-hot 编码 表示:- 如果样本属于第 k k k 类,则标签为 y = [ y 1 , y 2 , … , y C ] y = [y_1, y_2, \dots, y_C] y=[y1,y2,…,yC],其中 y k = 1 y_k = 1 yk=1,其他 y i = 0 y_i = 0 yi=0( i ≠ k i \neq k i=k)。
- 因此,真实分布 P P P 是确定的: p i = y i p_i = y_i pi=yi。
模型预测
模型通过 softmax 函数 将线性输出转化为概率分布: p i = e z i ∑ j = 1 C e z j p_i = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} pi=∑j=1Cezjezi- z i = θ i T x z_i = \theta_i^T x zi=θiTx:第 i i i 类的线性输出(logit),其中 θ i \theta_i θi 是类别 i i i 的参数向量, x x x 是输入特征。
- p i p_i pi:模型预测样本属于第 i i i 类的概率,且满足 ∑ i = 1 C p i = 1 \sum_{i=1}^{C} p_i = 1 ∑i=1Cpi=1。
- 意义:softmax 将任意实数 z i z_i zi 转换为概率,确保输出是一个合法的概率分布。
3. 交叉熵损失的推导
多分类交叉熵损失的推导基于信息论中的交叉熵定义,结合分类问题的特性。
交叉熵定义
根据交叉熵的公式,真实分布 P P P(由 y i y_i yi 表示)和预测分布 Q Q Q(由 p i p_i pi 表示)之间的交叉熵为: H ( P , Q ) = − ∑ i = 1 C y i log ( p i ) H(P, Q) = -\sum_{i=1}^{C} y_i \log(p_i) H(P,Q)=−i=1∑Cyilog(pi)损失函数
在机器学习中,我们将交叉熵直接作为损失函数 L L L: L = H ( P , Q ) = − ∑ i = 1 C y i log ( p i ) L = H(P, Q) = -\sum_{i=1}^{C} y_i \log(p_i) L=H(P,Q)=−i=1∑Cyilog(pi)- 解释:由于 y i y_i yi 是 one-hot 编码,只有真实类别 k k k 的 y k = 1 y_k = 1 yk=1,其他 y i = 0 y_i = 0 yi=0。因此,损失简化为: L = − log ( p k ) L = -\log(p_k) L=−log(pk)
- k k k:真实类别的索引。
- 意义:损失只与模型对正确类别的预测概率 p k p_k pk 有关。 p k p_k pk 越接近 1, − log ( p k ) -\log(p_k) −log(pk) 越小,损失越低。
- 解释:由于 y i y_i yi 是 one-hot 编码,只有真实类别 k k k 的 y k = 1 y_k = 1 yk=1,其他 y i = 0 y_i = 0 yi=0。因此,损失简化为: L = − log ( p k ) L = -\log(p_k) L=−log(pk)
推导过程
- 真实分布: P P P 是确定的(例如, [ 0 , 0 , 1 , 0 ] [0, 0, 1, 0] [0,0,1,0]),由标签 y i y_i yi 给出。
- 预测分布: Q Q Q 是模型通过 softmax 输出的概率分布 p i p_i pi。
- 目标:最小化 H ( P , Q ) H(P, Q) H(P,Q),使 p i p_i pi 接近 y i y_i yi。
4. 为什么使用交叉熵损失?
交叉熵损失在多分类问题中被广泛采用,有以下几个原因:
与最大似然估计(MLE)的联系
- 在统计学中,最大似然估计的目标是最大化数据的似然函数。
- 对于一个样本,似然函数是模型正确预测的概率: L = p k L = p_k L=pk( k k k 是真实类别)。
- 对数似然: log ( L ) = log ( p k ) \log(L) = \log(p_k) log(L)=log(pk),
- 最小化交叉熵 − log ( p k ) -\log(p_k) −log(pk) 等价于最大化对数似然。
- 推导:
- 假设有 N N N 个独立样本,总对数似然为: log L ( θ ) = ∑ n = 1 N log ( p n , k n ) \log L(\theta) = \sum_{n=1}^{N} \log(p_{n,k_n}) logL(θ)=n=1∑Nlog(pn,kn)
- 最小化平均交叉熵: L = − 1 N ∑ n = 1 N ∑ i = 1 C y n , i log ( p n , i ) = − 1 N ∑ n = 1 N log ( p n , k n ) L = -\frac{1}{N} \sum_{n=1}^{N} \sum_{i=1}^{C} y_{n,i} \log(p_{n,i}) = -\frac{1}{N} \sum_{n=1}^{N} \log(p_{n,k_n}) L=−N1n=1∑Ni=1∑Cyn,ilog(pn,i)=−N1n=1∑Nlog(pn,kn)
- 因此,最小化交叉熵等价于最大化似然。
梯度计算简便
- 交叉熵损失与 softmax 函数结合时,梯度形式非常简洁: ∂ L ∂ z k = p k − y k \frac{\partial L}{\partial z_k} = p_k - y_k ∂zk∂L=pk−yk
- 意义:梯度直接是预测概率与真实标签的差值,便于反向传播和参数优化。
惩罚错误预测
- 当 p k p_k pk 很小时(即模型对正确类别的置信度低), − log ( p k ) -\log(p_k) −log(pk) 变得很大,从而对错误预测施加较大惩罚。
- 这激励模型提高对正确类别的预测概率。
5. 总结
多分类交叉熵损失函数的由来和推导可以总结为:
- 信息论基础:交叉熵衡量真实分布与预测分布的差异。
- 多分类建模:真实标签用 one-hot 编码表示,预测概率通过 softmax 函数生成。
- 损失函数: L = − ∑ i = 1 C y i log ( p i ) L = -\sum_{i=1}^{C} y_i \log(p_i) L=−∑i=1Cyilog(pi),对于单个样本简化为 L = − log ( p k ) L = -\log(p_k) L=−log(pk)。
- 优化联系:最小化交叉熵等价于最大化对数似然。
- 梯度简洁:结合 softmax,梯度为 p k − y k p_k - y_k pk−yk,便于梯度下降优化。
通过这一损失函数,模型能够有效学习多分类任务中的类别分布,提高分类准确性。
1. 多分类交叉熵损失函数的定义
对于多分类任务,假设有 C C C 个类别,交叉熵损失函数的公式为:
CE = − ∑ i = 1 C y i log ( p i ) \text{CE} = -\sum_{i=1}^{C} y_i \log(p_i) CE=−i=1∑Cyilog(pi)
变量说明:
- C C C:类别总数。
- y i y_i yi:真实标签的 one-hot 编码。如果样本属于第 k k k 类,则 y k = 1 y_k = 1 yk=1,其他 y i = 0 y_i = 0 yi=0。
- p i p_i pi:模型预测样本属于第 i i i 类的概率,通常通过 softmax 函数计算: p i = e z i ∑ j = 1 C e z j p_i = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} pi=∑j=1Cezjezi
- z i = θ i T x z_i = \theta_i^T x zi=θiTx:第 i i i 类的线性输出。
- θ i \theta_i θi:第 i i i 类对应的参数向量。
- x x x:输入特征向量。
目标:通过调整参数 θ i \theta_i θi(每个类别对应一组参数),使预测概率 p i p_i pi 尽可能接近真实标签 y i y_i yi。
2. 梯度下降的基本原理
梯度下降通过以下公式更新模型参数:
θ new = θ − η ∇ L ( θ ) \theta_{\text{new}} = \theta - \eta \nabla L(\theta) θnew=θ−η∇L(θ)
- η \eta η:学习率,控制参数更新的步长。
- ∇ L ( θ ) \nabla L(\theta) ∇L(θ):损失函数 L ( θ ) L(\theta) L(θ) 对参数 θ \theta θ 的梯度。
在多分类问题中,参数 θ \theta θ 通常是一个矩阵,形状为 ( C , 特征数 ) (C, \text{特征数}) (C,特征数),每行对应一个类别的参数向量。梯度 ∇ L ( θ ) \nabla L(\theta) ∇L(θ) 也具有相同的形状。
3. 多分类交叉熵损失的梯度计算
我们需要计算损失函数 CE \text{CE} CE 对每个类别参数 θ k \theta_k θk 的梯度,即 ∂ CE ∂ θ k \frac{\partial \text{CE}}{\partial \theta_k} ∂θk∂CE。由于 θ k \theta_k θk 是一个向量,梯度也是一个向量。
推导过程
使用链式法则分解梯度:
∂ CE ∂ θ k = ∂ CE ∂ z k ⋅ ∂ z k ∂ θ k \frac{\partial \text{CE}}{\partial \theta_k} = \frac{\partial \text{CE}}{\partial z_k} \cdot \frac{\partial z_k}{\partial \theta_k} ∂θk∂CE=∂zk∂CE⋅∂θk∂zk
(1) 计算 ∂ CE ∂ z k \frac{\partial \text{CE}}{\partial z_k} ∂zk∂CE
损失函数为:
CE = − ∑ i = 1 C y i log ( p i ) \text{CE} = -\sum_{i=1}^{C} y_i \log(p_i) CE=−i=1∑Cyilog(pi)
对 z k z_k zk 求偏导数:
∂ CE ∂ z k = − ∑ i = 1 C y i ⋅ 1 p i ⋅ ∂ p i ∂ z k \frac{\partial \text{CE}}{\partial z_k} = -\sum_{i=1}^{C} y_i \cdot \frac{1}{p_i} \cdot \frac{\partial p_i}{\partial z_k} ∂zk∂CE=−i=1∑Cyi⋅pi1⋅∂zk∂pi
计算 ∂ p i ∂ z k \frac{\partial p_i}{\partial z_k} ∂zk∂pi
由于 p i = e z i ∑ j = 1 C e z j p_i = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} pi=∑j=1Cezjezi 是 softmax 函数,我们需要分别考虑 i = k i = k i=k 和 i ≠ k i \neq k i=k 的情况:- 当 i = k i = k i=k 时: ∂ p k ∂ z k = p k ( 1 − p k ) \frac{\partial p_k}{\partial z_k} = p_k (1 - p_k) ∂zk∂pk=pk(1−pk) (softmax 对自身变量的导数类似于 sigmoid)。
- 当 i ≠ k i \neq k i=k 时: ∂ p i ∂ z k = − p i p k \frac{\partial p_i}{\partial z_k} = -p_i p_k ∂zk∂pi=−pipk (由于 p i p_i pi 的分母包含 e z k e^{z_k} ezk,增加 z k z_k zk 会减少 p i p_i pi)。
代入损失函数的导数
将 ∂ p i ∂ z k \frac{\partial p_i}{\partial z_k} ∂zk∂pi 代入:∂ CE ∂ z k = − [ y k ⋅ 1 p k ⋅ p k ( 1 − p k ) + ∑ i ≠ k y i ⋅ 1 p i ⋅ ( − p i p k ) ] \frac{\partial \text{CE}}{\partial z_k} = -\left[ y_k \cdot \frac{1}{p_k} \cdot p_k (1 - p_k) + \sum_{i \neq k} y_i \cdot \frac{1}{p_i} \cdot (-p_i p_k) \right] ∂zk∂CE=− yk⋅pk1⋅pk(1−pk)+i=k∑yi⋅pi1⋅(−pipk)
化简:
- 第一项: y k ( 1 − p k ) y_k (1 - p_k) yk(1−pk),
- 第二项: ∑ i ≠ k y i ⋅ ( − p k ) = − p k ∑ i ≠ k y i \sum_{i \neq k} y_i \cdot (-p_k) = -p_k \sum_{i \neq k} y_i ∑i=kyi⋅(−pk)=−pk∑i=kyi。
合并: ∂ CE ∂ z k = − y k ( 1 − p k ) − p k ∑ i ≠ k y i \frac{\partial \text{CE}}{\partial z_k} = -y_k (1 - p_k) - p_k \sum_{i \neq k} y_i ∂zk∂CE=−yk(1−pk)−pki=k∑yi
利用 one-hot 编码特性
因为 y y y 是 one-hot 向量, ∑ i = 1 C y i = 1 \sum_{i=1}^{C} y_i = 1 ∑i=1Cyi=1,且如果 y k = 1 y_k = 1 yk=1,则 ∑ i ≠ k y i = 0 \sum_{i \neq k} y_i = 0 ∑i=kyi=0;如果 y k = 0 y_k = 0 yk=0,则 ∑ i ≠ k y i = 1 \sum_{i \neq k} y_i = 1 ∑i=kyi=1。我们可以进一步化简: ∂ CE ∂ z k = − y k ( 1 − p k ) + p k ( 1 − y k ) \frac{\partial \text{CE}}{\partial z_k} = -y_k (1 - p_k) + p_k (1 - y_k) ∂zk∂CE=−yk(1−pk)+pk(1−yk) 展开: = − y k + y k p k + p k − y k p k = p k − y k = -y_k + y_k p_k + p_k - y_k p_k = p_k - y_k =−yk+ykpk+pk−ykpk=pk−yk结果: ∂ CE ∂ z k = p k − y k \frac{\partial \text{CE}}{\partial z_k} = p_k - y_k ∂zk∂CE=pk−yk
这个结果非常简洁,表示损失对 z k z_k zk 的变化率等于预测概率与真实标签的差值。
(2) 计算 ∂ z k ∂ θ k \frac{\partial z_k}{\partial \theta_k} ∂θk∂zk
线性输出定义为:
z k = θ k T x z_k = \theta_k^T x zk=θkTx
对 θ k \theta_k θk 求梯度:
∂ z k ∂ θ k = x \frac{\partial z_k}{\partial \theta_k} = x ∂θk∂zk=x
- 解释: z k z_k zk 是 θ k \theta_k θk 和 x x x 的内积,梯度是一个向量,与输入特征 x x x 相同。
(3) 合并梯度
应用链式法则:
∂ CE ∂ θ k = ∂ CE ∂ z k ⋅ ∂ z k ∂ θ k = ( p k − y k ) x \frac{\partial \text{CE}}{\partial \theta_k} = \frac{\partial \text{CE}}{\partial z_k} \cdot \frac{\partial z_k}{\partial \theta_k} = (p_k - y_k) x ∂θk∂CE=∂zk∂CE⋅∂θk∂zk=(pk−yk)x
- 完整梯度:
对于每个类别 k k k( k = 1 , 2 , . . . , C k = 1, 2, ..., C k=1,2,...,C),梯度为: ∇ θ k CE = ( p k − y k ) x \nabla_{\theta_k} \text{CE} = (p_k - y_k) x ∇θkCE=(pk−yk)x
4. 梯度下降的训练过程
在多分类问题中,训练过程包括以下步骤:
前向传播
- 对于每个类别 i i i:
- 计算线性输出 z i = θ i T x z_i = \theta_i^T x zi=θiTx,
- 通过 softmax 函数计算概率: p i = e z i ∑ j = 1 C e z j p_i = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}} pi=∑j=1Cezjezi
- 对于每个类别 i i i:
计算损失
- 使用预测概率 p i p_i pi 和真实标签 y i y_i yi 计算交叉熵损失: CE = − ∑ i = 1 C y i log ( p i ) \text{CE} = -\sum_{i=1}^{C} y_i \log(p_i) CE=−i=1∑Cyilog(pi)
反向传播
- 计算损失对每个类别参数 θ k \theta_k θk 的梯度: ∇ θ k CE = ( p k − y k ) x \nabla_{\theta_k} \text{CE} = (p_k - y_k) x ∇θkCE=(pk−yk)x
更新参数
- 对每个类别的参数 θ k \theta_k θk 进行更新: θ k = θ k − η ( p k − y k ) x \theta_k = \theta_k - \eta (p_k - y_k) x θk=θk−η(pk−yk)x
- η \eta η 是学习率。
- 对每个类别的参数 θ k \theta_k θk 进行更新: θ k = θ k − η ( p k − y k ) x \theta_k = \theta_k - \eta (p_k - y_k) x θk=θk−η(pk−yk)x
重复迭代
- 对训练数据集重复上述步骤,直到损失收敛或达到预设的迭代次数。
5. 总结
多分类交叉熵损失函数在梯度下降中的应用过程可以概括为:
损失函数: CE = − ∑ i = 1 C y i log ( p i ) \text{CE} = -\sum_{i=1}^{C} y_i \log(p_i) CE=−i=1∑Cyilog(pi)
梯度: ∇ θ k CE = ( p k − y k ) x \nabla_{\theta_k} \text{CE} = (p_k - y_k) x ∇θkCE=(pk−yk)x
参数更新: θ k = θ k − η ( p k − y k ) x \theta_k = \theta_k - \eta (p_k - y_k) x θk=θk−η(pk−yk)x
关键点:
- 梯度 ( p k − y k ) x (p_k - y_k) x (pk−yk)x 表明参数调整方向取决于预测概率 p k p_k pk 与真实标签 y k y_k yk 的差值。
- 这种形式与二分类问题中的梯度 ( p − y ) x (p - y) x (p−y)x 类似,但多分类中需要为每个类别分别计算。
通过不断迭代,梯度下降使模型的预测概率分布逐渐接近真实标签分布,从而提高分类性能。
6. 交叉熵损失的梯度推导(简要说明)**
为了完整性,我们简要说明梯度计算过程:
目标:计算 L = − ∑ i = 1 C y i log ( p i ) L = -\sum_{i=1}^{C} y_i \log(p_i) L=−∑i=1Cyilog(pi) 对线性输出 z k z_k zk 的偏导数。
链式法则: ∂ L ∂ z k = ∑ i = 1 C ∂ L ∂ p i ⋅ ∂ p i ∂ z k \frac{\partial L}{\partial z_k} = \sum_{i=1}^{C} \frac{\partial L}{\partial p_i} \cdot \frac{\partial p_i}{\partial z_k} ∂zk∂L=i=1∑C∂pi∂L⋅∂zk∂pi
- ∂ L ∂ p i = − y i p i \frac{\partial L}{\partial p_i} = -\frac{y_i}{p_i} ∂pi∂L=−piyi。
- ∂ p i ∂ z k \frac{\partial p_i}{\partial z_k} ∂zk∂pi:
- 若 i = k i = k i=k: ∂ p k ∂ z k = p k ( 1 − p k ) \frac{\partial p_k}{\partial z_k} = p_k (1 - p_k) ∂zk∂pk=pk(1−pk),
- 若 i ≠ k i \neq k i=k: ∂ p i ∂ z k = − p i p k \frac{\partial p_i}{\partial z_k} = -p_i p_k ∂zk∂pi=−pipk。
合并: ∂ L ∂ z k = − y k p k ⋅ p k ( 1 − p k ) + ∑ i ≠ k ( − y i p i ) ⋅ ( − p i p k ) \frac{\partial L}{\partial z_k} = -\frac{y_k}{p_k} \cdot p_k (1 - p_k) + \sum_{i \neq k} (-\frac{y_i}{p_i}) \cdot (-p_i p_k) ∂zk∂L=−pkyk⋅pk(1−pk)+i=k∑(−piyi)⋅(−pipk) 化简后: ∂ L ∂ z k = p k − y k \frac{\partial L}{\partial z_k} = p_k - y_k ∂zk∂L=pk−yk
对参数的梯度: ∂ L ∂ θ k = ( p k − y k ) x \frac{\partial L}{\partial \theta_k} = (p_k - y_k) x ∂θk∂L=(pk−yk)x
- x x x:输入特征向量。