神经网络:批量版仿射层反向传播权重矩阵更新问题咨询
批量仿射层反向传播:权重矩阵更新详解
嘿,我来帮你把批量场景下仿射层反向传播的权重更新逻辑理得明明白白~结合你用MNIST的场景(输入是784维的展平数组,输出10类得分),咱们一步步拆解:
先回忆批量正向传播的计算
首先明确各变量的维度(用numpy数组形状表述):
- 批量输入
X:(N, D),其中N是批量样本数,D=784(MNIST单图展平后的特征数) - 权重矩阵
W:(D, M),其中M=10(输出类别数) - 偏置
b:(1, M)(正向传播时会自动广播成(N, M),和X@W的结果相加) - 输出
Y:Y = X @ W + b(矩阵乘法+广播加法)
划重点:在你的AffineLayer类里,正向传播时一定要把输入X保存为实例变量(比如self.X = X),因为反向计算梯度时必须用到它!
反向传播:权重矩阵W的梯度计算(核心困惑点)
假设我们已经通过后续层的反向传播,得到了损失对输出Y的梯度dY(形状是(N, M))。现在要计算损失对W的梯度dW,核心逻辑是链式法则:
从单个样本到批量的推导
- 对单个样本
x_i(形状(1, D)),对应的损失对输出的梯度是dy_i(形状(1, M)),此时损失对W的梯度分量为x_i.T @ dy_i(形状(D, M)) - 批量场景下,总梯度就是所有单个样本梯度的总和,用矩阵乘法可以一次性完成这个求和操作:
这个矩阵乘法的本质,就是把每个样本的dW = X.T @ dY # X.T是(D, N),dY是(N, M),相乘得到(D, M),和W的形状完全匹配x_i.T @ dy_i结果做了求和,正好对应批量梯度的计算逻辑。
为什么必须用X.T?
维度匹配是核心原因:如果直接用X @ dY,得到的是(N, N)的矩阵,完全不符合W的形状。转置X后,才能让输入的特征维度和权重的输入维度对应上,最终得到和W同形状的梯度矩阵。
附赠:偏置b的梯度计算
偏置的梯度逻辑更简单:因为正向传播时b被广播到了每个样本,反向时需要把所有样本的dY在样本维度(axis=0)求和:
db = np.sum(dY, axis=0) # 得到(1, M),和b的形状完全一致
常见踩坑点提醒
- 忘记保存正向输入
X:反向计算dW时必须用到原始输入,所以一定要在forward方法里把X存在实例变量中 - 维度不匹配:比如误转置
dY、选错求和轴,要时刻检查每个变量的形状是否符合预期 - 梯度缩放:如果用小批量梯度下降(SGD),通常需要把
dW和db除以批量大小N,得到平均梯度再更新权重,这点别漏了!
内容的提问来源于stack exchange,提问作者NeoZoom.lua
相关产品推荐
相关产品推荐

