手撕深度学习:矩阵求导链式法则与矩阵乘法反向传播公式,深度学习进阶必备!
手撕深度学习矩阵求导链式法则与矩阵乘法反向传播公式深度学习进阶必备深度学习看似神秘但核心其实只是数学和代码的优雅结合。尤其是反向传播Backpropagation它是训练神经网络的引擎。而矩阵求导和链式法则则是理解反向传播的基石。本文将从最基础的概念出发手撕矩阵乘法反向传播公式并配以可运行的代码示例帮助你彻底搞懂深度学习中的梯度计算。## 1. 从标量到矩阵求导的维度升级如果你已经熟悉一元函数的求导比如y f(x)中dy/dx的意义那么恭喜你你已经有了基础。但在深度学习中我们处理的往往是高维数据输入是矩阵X权重是矩阵W输出是矩阵Y。此时导数不再是单个数字而是雅可比矩阵Jacobian Matrix。关键概念对于一个函数Y f(X)其中Y是m×n矩阵X是p×q矩阵那么导数dY/dX是一个四维张量m×n×p×q。但在实际计算中我们通常只关心梯度标量对矩阵的导数或者使用分母布局来简化。为什么要理解矩阵求导因为神经网络中每个权重矩阵的更新都需要计算损失函数对该矩阵的偏导数。如果我们能推导出矩阵乘法的反向传播公式就可以直接写出代码避免手动计算复杂的高维导数。## 2. 链式法则把复杂拆解成简单链式法则告诉我们复合函数的导数等于内部函数导数的乘积。在深度学习中神经网络就是一个巨大的复合函数Loss L( f( g( h(X) ) ) )反向传播就是从输出端开始逐层计算梯度并沿着计算图反向传播。数学形式如果z g(y)y f(x)那么dz/dx (dz/dy) * (dy/dx)当变量是矩阵时乘法变成矩阵乘法或张量缩并但思想完全一致。## 3. 矩阵乘法反向传播公式推导假设我们有一个简单的全连接层Y X W b其中X是(batch_size, input_dim)W是(input_dim, output_dim)Y是(batch_size, output_dim)。反向传播时我们已知损失L对Y的梯度dL/dY需要求出dL/dW和dL/dX。### 3.1 标量角度推导直观理解为了简化我们先考虑单个样本y x w其中x是行向量w是列向量y是标量。-y x1*w1 x2*w2 ...-dy/dw x因为dy/dw_i x_i-dy/dx w因为dy/dx_i w_i扩展到矩阵形式-dL/dW X^T dL/dY矩阵乘法满足链式法则转置是因为维度匹配-dL/dX dL/dY W^T### 3.2 维度检查法实用技巧一个简单的方法来验证公式检查矩阵维度。-dL/dY形状(batch_size, output_dim)-dL/dW形状(input_dim, output_dim)与 W 相同-X形状(batch_size, input_dim)- 要得到(input_dim, output_dim)唯一途径是X^T dL/dY因为(input_dim, batch_size) (batch_size, output_dim) (input_dim, output_dim)。同理-dL/dX形状(batch_size, input_dim)- 要得到这个形状需要dL/dY W^T因为(batch_size, output_dim) (output_dim, input_dim) (batch_size, input_dim)。这就是矩阵乘法反向传播的黄金公式## 4. 代码示例手动实现矩阵乘法反向传播下面我们使用 NumPy 实现一个简单的全连接层并手动计算梯度与自动微分结果对比验证。pythonimport numpy as np# 设置随机种子保证可复现np.random.seed(42)# 模拟数据batch_size 3input_dim 4output_dim 2# 随机生成输入和权重X np.random.randn(batch_size, input_dim)W np.random.randn(input_dim, output_dim)# 前向传播Y X W # 形状: (3, 4) (4, 2) - (3, 2)# 假设损失函数对Y的梯度已知这里使用随机梯度模拟dL_dY np.random.randn(batch_size, output_dim)# --- 手动反向传播 ---# 公式: dL/dW X^T dL/dYdL_dW_manual X.T dL_dY # 形状: (4, 3) (3, 2) - (4, 2)# 公式: dL/dX dL/dY W^TdL_dX_manual dL_dY W.T # 形状: (3, 2) (2, 4) - (3, 4)# --- 使用自动微分验证这里用数值梯度近似---# 对W的数值梯度epsilon 1e-5dL_dW_numeric np.zeros_like(W)for i in range(W.shape[0]): for j in range(W.shape[1]): W_plus W.copy() W_minus W.copy() W_plus[i, j] epsilon W_minus[i, j] - epsilon Y_plus X W_plus Y_minus X W_minus # 假设损失函数是线性这里使用 dL_dY 作为权重 # 实际上我们需要知道损失函数的精确形式这里简化为: # 假设损失 L sum(Y * dL_dY) (即线性函数) L_plus np.sum(Y_plus * dL_dY) L_minus np.sum(Y_minus * dL_dY) dL_dW_numeric[i, j] (L_plus - L_minus) / (2 * epsilon)# 比较结果print(手动计算的 dL/dW (前两行):)print(dL_dW_manual[:2])print(\n数值梯度 dL/dW (前两行):)print(dL_dW_numeric[:2])print(\n最大误差:, np.max(np.abs(dL_dW_manual - dL_dW_numeric)))运行结果分析手动计算的梯度与数值梯度完全一致误差在1e-9级别证明我们的反向传播公式正确。## 5. 代码示例完整的神经网络层反向传播接下来实现一个带有偏置项的全连接层展示完整的反向传播流程。pythonimport numpy as npclass LinearLayer: 全连接层支持反向传播 def __init__(self, input_dim, output_dim): # 初始化权重和偏置 self.W np.random.randn(input_dim, output_dim) * 0.01 self.b np.zeros((1, output_dim)) self.X None # 保存输入用于反向传播 def forward(self, X): 前向传播 Y X W b self.X X return X self.W self.b def backward(self, dL_dY, lr0.01): 反向传播计算梯度并更新参数 # 计算梯度 dL_dW self.X.T dL_dY # 权重梯度 dL_dX dL_dY self.W.T # 输入梯度用于传到上一层 dL_db np.sum(dL_dY, axis0, keepdimsTrue) # 偏置梯度对batch求和 # 梯度下降更新参数 self.W - lr * dL_dW self.b - lr * dL_db return dL_dX # 返回对输入的梯度# 测试反向传播np.random.seed(123)layer LinearLayer(4, 3)# 模拟输入X np.random.randn(2, 4) # batch_size2Y_forward layer.forward(X)# 模拟上游梯度dL_dY np.random.randn(2, 3)# 反向传播dL_dX layer.backward(dL_dY, lr0.1)# 验证维度print(输入 X 形状:, X.shape)print(前向输出 Y 形状:, Y_forward.shape)print(反向传播输出 dL/dX 形状:, dL_dX.shape) # 应与X相同print(更新后 W 形状:, layer.W.shape) # 保持不变输出解释-dL/dX的形状与输入X一致证明反向传播可以正确地将梯度传递给前一层。- 权重W和偏置b已经按照梯度下降更新这是训练神经网络的核心步骤。## 6. 矩阵求导的链式法则在多层网络中的应用在一个多层网络中假设我们有Z1 X W1 b1A1 ReLU(Z1)Z2 A1 W2 b2L loss(Z2, y)反向传播时1. 先计算dL/dZ22. 然后dL/dW2 A1^T dL/dZ23. 接着dL/dA1 dL/dZ2 W2^T4. 通过ReLU激活函数dL/dZ1 dL/dA1 * ReLU(Z1)5. 最后dL/dW1 X^T dL/dZ1整个过程中矩阵乘法反向传播公式dL/dW X^T dL/dY和dL/dX dL/dY W^T反复出现是通用的模式。## 7. 总结本文从矩阵求导的基本概念出发推导了矩阵乘法反向传播的黄金公式-权重梯度dL/dW X^T dL/dY-输入梯度dL/dX dL/dY W^T这两个公式是理解深度学习反向传播的钥匙。通过维度检查法和数值梯度验证我们确认了公式的正确性。最后完整的代码示例展示了如何在实际神经网络层中实现反向传播。**核心要点**1. 矩阵求导的链式法则本质上是标量链式法则的推广关键在于维度匹配。2. 反向传播公式可以通过简单的维度分析来记忆和验证。3. 手动实现反向传播是理解深度学习框架如 PyTorch、TensorFlow内部机制的最佳途径。当你下次面对复杂的神经网络结构时只要记住这两个矩阵公式反向传播就不再神秘。继续手撕代码深度学习的大门已经为你敞开

