基于Softmax与交叉熵损失的反向传播偏导求解咨询
咱们一步步来拆解——先确认Softmax+交叉熵组合的核心梯度,再把这些推导直接对应到你的3分类网络架构上。
先统一符号(和你的描述完全对齐)
- 输入层:$i_1, i_2$(2个神经元)
- 隐藏层:3个神经元$h_1, h_2, h_3$,每个的净输入为$net_{h_j} = w_{h_j,i1}i_1 + w_{h_j,i2}i_2 + b_{h_j}$(其中$w_{h_j,i1}$就是你说的w13:i1到h1的权重),激活后输出为$out_{h_j} = f(net_{h_j})$($f$是隐藏层激活函数,比如Sigmoid/ReLU,后续推导会用到)
- 输出层:3个神经元$o_1, o_2, o_3$,每个的**净输入(logits)**为$net_{o_i} = w_{o_i,h1}out_{h1} + w_{o_i,h2}out_{h2} + w_{o_i,h3}out_{h3} + b_{o_i}$(其中$w_{o_i,h1}$就是你说的w1:h1到o1的权重)
- Softmax输出:$S_i = \frac{e{net_{o_i}}}{\sum_{m=1}3 e^{net_{o_m}}}$(对应你提到的S1、S2、S3)
- 交叉熵损失:$L = -\sum_{i=1}^3 y_i \log(S_i)$,其中$y_i$是one-hot标签(比如正确类别是o1时,$y_1=1, y_2=y_3=0$)
核心推导:损失对输出层logits的偏导
这是Softmax+交叉熵组合最关键的简化结论,先验证这个核心偏导是否和你的推导一致:
我们对输出层第k个logit $net_{o_k}$ 求偏导:
$$
\frac{\partial L}{\partial net_{o_k}} = \frac{\partial}{\partial net_{o_k}} \left( -\sum_{i=1}^3 y_i \log\left( \frac{e{net_{o_i}}}{\sum_{m=1}3 e^{net_{o_m}}} \right) \right)
$$
拆分并化简后(利用$\log(a/b)=\log a - \log b$、$\log ex=x$,以及one-hot标签$\sum_{i=1}3 y_i=1$的特性),最终会得到:
$$
\boldsymbol{\frac{\partial L}{\partial net_{o_k}} = S_k - y_k}
$$
如果你的偏导方程和这个结论一致,那完全正确!这是Softmax与交叉熵组合的核心优势——梯度计算被大幅简化,不需要复杂的链式展开。
特定偏导数的推导(对应你的需求)
下面针对你提到的权重(w1、w13)以及其他常见的偏导场景,给出具体方程:
1. 损失对输出层权重的偏导(比如w1:h1→o1的权重)
用链式法则拆解:损失→$net_{o1}$→w1
$$
\frac{\partial L}{\partial w_{o1,h1}} = \frac{\partial L}{\partial net_{o1}} \cdot \frac{\partial net_{o1}}{\partial w_{o1,h1}}
$$
其中$\frac{\partial net_{o1}}{\partial w_{o1,h1}} = out_{h1}$(net_o1对w1的偏导就是h1的激活输出),代入核心结论得:
$$
\boldsymbol{\frac{\partial L}{\partial w_{o1,h1}} = (S_1 - y_1) \cdot out_{h1}}
$$
2. 损失对隐藏层权重的偏导(比如w13:i1→h1的权重)
链式法则拆解:损失→$out_{h1}$→$net_{h1}$→w13
$$
\frac{\partial L}{\partial w_{h1,i1}} = \frac{\partial L}{\partial out_{h1}} \cdot \frac{\partial out_{h1}}{\partial net_{h1}} \cdot \frac{\partial net_{h1}}{\partial w_{h1,i1}}
$$
其中:
- $\frac{\partial out_{h1}}{\partial net_{h1}} = f'(net_{h1})$(隐藏层激活函数的导数,比如Sigmoid的导数是$out_{h1}(1-out_{h1})$)
- $\frac{\partial net_{h1}}{\partial w_{h1,i1}} = i_1$(net_h1对w13的偏导就是输入i1)
- $\frac{\partial L}{\partial out_{h1}} = (S_1 - y_1)w_{o1,h1} + (S_2 - y_2)w_{o2,h1} + (S_3 - y_3)w_{o3,h1}$(h1输出会影响所有3个输出层的logits,需求和)
代入后得:
$$
\boldsymbol{\frac{\partial L}{\partial w_{h1,i1}} = \left[ (S_1 - y_1)w_{o1,h1} + (S_2 - y_2)w_{o2,h1} + (S_3 - y_3)w_{o3,h1} \right] \cdot f'(net_{h1}) \cdot i_1}
$$
3. 其他常见偏导补充
- 损失对输出层偏置的偏导(比如o1的偏置$b_{o1}$):$\boldsymbol{\frac{\partial L}{\partial b_{o1}} = S_1 - y_1}$
- 损失对隐藏层偏置的偏导(比如h1的偏置$b_{h1}$):$\boldsymbol{\frac{\partial L}{\partial b_{h1}} = \left[ (S_1 - y_1)w_{o1,h1} + (S_2 - y_2)w_{o2,h1} + (S_3 - y_3)w_{o3,h1} \right] \cdot f'(net_{h1})}$
- 损失对隐藏层输出的偏导(比如h1的输出$out_{h1}$):$\boldsymbol{\frac{\partial L}{\partial out_{h1}} = (S_1 - y_1)w_{o1,h1} + (S_2 - y_2)w_{o2,h1} + (S_3 - y_3)w_{o3,h1}}$
内容的提问来源于stack exchange,提问作者Arun

