深度学习的链式法则

一、链式法则在深度学习里到底在干嘛?

最核心一句话:

深度学习训练 = 通过链式法则,把损失函数对每一层参数的导数算出来,然后用梯度下降更新参数。

数学上最经典的链式法则:

在深度学习中,经常是:

𝐿

L:损失函数(loss)

这就是反向传播里每一层算梯度的本质。

二、从一个最简单的标量例子开始

比如有:

在代码里(伪反向传播)就是:

python 复制代码
x -> u = 3*x + 2 -> y = u**2
# 反向:
dy_du = 2 * u
du_dx = 3
dy_dx = dy_du * du_dx

神经网络只不过是这个过程的「多层版本」+「矩阵形式」。

三、一个两层全连接网络里的链式法则

设一个简单网络:

我们要:



这整个过程,就是链式法则在神经网络里的「矩阵版」。

四、用纯 NumPy 手写一个小网络 + 反向传播

下面是一个1 隐层网络,只有一个样本时的前向、反向计算示例:

python 复制代码
import numpy as np

# 激活函数和导数(这里用 sigmoid)
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_grad(x):
    s = sigmoid(x)
    return s * (s - 1)

# 一些简单数据
np.random.seed(0)
x = np.random.randn(3, 1)     # 输入维度 3,列向量
y = np.array([[1.0]])         # 标量目标

# 网络结构:3 -> 4 -> 1
W1 = np.random.randn(4, 3)    # 第一层权重
b1 = np.zeros((4, 1))
W2 = np.random.randn(1, 4)    # 第二层权重
b2 = np.zeros((1, 1))

# ========= 前向传播 =========
# 隐藏层
z1 = W1 @ x + b1         # (4,1)
a1 = sigmoid(z1)         # (4,1)

# 输出层(线性)
z2 = W2 @ a1 + b2        # (1,1)
y_hat = z2               # 回归问题,输出=线性

# MSE 损失: 0.5 * (y_hat - y)^2
L = 0.5 * (y_hat - y) ** 2
print("Loss:", float(L))

# ========= 反向传播(链式法则) =========
# dL/dy_hat
dL_dyhat = (y_hat - y)   # (1,1)

# 输出层: y_hat = z2
dL_dz2 = dL_dyhat        # (1,1)

# dL/dW2 = dL/dz2 * da1/dW2 = dL/dz2 * a1^T
dL_dW2 = dL_dz2 @ a1.T   # (1,4)
dL_db2 = dL_dz2          # (1,1)

# 反传到 a1: dL/da1 = W2^T * dL/dz2
dL_da1 = W2.T @ dL_dz2   # (4,1)

# 过激活: a1 = sigmoid(z1)
dL_dz1 = dL_da1 * sigmoid_grad(z1)  # (4,1)

# 第一层参数
dL_dW1 = dL_dz1 @ x.T    # (4,3)
dL_db1 = dL_dz1          # (4,1)

print("dL_dW2 shape:", dL_dW2.shape)
print("dL_dW1 shape:", dL_dW1.shape)

可以在这段代码基础上:

加一个学习率 lr,用

W1 -= lr * dL_dW1 这样更新参数

循环多轮,就变成一个最简易的「手写版训练过程」。

五、用 PyTorch 看看自动求导怎么用链式法则

在 PyTorch 里你不会手写链式法则,但 底层一样在做这件事。你只负责:

定义前向计算

调 loss.backward()

框架帮你自动用链式法则算梯度。

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim

# 简单两层网络
class SimpleNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(3, 4)
        self.act = nn.Sigmoid()
        self.fc2 = nn.Linear(4, 1)

    def forward(self, x):
        x = self.fc1(x)
        x = self.act(x)
        x = self.fc2(x)
        return x

net = SimpleNet()
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.1)

x = torch.randn(1, 3)   # batch=1, dim=3
y = torch.tensor([[1.0]])

# 前向
y_hat = net(x)
loss = criterion(y_hat, y)
print("loss:", loss.item())

# 反向(内部自动用链式法则)
optimizer.zero_grad()
loss.backward()

# 看梯度
for name, param in net.named_parameters():
    print(name, param.grad.shape)

你看到的 .grad 就是通过链式法则 + 计算图一层层传回来的结果。

总结一句

链式法则 = 把复杂复合函数的导数拆成一层一层的乘积

深度学习 = 用链式法则,把损失函数对每一层参数的梯度都算出来

相关推荐
拆房老料2 分钟前
DeepSeek Super-agent 架构解析:从单任务 Agent 到持续运行的任务系统
人工智能·设计模式·系统架构
民乐团扒谱机3 分钟前
【一文吃透】机器学习 Embedding 降维打击:从底层空间几何原理到 RAG 向量检索工程实战避坑
人工智能·机器学习·embedding
超级新零售32 分钟前
AI 零售软件是什么?从库存提醒到智能调货的系统分工
大数据·人工智能·零售
天远API1 小时前
零信任架构实战:基于天远租凭分期报告构建自动化智慧租房免押分期履约评估网关
运维·人工智能·架构·自动化
我要见SA姐11 小时前
Chrome 扩展安全攻防实录:从权限滥用到供应链投毒
运维·人工智能·python·机器学习·自动化
路上有只喵1 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇9
人工智能·语音识别
奈落241 小时前
Codex 并进 ChatGPT 之后,“编程智能体“是变浅了还是变顺了:从官方概览页的功能分工到五家公司开发者反馈,读一次产品化合并的得与失
人工智能·chatgpt·工作流·ai 编程
qq_25294131681 小时前
伊蚊检测数据集 | 伊蚊检测 病媒生物 公共卫生 目标检测9304期
人工智能·yolo·目标检测·计算机视觉·蚊子·尹蚊
程序员柒叔1 小时前
Diagram Design 解构:45 种图型如何用语义路由与 SVG 质量门交付
人工智能·github·agent·skills
QXWZ_IA1 小时前
无人机自主巡检从半自动到全闭环的阶段划分与定位要求
人工智能·安全·无人机