相关新闻

爬虫转大模型:采集能力没变,为什么你从“调包侠”成了“架构师”?

爬虫转大模型:采集能力没变,为什么你从“调包侠”成了“架构师”?

聊《爬虫转大模型,真正值钱的为什么不是会调 API?》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要前两年,如果你简历上写着“精通 Scrapy/Selenium,日抓千万级数…

2026/10/3 12:33:42 阅读更多 →
生活类AI视频不是“换脸+配音”!行业首份《生活场景语义理解白皮书》深度拆解

生活类AI视频不是“换脸+配音”!行业首份《生活场景语义理解白皮书》深度拆解

更多请点击: https://codechina.net 第一章:生活类AI视频的本质认知与范式跃迁 生活类AI视频并非传统视频生产流程的简单自动化延伸,而是以多模态理解、具身推理与情境化生成为内核的新型内容范式。其本质在于将人类日常行为逻辑、空间语义约…

2026/10/2 19:01:28 阅读更多 →
手把手复现:用LangChain+LayoutParser+自建实体词典,在3小时内搭建支持多模板变更的智能表单解析系统

手把手复现:用LangChain+LayoutParser+自建实体词典,在3小时内搭建支持多模板变更的智能表单解析系统

更多请点击: https://intelliparadigm.com 第一章:AI 自动化表单处理 在现代企业数字化转型中,表单数据采集仍大量依赖人工录入与校验,导致效率低下、错误率高且难以扩展。AI 自动化表单处理通过结合光学字符识别(OCR…

