Softmax求导及多元交叉熵损失梯度推导

探讨了多分类神经网络中,从输入样本到预测概率的计算过程,包括权重矩阵与偏置向量的作用,以及如何通过softmax函数获得分类概率。详细解析了交叉熵损失函数的数学推导,包括其在独热编码情况下的简化形式,以及如何计算损失函数关于权重矩阵的梯度,用于神经网络的反向传播和权重更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设n为特征个数,K为目标分类个数,则:
对于一个n×1n\times 1n×1输入样本向量
x=(x1,⋯ ,xi,⋯ ,xn)T x=(x_1,\cdots,x_i,\cdots,x_n)^T x=(x1,,xi,,xn)T
一个K×nK\times nK×n的权重矩阵W(每行对应一个类)
以及一个K×1K\times 1K×1的偏置向量b

z=Wx+bz=Wx+bz=Wx+b


zj=Wjx+bj=∑i=1nWj,ixi+bj z_j=W_j x+b_j=\displaystyle\sum_{i=1}^{n} W_{j,i}x_i + b_j zj=Wjx+bj=i=1nWj,ixi+bj

yyy为监督数据,y^\hat{y}y^为预测值,yyyy^\hat{y}y^均为K×1K\times 1K×1的向量。y^j\hat{y}_jy^j表示第样本xxx被分到第ttt个类的概率,
y^j=softmax(z)j=ezj∑k=1Kezk \hat{y}_j=softmax(z)_j=\frac{e^{z_{j}}}{\sum^{K}_{k=1}e^{z_{k}}} y^j=softmax(z)j=k=1Kezkezj
多分类交叉熵损失函数为:
Lcross-entropy(y^,y)=−∑yjlog(y^j) L_{\text{cross-entropy}}(\hat{y},y)=-\sum y_{j}log(\hat{y}_{j}) Lcross-entropy(y^,y)=yjlog(y^j)
假设只有一个正确分类为ttt,则yyy为独热向量,yt=1,yj≠t=0y_t=1,y_{j\neq t}=0yt=1,yj=t=0,则损失函数变为:

Lcross-entropy(y^,y)=−log(y^t) L_{\text{cross-entropy}}(\hat{y},y)=-log(\hat{y}_{t}) Lcross-entropy(y^,y)=log(y^t)
∂L∂y^t=−1y^t \dfrac{\partial L}{\partial \hat{y}_t}=-\dfrac{1}{\hat{y}_t} y^tL=y^t1
∂yt∂zt=∂(ezt∑ezk)∂zt=ezt∑ezk−eztezt(∑ezk)2=y^t(1−y^t) \begin{aligned} \dfrac{\partial y_t}{\partial z_t}&=\dfrac{\partial (\frac{e^{z_{t}}}{\sum e^{z_{k}}})}{\partial z_t} \\ &=\dfrac{e^{z_t}\sum{e^{z_k}}-e^{z_t}e^{z_t}}{(\sum e^{z_k})^2} \\ &=\hat{y}_t(1-\hat{y}_t) \end{aligned} ztyt=zt(ezkezt)=(ezk)2eztezkeztezt=y^t(1y^t)
j≠tj\ne tj=t时,
∂yt∂zj=∂(ezt∑ezk)∂zj=ezt∂(1∑ezk)∂zj=ezt−ezj(∑ezk)2=−y^ty^j \begin{aligned} \dfrac{\partial y_t}{\partial z_j}&=\dfrac{\partial (\frac{e^{z_{t}}}{\sum e^{z_{k}}})}{\partial z_j} \\ &=e^{z_t}\dfrac{\partial (\frac{1}{\sum e^{z_{k}}})}{\partial z_j} \\ &=e^{z_t}\dfrac{-e^{z_j}}{(\sum e^{z_k})^2} \\ &=-\hat{y}_t \hat{y}_j \end{aligned} zjyt=zj(ezkezt)=eztzj(ezk1)=ezt(ezk)2ezj=y^ty^j

∂L∂zt=∂L∂y^t∂yt∂zt=−1y^ty^t(1−y^t)=y^t−1 \begin{aligned} \dfrac{\partial L}{\partial z_t}&=\dfrac{\partial L}{\partial \hat{y}_t}\dfrac{\partial y_t}{\partial z_t} \\ &=-\dfrac{1}{\hat{y}_t}\hat{y}_t(1-\hat{y}_t) \\ &=\hat{y}_t-1 \end{aligned} ztL=y^tLztyt=y^t1y^t(1y^t)=y^t1
j≠tj\ne tj=t时,
∂L∂zj=∂L∂y^t∂yt∂zj=−1y^t(−y^ty^j)=y^j \begin{aligned} \dfrac{\partial L}{\partial z_j}&=\dfrac{\partial L}{\partial \hat{y}_t}\dfrac{\partial y_t}{\partial z_j} \\ &=-\dfrac{1}{\hat{y}_t}(-\hat{y}_t \hat{y}_j) \\ &=\hat{y}_j \end{aligned} zjL=y^tLzjyt=y^t1(y^ty^j)=y^j

实际上,当泛化到 yyy 不是独热向量的情况下,则有 ∂L∂zj=y^j−yj\frac{\partial{L}}{\partial{z_j}}=\hat{y}_j-y_jzjL=y^jyj.

对于包含一个隐藏层的3层神经网络,
此时假如输出y^\hat{y}y^=(0.1, 0.2, 0.3),假设输入x对应的正确分类为t=1,则对隐藏层求梯度结果为(0.1,0.2-1, 0.3)=(0.1, -0.8, 0.3)

此时再反向传播,对输入xxx求梯度,然后利用随机梯度下降更新隐藏层权重即可。

如果我们直接对WWW求导:
∂L∂Wt,i=∂L∂zt∂zt∂Wt,i=(y^t−1)xi \begin{aligned} \dfrac{\partial L}{\partial W_{t,i}}&=\dfrac{\partial L}{\partial z_t}\dfrac{\partial z_t}{\partial W_t,i} \\ &=(\hat{y}_t-1)x_i \end{aligned} Wt,iL=ztLWt,izt=(y^t1)xi
j≠tj\ne tj=t
∂L∂Wj,i=∂L∂zj∂zj∂Wj,i=(y^j)xi \begin{aligned} \dfrac{\partial L}{\partial W_{j,i}}&=\dfrac{\partial L}{\partial z_j}\dfrac{\partial z_j}{\partial W_j,i} \\ &=(\hat{y}_j)x_i \end{aligned} Wj,iL=zjLWj,izj=(y^j)xi

统一起来有:
∂L∂Wj,i=(y^j−1{j=t})xi \dfrac{\partial L}{\partial W_{j,i}}=(\hat{y}_j-1\{j=t\})x_i Wj,iL=(y^j1{j=t})xi
其中
1{j=t}={1,j=t0,j≠t 1\{j=t\}=\begin{cases} 1, &j=t \\ 0,&j\ne t \end{cases} 1{j=t}={1,0,j=tj=t

### 多元交叉熵损失函数的数学推导 #### 定义与前向传播 对于一个多类分类问题,假设有 \( 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 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值