Softmax函数与交叉熵损失的联合梯度推导
题目描述
在神经网络的多分类任务中,Softmax函数常与交叉熵损失结合使用。面试中常要求推导该组合的梯度,即损失函数L关于模型权重W的偏导数∂L/∂W。理解这个推导过程对于掌握反向传播至关重要。
知识讲解
-
场景设定与符号定义
- 问题:我们有一个K类分类问题。
- 模型:对于一个输入样本x(特征向量),模型首先计算其对于每个类别k的"得分"(logit):
z_k = w_k^T x + b_k。这里,w_k是属于类别k的权重向量,b_k是偏置项。所有得分组成向量z = [z_1, z_2, ..., z_K]^T。 - Softmax层:将得分向量z转化为一个概率分布向量ŷ。
ŷ_i = Softmax(z_i) = e^{z_i} / (∑_{j=1}^{K} e^{z_j})
其中ŷ_i表示样本x属于类别i的预测概率,且满足∑_{i=1}^{K} ŷ_i = 1。 - 真实标签:真实标签y通常用one-hot向量表示。例如,如果真实类别是c,则
y_c = 1,对于所有j ≠ c,y_j = 0。 - 交叉熵损失函数:衡量预测概率分布ŷ与真实分布y之间的差异。
L = - ∑_{i=1}^{K} y_i log(ŷ_i)
由于y是one-hot向量(只有真实类别c处为1,其余为0),损失可简化为:
L = - y_c log(ŷ_c) = - log(ŷ_c)
-
目标与推导路线
- 目标:计算损失L对某个权重向量
w_k(或某个得分z_k)的梯度,即∂L / ∂w_k(或∂L / ∂z_k)。这是反向传播的核心步骤。 - 推导路线:应用链式法则。为了计算
∂L / ∂w_k,我们分解为:
∂L / ∂w_k = (∂L / ∂z_k) * (∂z_k / ∂w_k)
其中,∂z_k / ∂w_k = x(因为z_k = w_k^T x + b_k)。因此,关键在于求出"上游"梯度∂L / ∂z_k,即损失L关于得分z_k的偏导数。我们将对所有的k(从1到K)进行推导。
- 目标:计算损失L对某个权重向量
-
关键步骤:计算∂L / ∂z_k
-
链式法则应用:损失L是ŷ的函数,而每个ŷ_j又是所有z的函数。因此,根据多元链式法则:
∂L / ∂z_k = ∑_{j=1}^{K} (∂L / ∂ŷ_j) * (∂ŷ_j / ∂z_k)
这个求和是必要的,因为改变一个得分z_k会影响所有的预测概率ŷ_j。 -
计算第一项:∂L / ∂ŷ_j
由损失函数L = - ∑_{i=1}^{K} y_i log(ŷ_i),对某个特定的ŷ_j求导:
∂L / ∂ŷ_j = - y_j / ŷ_j
注意,这里y_j是常数(真实标签)。 -
计算第二项:∂ŷ_j / ∂z_k(这是最核心也最容易出错的一步)
这是Softmax函数的偏导数。需要分两种情况讨论,因为ŷ_j对z_k的导数在j = k和j ≠ k时结果不同。-
情况1:当 j = k
ŷ_j = e^{z_j} / (∑_{m=1}^{K} e^{z_m})
令S = ∑_{m=1}^{K} e^{z_m}。求∂ŷ_j / ∂z_k(此时j=k)。
这是商法则求导:∂ŷ_j / ∂z_k = (e^{z_j} * S - e^{z_j} * e^{z_k}) / S^2
由于j=k,可化简为:(e^{z_j} * S - e^{z_j} * e^{z_j}) / S^2 = (e^{z_j} / S) * (1 - e^{z_j} / S) = ŷ_j (1 - ŷ_j) -
情况2:当 j ≠ k
ŷ_j = e^{z_j} / S
现在对z_k(k≠j)求导。此时e^{z_j}是常数,S中包含e^{z_k}。
∂ŷ_j / ∂z_k = (0 * S - e^{z_j} * e^{z_k}) / S^2 = - (e^{z_j} / S) * (e^{z_k} / S) = - ŷ_j ŷ_k -
统一表示:
∂ŷ_j / ∂z_k = { ŷ_k (1 - ŷ_k), if j = k -ŷ_j ŷ_k, if j ≠ k }
这个结果可以简洁地写成:∂ŷ_j / ∂z_k = ŷ_j (δ_{jk} - ŷ_k),其中δ_{jk}是Kronecker delta函数(当j=k时为1,否则为0)。
-
-
合并两项,计算最终梯度
现在将两项代入总和:∂L / ∂z_k = ∑_{j=1}^{K} (∂L / ∂ŷ_j) * (∂ŷ_j / ∂z_k) = ∑_{j=1}^{K} (- y_j / ŷ_j) * (∂ŷ_j / ∂z_k)
将∂ŷ_j / ∂z_k的两种情况代入求和:
∂L / ∂z_k = ∑_{j=1}^{K} (- y_j / ŷ_j) * [ŷ_j (δ_{jk} - ŷ_k)]
注意,ŷ_j在分子分母中神奇地约掉了!
∂L / ∂z_k = - ∑_{j=1}^{K} y_j (δ_{jk} - ŷ_k)
将求和符号展开:
∂L / ∂z_k = - [ ∑_{j=1}^{K} y_j δ_{jk} - ∑_{j=1}^{K} y_j ŷ_k ]- 第一项
∑_{j=1}^{K} y_j δ_{jk}:只有当j=k时,δ_{jk}=1,所以这项的结果就是y_k。 - 第二项
∑_{j=1}^{K} y_j ŷ_k:ŷ_k与j无关,可以提到求和外面,变为ŷ_k ∑_{j=1}^{K} y_j。而真实标签y是one-hot向量,所有元素之和为1,即∑_{j=1}^{K} y_j = 1。所以第二项就是ŷ_k * 1 = ŷ_k。
因此:
∂L / ∂z_k = - (y_k - ŷ_k) = ŷ_k - y_k
- 第一项
-
最终的精美结果
损失L关于第k个类别得分的梯度为:
∂L / ∂z_k = ŷ_k - y_k
这是一个极其简洁且重要的结果。它表示梯度就是模型的预测概率减去真实的one-hot标签。
-
-
完成整个梯度计算
现在我们回到最初的目标,计算关于权重w_k的梯度:
∂L / ∂w_k = (∂L / ∂z_k) * (∂z_k / ∂w_k) = (ŷ_k - y_k) * x
对于偏置项b_k,同理可得:
∂L / ∂b_k = ŷ_k - y_k
总结
这个推导过程的关键在于熟练应用链式法则和Softmax函数的求导。最终得到的梯度公式∂L / ∂z_k = ŷ_k - y_k形式非常简洁,这使得其在反向传播中的计算非常高效。这个结果也直观地告诉我们,当预测值ŷ_k远离真实值y_k时,梯度较大,模型参数需要较大幅度的更新;当预测接近真实时,梯度变小,更新幅度减小。