懂了懂了,还是这样好理解。。。。那么反向传播的计算呢?通过y1, y2, y3 求出x1 ?
太好了!现在我们来推导反向传播的计算。这是深度学习中最核心的部分!
1. 问题设定
我们有一个简单的三层结构:
输入 x → 线性层(得 z)→ softmax → 交叉熵损失 L
其中:
- $ z = Wx + b $(为了简化,我们先只考虑从 z 开始的反向传播)
- $ p = \text{softmax}(z) $
- $ L = -\sum y_i \log p_i $
我们要求 $ \frac{\partial L}{\partial z_j} $,也就是损失对原始输出 z 的梯度。
2. 已知关系
设类别数 $ C = 3 $,则:
3. 计算梯度 \(\frac{\partial L}{\partial z_j}\)
这是一个非常重要的结果,也是 softmax 与交叉熵结合的美妙之处。
推导过程:
第一步:\(\frac{\partial L}{\partial p_i} = -\frac{y_i}{p_i}\)
第二步:需要计算 \(\frac{\partial p_i}{\partial z_j}\),分两种情况:
- 当 $ i = j $时:
- 当 $ i \neq j $时:
现在代入:
分开求和:
- 当 \(i = j\) 时:项为 \(-\frac{y_j}{p_j} \cdot p_j(1-p_j) = -y_j(1-p_j)\)
- 当 \(i \neq j\) 时:项为 \(-\frac{y_i}{p_i} \cdot (-p_i p_j) = y_i p_j\)
所以:
注意 \(\sum_{i \neq j} y_i = 1 - y_j\)(因为 y 是 one-hot,总和为1)
因此:
4. 最终简洁结果
太漂亮了! 这个结果意味着:
- 梯度 = 预测概率 - 真实标签
- 对于真实类别(\(y_j=1\)):梯度 = \(p_j - 1\)(负数,需要增大 \(z_j\))
- 对于其他类别(\(y_j=0\)):梯度 = \(p_j - 0 = p_j\)(正数,需要减小 \(z_j\))
5. 例子验证
用我们刚才的例子:
- $ z = [3.0, 1.0, -1.0] $
- $ y = [1, 0, 0] $
- $ p = [0.88, 0.12, 0.00] $
梯度:
解释:
- 对真实类别(猫):梯度 -0.12 → 需要稍微增大 \(z_0\)
- 对其他类别(狗):梯度 +0.12 → 需要减小 \(z_1\)
- 对鸟:梯度 0 → 不需要改变
6. 扩展到 x 的梯度
如果我们有 $ z = Wx + b $,那么:
因为 $ \frac{\partial z}{\partial x} = W^T $。
总结反向传播流程:
- 前向计算:$ z → softmax → p → L = -\sum y_i \log p_i $
- 反向传播:
- $ \frac{\partial L}{\partial z} = p - y $(极其简洁!)
- 然后继续向后传播到 $ W, b, x $
这就是为什么 softmax + 交叉熵在深度学习中被广泛使用——梯度计算既简洁又数值稳定!
相关参考:
- How the backpropagation algorithm works
- 深度学习:完全理解反向传播算法(一)