懂了懂了,还是这样好理解。。。。那么反向传播的计算呢?通过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 ,则:
\[p_i = \frac{e^{z_i}}{\sum_{k=1}^C e^{z_k}} \]
\[L = -\sum_{i=1}^C y_i \log p_i \]
3. 计算梯度 \(\frac{\partial L}{\partial z_j}\)
这是一个非常重要的结果,也是 softmax 与交叉熵结合的美妙之处。
推导过程:
\[\frac{\partial L}{\partial z_j} = \sum_{i=1}^C \frac{\partial L}{\partial p_i} \cdot \frac{\partial p_i}{\partial z_j} \]
第一步:\(\frac{\partial L}{\partial p_i} = -\frac{y_i}{p_i}\)
第二步:需要计算 \(\frac{\partial p_i}{\partial z_j}\),分两种情况:
- 当 i = j 时:
\[\frac{\partial p_i}{\partial z_i} = p_i(1 - p_i) \]
- 当 i \\neq j 时:
\[\frac{\partial p_i}{\partial z_j} = -p_i p_j \]
现在代入:
\[\frac{\partial L}{\partial z_j} = \sum_{i=1}^C \left( -\frac{y_i}{p_i} \right) \cdot \frac{\partial p_i}{\partial z_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\)
所以:
\[\frac{\partial L}{\partial z_j} = -y_j(1-p_j) + \sum_{i \neq j} y_i p_j \]
注意 \(\sum_{i \neq j} y_i = 1 - y_j\)(因为 y 是 one-hot,总和为1)
因此:
\[\frac{\partial L}{\partial z_j} = -y_j + y_j p_j + p_j(1 - y_j) \]
\[= -y_j + p_j(y_j + 1 - y_j) \]
\[= p_j - y_j \]
4. 最终简洁结果
\[\boxed{\frac{\partial L}{\partial z_j} = p_j - y_j} \]
太漂亮了! 这个结果意味着:
- 梯度 = 预测概率 - 真实标签
- 对于真实类别(\(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\]
梯度:
\[\frac{\partial L}{\partial z} = p - y = [0.88-1, 0.12-0, 0.00-0] = [-0.12, 0.12, 0.00] \]
解释:
- 对真实类别(猫):梯度 -0.12 → 需要稍微增大 \(z_0\)
- 对其他类别(狗):梯度 +0.12 → 需要减小 \(z_1\)
- 对鸟:梯度 0 → 不需要改变
6. 扩展到 x 的梯度
如果我们有 z = Wx + b ,那么:
\[\frac{\partial L}{\partial x} = W^T \cdot \frac{\partial L}{\partial z} \]
因为 \\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 + 交叉熵在深度学习中被广泛使用------梯度计算既简洁又数值稳定!