前向传播与反向传播

🔧 核心技能
反向传播是深度学习的核心算法。你必须能手动推导一个 2 层网络的反向传播过程。本节在第 4 站"链式法则与反向传播预览"的基础上,给出完整的推导和实现。
学习目标
- 理解前向传播的完整计算过程
- 掌握常用损失函数(MSE、交叉熵)
- 🔧 能手动推导 2 层网络的反向传播
- 理解计算图的概念
先建立一张地图
这一节最容易让新人害怕的地方,是“公式一下子变多”。更适合的理解顺序是:
你可以把这节课理解成一句话:
前向传播负责算结果,反向传播负责算“该怎么改”。
这节和第 5 站、上一节是怎么接上的
如果你刚学过上一节,可以先这样理解:
- 上一节解决的是“一个神经元 / 一层网络到底在算什么”
- 这一节解决的是“它算错以后,参数到底怎么改”
如果你刚学过第 5 站,也可以这样对照:
- 第 5 站里你已经见过 loss 和梯度下降
- 这一节只是把“梯度到底从哪里来”彻底拆开给你看
所以这一节真正新增的,不是“突然很多公式”,而是:
- 训练过程里的责任分配是怎么一层层往回传的
一、前向传播
前向传播就是从输入到输出的计算过程:
1.0.1 前向传播时,最值得先盯哪四个对象?
第一次读网络前向代码时,可以先只盯这四类变量:
x / X:输入z:线性变换后的中间量a:过激活后的输出loss:最终误差
这样你看到任何一行代码,都更容易知道它是属于:
- 输入
- 中 间计算
- 输出
- 还是误差定义
1.1 手动计算示例
import numpy as np
# 一个极简的 2 层网络: 2→3→2
np.random.seed(0)
# 输入和权重
X = np.array([[1.0, 2.0]]) # 1 个样本, 2 个特征
W1 = np.array([[0.1, 0.3, -0.2],
[0.4, -0.1, 0.5]]) # 2×3
b1 = np.array([[0.0, 0.0, 0.0]])
W2 = np.array([[0.2, -0.3],
[0.1, 0.4],
[-0.5, 0.2]]) # 3×2
b2 = np.array([[0.0, 0.0]])
y_true = np.array([[1, 0]]) # 真实标签(one-hot)
# 前向传播
z1 = X @ W1 + b1
print(f"z1 = {z1}")
a1 = np.maximum(0, z1) # ReLU
print(f"a1 (ReLU) = {a1}")
z2 = a1 @ W2 + b2
print(f"z2 = {z2}")
# Softmax
exp_z2 = np.exp(z2 - z2.max())
a2 = exp_z2 / exp_z2.sum(axis=1, keepdims=True)
print(f"a2 (Softmax) = {a2}")
1.2 前向传播最该盯住哪三件事?
第一次看网络前向计算时,建议每一步都只问这三个问题:
- 当前张量的 shape 是什么
- 这一层做的是线性变换还是非线性变换
- 这一步输出会不会传给下一层
很多人一看到公式就晕,其实先抓住这三件事就够了。