Softmax函数与交叉熵损失的联合梯度推导
字数 2951 2025-11-03 00:19:05

Softmax函数与交叉熵损失的联合梯度推导

题目描述
在神经网络的多分类任务中,Softmax函数常与交叉熵损失结合使用。面试中常要求推导该组合的梯度,即损失函数L关于模型权重W的偏导数∂L/∂W。理解这个推导过程对于掌握反向传播至关重要。

知识讲解

  1. 场景设定与符号定义

    • 问题:我们有一个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 ≠ cy_j = 0
    • 交叉熵损失函数:衡量预测概率分布ŷ与真实分布y之间的差异。
      L = - ∑_{i=1}^{K} y_i log(ŷ_i)
      由于y是one-hot向量(只有真实类别c处为1,其余为0),损失可简化为:
      L = - y_c log(ŷ_c) = - log(ŷ_c)
  2. 目标与推导路线

    • 目标:计算损失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)进行推导。
  3. 关键步骤:计算∂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函数的偏导数。需要分两种情况讨论,因为ŷ_jz_k的导数在j = kj ≠ 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标签

  4. 完成整个梯度计算
    现在我们回到最初的目标,计算关于权重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时,梯度较大,模型参数需要较大幅度的更新;当预测接近真实时,梯度变小,更新幅度减小。

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 / ∂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 时,梯度较大,模型参数需要较大幅度的更新;当预测接近真实时,梯度变小,更新幅度减小。