链式法则与反向传播预览
本节是数学与深度学习的桥梁
链式法则解释了一个核心问题:对于一个有几百层的神经 网络,怎么算出损失函数对每个参数的导数? 答案就是反向传播——它本质上就是链式法则的系统化应用。
学习目标
- 理解链式法则——复合函数怎么求导
- 用简单的两层网络手动推导反向传播
- 理解计算图——为什么 PyTorch 需要它
- 为第五阶段的深度学习做好准备
一、链式法则——"洋葱剥皮法"
1.1 直觉
如果一个函数是"套娃"结构——外面套外面,那它的导数就是一层一层剥开,每层的导数乘起来。
链式法则:dy/dx = (dy/du) × (du/dx)
"y 对 x 的变化率 = y 对 u 的变化率 × u 对 x 的变化率"
1.2 生活直觉
你的工资涨了 10%,物价涨了 5%,你的实际购买力变了多少?
- 工资变化 → 影响钱包 → 影响购买力
- 总变化 = 工资变化率 × 转换率
每一环节的变化率相乘 = 总的变化率。
1.3 计算示例
import numpy as np
# 例子:y = (3x + 2)²
# 分解:u = 3x + 2, y = u²
# dy/dx = dy/du × du/dx = 2u × 3 = 6(3x + 2)
# 方法 1:链式法则
def chain_rule_example(x):
u = 3 * x + 2 # 内函数
y = u ** 2 # 外函数
du_dx = 3 # 内函数的导数
dy_du = 2 * u # 外函数的导数
dy_dx = dy_du * du_dx # 链式法则
return y, dy_dx
# 方法 2:数值验证
def numerical_derivative(f, x, h=1e-7):
return (f(x + h) - f(x - h)) / (2 * h)
f = lambda x: (3*x + 2)**2
x0 = 1
y, dy_dx_chain = chain_rule_example(x0)
dy_dx_numerical = numerical_derivative(f, x0)
print(f"x = {x0}")
print(f" 链式法则: dy/dx = {dy_dx_chain}")
print(f" 数值验证: dy/dx = {dy_dx_numerical:.4f}")
1.4 多层链式法则
如果有更多层嵌套呢?照样一层层剥:
# y = sin(exp(x²))
# 分解:a = x², b = exp(a), y = sin(b)
# dy/dx = dy/db × db/da × da/dx
# = cos(b) × exp(a) × 2x
x0 = 0.5
a = x0 ** 2
b = np.exp(a)
y = np.sin(b)
da_dx = 2 * x0
db_da = np.exp(a)
dy_db = np.cos(b)
dy_dx = dy_db * db_da * da_dx
# 数值验证
f = lambda x: np.sin(np.exp(x**2))
dy_dx_num = numerical_derivative(f, x0)
print(f"链式法则: {dy_dx:.6f}")
print(f"数值验证: {dy_dx_num:.6f}")