计算矩阵-向量点积的导数:神经网络反向传播局部梯度求解
没问题,我来帮你理清楚这个点积节点的局部梯度计算——完全按照CS231n里的反向传播思路来拆解!
首先明确正向计算逻辑:我们有一个3×3的权重矩阵$W$,和一个3×1的输入向量$a$,两者做点积得到3×1的输出向量$b$,也就是$b = W \cdot a$。接下来我们聚焦局部梯度的计算,以及它如何和上游梯度结合。
1. 局部梯度的本质(CS231n核心思路)
局部梯度指的是当前节点输出对输入的偏导数,它描述了“输入的微小扰动会如何直接影响输出”。对于我们的场景,就是要先算出$\frac{\partial b}{\partial W}$——也就是W的每个元素变化时,b的各个元素会怎么变。
2. 逐元素推导局部梯度
把点积拆成元素级的计算来看更清晰:
- $b_i = W_{i,1}a_1 + W_{i,2}a_2 + W_{i,3}a_3$(其中$i=1,2,3$,对应b的第i个元素)
现在求$\frac{\partial b_i}{\partial W_{m,n}}$(b的第i个元素对W第m行第n列元素的偏导数):
- 当$i=m$时:只有$W_{m,n}a_n$这一项会影响$b_m$,所以$\frac{\partial b_i}{\partial W_{m,n}} = a_n$
- 当$i≠m$时:W的这个元素和b的第i个元素完全无关,所以$\frac{\partial b_i}{\partial W_{m,n}} = 0$
简单说就是:W的第m行第n列元素,只会直接影响b的第m个元素,影响幅度等于a的第n个元素。
3. 结合上游梯度的链式传播(反向传播的核心)
在神经网络训练中,我们最终要的是损失对W的梯度$\frac{\partial \text{loss}}{\partial W}$,这就需要把局部梯度和上游传来的梯度$\nabla_b = \frac{\partial \text{loss}}{\partial b}$(这是一个3×1的向量,代表b的每个元素对损失的影响程度)做链式相乘。
根据链式法则:
$\frac{\partial \text{loss}}{\partial W_{i,j}} = \sum_{k=1}^3 \frac{\partial \text{loss}}{\partial b_k} \cdot \frac{\partial b_k}{\partial W_{i,j}}$
代入之前的局部梯度结果,只有当$k=i$时,$\frac{\partial b_k}{\partial W_{i,j}} = a_j$,其他项都是0,所以:
$\frac{\partial \text{loss}}{\partial W_{i,j}} = \nabla_b[i] \cdot a[j]$
把这个结果整理成矩阵乘法形式,会更简洁直观:
$\frac{\partial \text{loss}}{\partial W} = \nabla_b \cdot a^T$
这里$aT$是a的转置(1×3向量),3×1的$\nabla_b$和1×3的$aT$相乘,正好得到和W维度一致的3×3矩阵,完美匹配后续参数更新的需求。
4. 扰动视角的直观理解
你提到的“扰动W时b的变化”,可以这么具象化:如果给$W_{i,j}$加一个微小增量$\Delta W_{i,j}$,那么b的第i个元素会增加$\Delta W_{i,j} \cdot a_j$,其他元素完全不受影响。而反向传播时,我们把这个局部影响,和上游传来的“b的第i个元素对损失的重要性”(也就是$\nabla_b[i]$)相乘,就得到了$W_{i,j}$对最终损失的影响程度——这就是我们要的参数梯度。
内容的提问来源于stack exchange,提问作者Readingtao