2026/9/29 21:05:44 阅读更多 →

最新新闻

OpenRig模拟驾驶舱DIY指南:铝型材框架与FOV计算实战

OpenRig模拟驾驶舱DIY指南:铝型材框架与FOV计算实战

1. 为什么想折腾一套openrig如果你经常逛硬件社区,会发现“rig”这个词出现频率极高,老外管自己组装的电脑、驾驶舱、直播台都叫rig。我最近花了三个晚上重新折腾了一套“openrig”,说白了就是一套完全开放式设计、图纸和孔位逻辑都摆在外面、…

2026/10/4 18:09:09 阅读更多 →
Codex CLI + Ace Data Cloud:基于MCP协议的AI工作台实战

Codex CLI + Ace Data Cloud:基于MCP协议的AI工作台实战

1. 项目概述:为什么一个命令行工具值得被重新定义为“工作台”Codex CLI 不是新面孔——它最早作为 GitHub 官方推出的轻量级代码理解辅助工具出现,主打本地化、低延迟、可嵌入的代码上下文解析能力。但过去两年,它的角色正在发生质变&#x…

2026/10/4 18:09:09 阅读更多 →
Qwen Image 2.1工程落地:6步加速打造生产级图像生成工作流

Qwen Image 2.1工程落地:6步加速打造生产级图像生成工作流

1. 这不是“又一个图像模型评测”,而是实打实的工程落地手记Qwen Image 2.1发布后,我第一时间拉了模型权重、搭了本地推理环境,但真正卡住我的不是模型本身,而是它怎么“活”进日常工作中——不是跑个demo截图发朋友圈&#xff0c…

2026/10/4 18:09:09 阅读更多 →
DEiT实战指南:中小数据集上高效训练图像分类Transformer

DEiT实战指南:中小数据集上高效训练图像分类Transformer

简介:DEiT 是由 Facebook 在 2020 年提出的高效图像分类 Transformer 模型,通过知识蒸馏与训练策略改进,消除了 Transformer 难以训练的痛点,在仅使用 ImageNet 数据、4 块 GPU 训练三天的条件下就达到了 SOTA 水平。该压缩包围绕…

2026/10/4 18:09:09 阅读更多 →
2026年AI大模型推理平台七家对比:模型覆盖、定价、速度与合规四维测评

2026年AI大模型推理平台七家对比:模型覆盖、定价、速度与合规四维测评

2026 年年中这轮盘点看下来,主流 AI 大模型推理平台已经在四个维度上形成清晰分工:模型覆盖度、定价、速度、合规。整体格局可以概括为——OpenRouter 和 DeepInfra 偏模型广度,Fireworks、Together、Groq 偏推理性能,国内平台在访…

2026/10/4 18:09:09 阅读更多 →
MRAM取代Flash与EEPROM:STM32掉电数据保存实战方案

MRAM取代Flash与EEPROM:STM32掉电数据保存实战方案

做工业设备的嵌入式开发,最绕不开的老大难就是数据掉电保存。EEPROM写寿命有限,Flash要先擦后写又慢得让人心焦,特别是处理高频参数记录和故障瞬间保存这种需求,总得在容量、寿命、速度之间反复妥协。这两年我在几个项目里改用 Ev…

2026/10/4 18:08:09 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 1:00:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →