【深度学习教程——】02_神经网络如何自动求导?反向传播的数学魔法

02_神经网络如何自动求导?反向传播的数学魔法

本章目标 :揭开深度学习框架最神秘的面纱 ------ 自动微分 (Autograd) 。我们将从最基础的链式法则 (Chain Rule) 出发,手写一个微型计算图引擎。


📖 目录 (Table of Contents)

  1. 从手算到图算:思维的转变
  2. 链式法则:梯度的"接力赛"
  3. [计算图 (Computational Graph):把运算变成节点](#计算图 (Computational Graph):把运算变成节点)
  4. [实战:手撕 Autograd 引擎 (不调包)](#实战:手撕 Autograd 引擎 (不调包))
  5. [PyTorch 的魔法:.backward() 到底干了什么?](#PyTorch 的魔法:.backward() 到底干了什么?)

1. 从手算到图算:思维的转变

在第1章,我们手算了 L o s s = ( x ⋅ w − y ) 2 Loss = (x \cdot w - y)^2 Loss=(x⋅w−y)2 的导数。

如果是 AlexNet(8层),也许还能手算。但如果是 ResNet-152(152层),手算全导数的公式写出来可能比万里长城还长。

我们需要一种通用的、模块化的求导方法。

这就好比:不要试图一步算出整个公司的利润,而是让每个部门算出自己的利润,最后汇总。


2. 链式法则:梯度的"接力赛"

由复合函数 y = f ( u ) , u = g ( x ) y = f(u), u = g(x) y=f(u),u=g(x),即 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x))。

链式法则告诉我们:
∂ y ∂ x = ∂ y ∂ u ⋅ ∂ u ∂ x \frac{\partial y}{\partial x} = \frac{\partial y}{\partial u} \cdot \frac{\partial u}{\partial x} ∂x∂y=∂u∂y⋅∂x∂u

这听起来很简单,但在神经网络中,它意味着:
如果你想知道这一层对最终 Loss 的影响,你只需要知道:

  1. 上游梯度 (Upstream Gradient):Loss 对下一层的影响。
  2. 本地梯度 (Local Gradient):你这层对下一层的导数。

3. 计算图 (Computational Graph):把运算变成节点

为了实现自动化,我们将数学公式拆解为图 (Graph)

每一个节点(加、减、乘、平方)都是一个守门人。它只需要管好自己的"Local Gradient"。

让我们画出 L o s s = ( x ⋅ w − T a r g e t ) 2 Loss = (x \cdot w - Target)^2 Loss=(x⋅w−Target)2 的计算图:


4. 实战:手撕 Autograd 引擎 (不调包)

为了彻底理解,我们用 Python Class 模拟这个过程。

python 复制代码
class Tensor:
    def __init__(self, data, requires_grad=False):
        self.data = data
        self.grad = 0.0
        self.requires_grad = requires_grad
        self.grad_fn = None

    def backward(self, grad=1.0):
        self.grad += grad
        if self.grad_fn:
            self.grad_fn(grad)

    def __mul__(self, other):
        out = Tensor(self.data * other.data, requires_grad=True)
        def backward_fn(upstream_grad):
            if self.requires_grad:
                self.backward(upstream_grad * other.data)
            if other.requires_grad:
                other.backward(upstream_grad * self.data)
        out.grad_fn = backward_fn
        return out

    def square(self):
        out = Tensor(self.data ** 2, requires_grad=True)
        def backward_fn(upstream_grad):
            if self.requires_grad:
                self.backward(upstream_grad * (2 * self.data))
        out.grad_fn = backward_fn
        return out

# === 验证 ===
x = Tensor(1.0, requires_grad=False)
w = Tensor(1.0, requires_grad=True)
t = Tensor(2.0, requires_grad=False)

# Forward
y = x * w
diff = y - t
loss = diff.square()

print(f"Loss data: {loss.data}")

# Backward
loss.backward()
print(f"w.grad: {w.grad}")

5. PyTorch 的魔法:.backward() 到底干了什么?

当我们调用 loss.backward() 时,PyTorch 做的事情和我们刚才的代码一模一样:

  1. 找到 lossgrad_fn
  2. 计算局部梯度。
  3. 乘以传入的梯度。
  4. 递归调用父节点的 grad_fn
  5. 直到遇到叶子节点(如 w),把由于累加到 w.grad 中。

➡️ 下一章:03_计算图是什么?PyTorch动态图机制解密

相关推荐
苍何fly2 小时前
全球首个AI原生电商视频Multi-Agent来了, 上传商品链接可一键出营销视频!
人工智能·经验分享
沃达德软件2 小时前
智慧警务技战法
大数据·数据仓库·hadoop·深度学习·机器学习·数据挖掘
果粒蹬i2 小时前
Python + AI:打造你的智能害虫识别助手
开发语言·人工智能·python
Blossom.1182 小时前
从单点工具到智能流水线:企业级多智能体AI开发工作流架构实战
人工智能·笔记·python·深度学习·神经网络·架构·whisper
2401_841495642 小时前
【机器学习】标准化流模型(NF)
人工智能·python·机器学习·标准化流模型·概率生成模型·可逆变换·概率密度变换
愚公搬代码2 小时前
【愚公系列】《AI短视频创作一本通》008-AI短视频脚本创作技巧(分析爆款短视频,快速掌握脚本创作技巧)
人工智能
凤希AI伴侣2 小时前
凤希AI伴侣:导航栏数据全面升级与AI落地的深度思考-2026年2月2日
人工智能·凤希ai伴侣
Blossom.1182 小时前
从“金鱼记忆“到“超级大脑“:2025年AI智能体记忆机制与MoE架构的融合革命
人工智能·python·算法·架构·自动化·whisper·哈希算法
资讯雷达2 小时前
VPX架构军工级SSD选型指南:板级定制与国产化解决方案(2026)
人工智能