线性模型的假设空间是一条直线(平面),太弱。神经网络把它堆成了千层:线性变换 + 非线性激活的反复叠加,理论上能逼近任意函数(万能逼近定理)。支撑训练的核心算法反向传播,本质是链式法则(高数)的系统性应用。本章从单个神经元讲到多层网络,把「深度」的深度讲出来。
一个人工神经元 = 加权求和 + 非线性:
σ(激活函数)必须有非线性——没有它,多层网络塌缩成单层(线性套线性还是线性,第 6 章白堆)。常用激活:
把神经元排成层,层层相接:
输入层(784 个像素)→ 隐藏层(128 神经元)→ 隐藏层(64)→ 输出层(10 类, softmax)
前向传播:数据从左到右流过,每层 = 矩阵乘法 + 激活:
计组课第 4 章的矩阵乘、数据结构课第 1 章的复杂度在此变现:一层 784×128 的矩阵乘 = 10 万次乘加,现代 GPU(几千个核心并行)就是为这种「巨大但规则」的运算造的(深度学习革命的硬件推手,第 1 章)。
万能逼近定理:单隐藏层足够宽就能逼近任意连续函数。那为什么还要深?效率:深网络用「层次复用」表达同样函数参数少得多(识别「猫脸」= 组合「边缘 → 纹理 → 部件 → 脸」,每层复用下层的成果,第 8 章的卷积把这个层次显式化)。「深度」就是「多层组合的表示复用」。
训练 = 调全部参数让损失最小(第 6 章),问题是参数动辄百万,每个参数的梯度怎么算?反向传播(backpropagation):从损失出发,把梯度从输出层往输入层倒着传,一路用链式法则分解:
工程上的完整循环(第 6 章的 SGD 循环放大版):
① 前向:输入流到输出,记下每层的中间值
② 算损失:预测 vs 标签
③ 反向:损失梯度倒传,得到每个参数的梯度
④ 更新:w ← w − η·梯度(SGD 一小批一小批来)
实现上的革命是自动微分(autograd):你只写前向计算,框架(PyTorch/TensorFlow)自动建计算图、自动反传。手推两层小网络的 backprop(考试题型)与「框架一行 loss.backward()」是同一件事的两个抽象层级,手推一遍(练习 2)才知道框架替你干了什么。
反向传播还有一个动人的对应:它和「学习」的神经科学假说(误差信号回传)同构——虽然真实大脑是否用 backprop 仍是未解之谜(AI 用的是数学版,不是仿生版,破除「AI 在模拟大脑」的流行误解)。
经典入门项目 MNIST(6 万张手写数字,28×28 像素),两层网络:
import torch, torch.nn as nn
model = nn.Sequential(
nn.Flatten(), # 28×28 → 784
nn.Linear(784, 128), nn.ReLU(),
nn.Linear(128, 64), nn.ReLU(),
nn.Linear(64, 10) # 10 类的得分
)
opt = torch.optim.SGD(model.parameters(), lr=0.1)
loss_fn = nn.CrossEntropyLoss()
for epoch in range(10):
for x, y in train_loader: # 每批 64 张
pred = model(x) # ① 前向
loss = loss_fn(pred, y) # ② 损失
opt.zero_grad(); loss.backward() # ③ 反向
opt.step() # ④ 更新
十几个 epoch 后测试准确率 ~97%。回头看:这段代码 = 第 6 章(SGD + 交叉熵)+ 本章(多层 + 反向传播)的全部;深度学习的门槛不在代码量,在概念密度。
深度学习训练是「看病开方」的过程,常见病对照表:
| 病症 | 症状 | 药方 |
|---|---|---|
| loss 不降 | 学习率不对 / 数据没洗 | 从 1e-3 起扫;检查输入归一化(像素除 255!) |
| loss = nan | 学习率太大爆炸 | 减 lr;查除零 |
| 训练好测试差 | 过拟合(第 5 章) | 正则化全家桶:weight decay、dropout、数据增强 |
| 训练测试都差 | 欠拟合 | 加深加宽、训久点、换更强的结构 |
调参的第一课:每次只动一个旋钮,记录对比(软件工程课的实验纪律)。深度学习工程的 80% 是「可控的实验管理」,20% 才是灵感。