Softmax函数求导与梯度计算
题目描述
Softmax函数是深度学习和机器学习中用于多分类任务的核心激活函数,它将一个K维实值向量转换为概率分布。面试常要求推导Softmax函数对输入变量的偏导数,并解释其在反向传播中的应用。理解这一过程对掌握神经网络训练至关重要。
1. Softmax函数定义
对于K类分类问题,给定输入向量z = [z₁, z₂, ..., zₖ]ᵀ,Softmax函数计算第i类的概率为:
\[p_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} \]
其中分母是所有指数值的和,确保∑pᵢ = 1且pᵢ ∈ (0,1)。例如,若z = [2, 1, 0.1],则分母为e² + e¹ + e⁰·¹ ≈ 7.39 + 2.72 + 1.11 = 11.22,对应概率p = [0.63, 0.23, 0.10]。
2. 求导场景分析
我们需要求∂pᵢ/∂zⱼ,即第i个输出对第j个输入的偏导。分两种情况:
- 当i = j时:求pᵢ对自身输入zᵢ的偏导
- 当i ≠ j时:求pᵢ对其他输入zⱼ的偏导
3. i = j 时的求导过程
将pᵢ视为分子e^{zᵢ}与分母S = ∑e^{zₖ}的商:
\[\frac{\partial p_i}{\partial z_i} = \frac{e^{z_i} \cdot S - e^{z_i} \cdot e^{z_i}}{S^2} \]
提取公因式e^{zᵢ}:
\[= \frac{e^{z_i}(S - e^{z_i})}{S^2} = \frac{e^{z_i}}{S} \cdot \frac{S - e^{z_i}}{S} \]
代入pᵢ = e^{zᵢ}/S:
\[= p_i \cdot (1 - p_i) \]
4. i ≠ j 时的求导过程
此时分子e^{zᵢ}与zⱼ无关,仅分母S包含e^{zⱼ}。使用商法则:
\[\frac{\partial p_i}{\partial z_j} = \frac{0 \cdot S - e^{z_i} \cdot e^{z_j}}{S^2} \]
简化得:
\[= -\frac{e^{z_i} e^{z_j}}{S^2} = -\frac{e^{z_i}}{S} \cdot \frac{e^{z_j}}{S} \]
代入pᵢ和pⱼ的定义:
\[= -p_i p_j \]
5. 统一梯度公式
综合两种情况,引入Kronecker delta函数δᵢⱼ(当i=j时为1,否则为0):
\[\frac{\partial p_i}{\partial z_j} = p_i (\delta_{ij} - p_j) \]
例如对z = [2, 1, 0.1]的Softmax输出p,∂p₁/∂z₂ = -0.63×0.23 ≈ -0.145,表示z₂增大时p₁会减小。
6. 在交叉熵损失中的反向传播
设真实标签y为one-hot向量,交叉熵损失L = -∑yₖ log pₖ。反向传播时需计算∂L/∂zⱼ:
\[\frac{\partial L}{\partial z_j} = -\sum_{k=1}^K y_k \frac{\partial \log p_k}{\partial z_j} \]
代入∂log pₖ/∂zⱼ = (1/pₖ)·∂pₖ/∂zⱼ,利用Softmax导数公式得:
\[= -\sum_k y_k (\delta_{kj} - p_j) = p_j \sum_k y_k - y_j \]
由于∑yₖ = 1,最终得到关键结论:
\[\frac{\partial L}{\partial z_j} = p_j - y_j \]
此梯度直接表示预测概率与真实标签的差值,用于高效参数更新。
总结
Softmax求导的核心在于分情况讨论,最终结果p_i(δᵢⱼ - pⱼ)体现了概率间的竞争关系。在交叉熵损失中,这一推导使得梯度计算异常简洁,这是Softmax成为多分类首选的重要原因。