多元交叉熵损失函数推导
时间: 2025-01-01 13:33:44 浏览: 14
### 多元交叉熵损失函数的数学推导
#### 定义与前向传播
对于一个多类分类问题,假设有 \( K \) 类。给定一个样本 \( x_i \),模型预测的概率分布为 \( p(y|x;W,b)_i = (p_1, p_2, ..., p_K)^T \),其中 \( W \) 和 \( b \) 分别代表权重矩阵和偏置项。真实的标签通常采用 one-hot 编码方式表示,记作 \( y_i=(y_{i1},...,y_{ik})^T \)[^1]。
为了衡量预测概率分布与实际标签之间的差异,引入了多元交叉熵作为损失函数:
\[ L(p,q)=\sum_k -q_k log(p_k)\]
这里 \( q_k \) 表示目标分布中的第 k 个分量(即真实标签),而 \( p_k \) 则对应于由模型计算得到的概率估计值[^3]。
当应用 softmax 函数时,上述公式变为:
\[L(\hat{y}_i,y_i)=-\log(e^{z_{yi}}/\sum_j e^{z_j})\]
其中 \( z=\textbf{x}^\top w+b \), 并且 \( yi \) 是指正确类别对应的索引位置[^4]。
#### 反向传播及其梯度计算
在训练阶段,需要通过链式法则来更新参数。因此有必要求解关于输入 logits 的梯度表达式。根据复合函数微分原理可得如下结果:
对于任意 j ≠ yi :
\[∂L/∂z_j=p_j-y_j\]
而对于 j=yi 来说,
\[∂L/∂z_{yi}=p_{yi}-y_{yi}\]
综上所述,在一般情形下,我们可以写出更简洁的形式:
\[∇_zL=softmax(z)-y\]
这表明误差信号可以直接通过对输出层激活值减去期望值得到;这种特性使得实现更加高效并有助于加速收敛速度。
```python
import numpy as np
def cross_entropy_loss(logits, labels):
"""
计算多分类交叉熵损失
参数:
logits: 形状为(N,C)的numpy数组,N是批量大小,C是类别数量
labels: 长度为N的一维整型列表或ndarray,指示每条记录的真实类别编号
返回:
float类型的标量平均损失值
"""
N = len(labels)
# 应用Softmax转换Logits至概率空间
exp_logits = np.exp(logits - np.max(logits, axis=1, keepdims=True))
probs = exp_logits / np.sum(exp_logits, axis=1, keepdims=True)
# 获取每个样例针对其真值类别的概率
correct_logprobs = -np.log(probs[np.arange(N), labels])
# 计算均方差
loss = np.mean(correct_logprobs)
return loss
def grad_cross_entropy_loss(logits, labels):
"""返回相对于logits的梯度"""
N = len(labels)
# 调用之前定义好的loss function获取probabilities
_, probs = cross_entropy_loss.__closure__[0].cell_contents(logits, labels)
dscores = probs.copy()
dscores[np.arange(N), labels] -= 1
dscores /= N
return dscores
```
阅读全文