You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将反向传播导数转换为矩阵运算方程?

神经网络反向传播:标量导数转矩阵运算的解决方案

我正在学习神经网络,在反向传播步骤中遇到问题:已经算出标量形式的正确导数,但不知道如何结合矩阵运算实现,尤其是各变量形状不同,需要输出特定形状的结果。

我的导数表达式如下:

(((1-p)*y-p*(1-y))*e**(-z)*w2*w3*x1)/(p*(1-p)*(1+e**(-z))**(2))

各变量的矩阵形状:

p:(1,13)
y:(1,13)
z:(1,13)
w2:(50,50)
w3:(1,50)
x1:(50,76800)
e为常数(2.718281828459045)

这是猫狗二分类模型,x1是输入层,w2、w3是第二、三层权重,p是预测输出,z是sigmoid激活前的输出,y是真实标签,上述导数针对第一层权重w1,期望输出形状为(50,76800)。

我的尝试代码:

np.dot(np.dot(np.transpose(weights_2),np.dot(np.transpose(weights_3),dldp(a3,truth))),np.transpose(data))

核心解决步骤

要把标量导数转换成矩阵运算,需按反向传播的梯度传递逻辑拆解,同时匹配矩阵形状:

  1. 计算损失对z的导数(标量系数部分)
    先单独处理表达式中与权重无关的标量部分,得到形状为(1,13)的行向量:
import numpy as np

dL_dz = ((1 - p) * y - p * (1 - y)) * np.exp(-z) / (p * (1 - p) * (1 + np.exp(-z))**2)
  1. 传递梯度到第二层输出
    利用w3的转置将梯度从输出层传递到第二层,得到形状为(50,13)的梯度:
grad_h2 = np.dot(w3.T, dL_dz)  # w3.T形状(50,1),与(1,13)相乘得到(50,13)
  1. 传递梯度到第一层输出
    通过w2的转置将梯度传递到第一层,得到形状为(50,13)的梯度:
grad_h1 = np.dot(w2.T, grad_h2)  # w2.T形状(50,50),与(50,13)相乘得到(50,13)
  1. 计算对w1的导数
    将第一层梯度与输入x1的转置做矩阵乘法,得到期望的(50,76800)形状结果:
# 若x1是输入特征(标注形状可能存在笔误,实际应为(76800,13)),则用此代码;若x1是第一层输出,直接替换为x1即可
dL_dw1 = np.dot(grad_h1, x1.T)

关键说明

  • 矩阵乘法的核心是梯度反向传递:每一层的梯度等于下一层权重的转置与下一层梯度的乘积
  • 对权重的最终导数是当前层梯度与输入特征的矩阵乘法,确保形状与目标权重一致

内容的提问来源于stack exchange,提问作者Harish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:05:40