第 1 讲导览 · 深度学习导论
这一讲要解决的真实问题
训练一个深度学习模型,最常见的失败不是「模型不够大」,而是四个环节中有一个没接上:结构、损失、梯度、泛化。结构决定了模型能表达什么函数;损失决定了「什么叫好」;梯度决定了参数能不能朝好的方向移动;泛化决定了训练集上的好成绩能不能带到没见过的数据上。这四件事在今天被框架封装成了三行代码(model(x)、loss.backward()、opt.step()),封装得太好,以至于出错时绝大多数人不知道从哪一环查起。第 1 讲的全部目的,就是把这四环拆开、逐环写清楚——后面的八讲都只是在「结构」这一环上换形状。
母本 MIT 6.S191 的第一讲讲次(Lecture 1: Introduction to Deep Learning)在一节课里从感知机讲到反向传播,重点是建立直觉,把推导、初始化、归一化层、优化器细节都留给学生自己补。本教程与它的关系是:沿用它的骨架与术语,把课堂上省略的中间步骤补齐,并把母本录播年代之后成为默认实践的东西(AdamW、RMSNorm、SwiGLU、大批量训练的线性缩放规则、双下降现象)归位到相应小节。凡是超出母本范围的内容,本教程会明确标注那是「工程惯例」还是「本教程的推理」。母本配套的 Lab(github.com/aamini/introtodeeplearning)对应的入门实验,本书组织为 Lab 1。
七节一览
| 节 | 核心问题 | 关键结论 | 典型陷阱 |
|---|---|---|---|
| 1.1 从神经元到感知机 | 一个神经元的数学形式与能力边界是什么? | 神经元 = 加权求和 + 偏置 + 非线性;单层的天花板是线性可分,XOR 是最小反例 | 以为「换更光滑的激活」就能让单层变强——能力没变,变的只是可训练性 |
| 1.2 多层感知机与通用逼近 | 把单元堆成层之后,表达能力涨在哪、涨到什么程度? | 前向是逐层「线性 + 非线性」;通用逼近只保证存在,不保证宽度可寻、可训练、样本高效 | 把通用逼近定理当作「随便建个大网络就能逼近任何函数」的工程保证 |
| 1.3 激活函数:非线性从哪来 | 为什么隐藏层不能用 Sigmoid?现代默认用什么? | 梯度要连乘每层导数;Sigmoid 导数上限 是深层不可训的直接原因;ReLU 族不饱和但有死亡问题;现代大模型默认 SwiGLU + RMSNorm | 输出层也用 ReLU 族;把 ReLU 的「稀疏」当成普遍优点;以为 GELU / SiLU 一定比 ReLU 好 |
| 1.4 损失函数:把任务翻译成优化目标 | 损失从哪来?为什么分类不用 MSE? | 损失是负对数似然;不同的输出分布导出不同的损失;交叉熵在「错误且自信」时惩罚最陡 | 网络里加了 Softmax 又用 CrossEntropyLoss(做了两次);回归数据有离群点时仍用 MSE |
| 1.5 梯度下降与反向传播 | 上百万参数的梯度怎么在有限时间里全算出来? | 反向传播 = 链式法则 + 中间结果复用,代价从 次前向降到 次前向 + 次反向 | 把反向传播当成「另一种数学」;忘了清空梯度(累加);没做梯度检查就相信实现 |
| 1.6 优化器:从 SGD 到 AdamW | 为什么需要动量、自适应学习率和解耦权重衰减? | 优化器改的是方向与每参数步长;AdamW 修正了 Adam 把 L2 正则一起自适应缩放的错误 | 以为换了 Adam 就不用调学习率;学习率与批大小只改一个;梯度没裁剪就开混合精度 |
| 1.7 泛化、正则化与归一化 | 训练集上对了,为什么测试集上错? | 泛化误差 = 近似误差 + 估计误差;正则化是能力预算的再分配;归一化层改变的是优化条件数而不只是「稳定数值」;深度时代还有双下降 | 用验证集调参又用验证集报结果(数据泄漏);把 BatchNorm 用在变长序列或小批量上 |
与母本讲次的对应
| 本讲内容 | 母本(MIT 6.S191, Lecture 1)的处理 | 本教程的补齐 |
|---|---|---|
| 神经元与感知机 | 课堂给出形式与直觉 | 收敛定理的证明骨架、XOR 反例的完整不等式论证(1.1) |
| MLP 前向 | 给公式与一张结构图 | 逐层形状推演与参数计数表、形状错误分类学(1.2) |
| 通用逼近 | 一句话结论 | 陈述的完整条件、三条边界、分段线性视角与线性区域计数(1.2) |
| 激活函数 | 列出 Sigmoid / tanh / ReLU 并给启发式 | 饱和的定量上界 、死亡 ReLU 的自我强化机制、GLU 家族与现代默认(1.3) |
| 损失函数 | 给出交叉熵与 MSE 形式 | 最大似然统一视角、softmax + CE 梯度的完整推导、focal loss 与标签平滑(1.4) |
| 反向传播 | 给递推式与一张示意图 | 计算图 / VJP 的形式化、前向与反向自动微分的代价对比、梯度检查实操(1.5) |
| 优化器 | 提到 SGD、Momentum、Adam | 偏差修正推导、AdamW 与 L2 的不等价性、调度 / 裁剪 / 累积、线性缩放规则(1.6) |
| 正则化 | Dropout 与早停为主 | 偏置-方差与近似-估计误差分解、BN/LN/RMSNorm 对比、双下降、数据泄漏清单(1.7) |
本讲不覆盖什么(避免期望错位)
本讲地图
[1.1 神经元 / 感知机]
能力边界 = 线性可分
│ 跨过边界要靠「分层」
▼
[1.2 MLP 前向 + 通用逼近] ──────────┐
形状推演 / 初始化 / 深度 vs 宽度 │ 非线性从哪来
│ ▼
│ [1.3 激活函数]
│ 饱和、死亡、门控家族
▼ │
[1.4 损失函数] ◄──「什么叫好」──────┘
最大似然统一视角 / CE / MSE
│
▼
[1.5 梯度下降 + 反向传播] ◄──「怎么走到好」
计算图 / VJP / 梯度检查
│
▼
[1.6 优化器与学习率调度] ◄──「走多快、怎么拐弯」
SGD → Momentum → Adam → AdamW
│
▼
[1.7 泛化、正则化与归一化] ◄──「好成绩带得走吗」
Dropout / 权重衰减 / BN / LN / RMSNorm / 双下降
依赖关系:1.2 → 1.3(激活是层的一部分,先有层再谈激活的选择)
1.2 + 1.4 → 1.5(没有具体损失,就写不出具体梯度)
1.5 → 1.6(优化器是「如何用梯度」,先有梯度)
1.2–1.6 → 1.7(前面全部是训练误差,1.7 才谈泛化误差)
本讲新增的概念(与 1.1 节相比)
| 组 | 概念 | 首次出现 |
|---|---|---|
| 结构 | MLP 前向与形状推演、参数计数、Xavier / Kaiming 初始化、分段线性视角 | 1.2 |
| 结构 | 激活函数对比表、饱和的定量分析、死亡 ReLU、GLU 家族 | 1.3 |
| 目标 | 最大似然视角、交叉熵与 KL 的关系、focal loss、标签平滑、多任务加权 | 1.4 |
| 训练 | 计算图、雅可比与 VJP、前向/反向自动微分、梯度检查 | 1.5 |
| 训练 | 动量族、自适应学习率族、偏差修正、解耦权重衰减、学习率调度、梯度裁剪与累积、线性缩放规则 | 1.6 |
| 泛化 | 偏置-方差分解、正则化清单、BatchNorm / LayerNorm / RMSNorm、双下降、数据泄漏 | 1.7 |
讲前自查:五道口答题
这几道题全部属于先修或 1.1 节的内容。若有一题答不上来,先回 1.1 节或先修工具箱,不要直接进入 1.2。
| # | 问题 | 答不上来时的去处 |
|---|---|---|
| 1 | 复合函数求导的链式法则写成一般形式是什么? | 先修工具箱 |
| 2 | 一个神经元对输入的判决面是什么形状? | 1.1 定义 1.1.1 |
| 3 | 为什么单个感知机解不了 XOR? | 1.1 例 1.1.1 |
| 4 | 「批优先」约定下张量第 0 维是什么? | 1.1 方法 1.1.1 |
| 5 | 损失函数的输出是一个数还是一组数? | 1.4 |
本讲的主线与「一条主线」
一条主线:任何深度网络的训练都可以拆成「定义结构 → 定义损失 → 用梯度下降最小化损失」三步;反向传播只是链式法则在计算图上的高效实现,而泛化是这三步之外、由数据与正则化共同决定的第四条约束。
| 步骤 | 本讲对应节 | 出错时的典型症状 |
|---|---|---|
| 定义结构 | 1.2、1.3 | 形状报错、深层训练不动、单元大量死亡 |
| 定义损失 | 1.4 | 收敛慢、概率过度自信、少数类被忽略 |
| 最小化损失 | 1.5、1.6 | 损失不降 / 发散 / 震荡、梯度范数爆炸 |
| 带得走吗 | 1.7 | 训练好、验证差;离线好、线上差 |
与实验和项目的关系
- Lab 1 · 深度学习入门与音乐生成:第一部分用一层网络把「前向 → 损失 → 反向 → 更新」跑通,对应的正是 1.4 与 1.5 的两条盒子;第二部分用字符级 RNN 做音乐续写,是 第 2 讲的主题,但训练循环完全沿用本讲的 1.6。
- 期末项目:本讲的方法定位阶段(选损失、选输出层、定验证方式)适用于所有项目选题;如果项目涉及「训练不收敛 / 过拟合」,诊断路径直接查 1.7 的陷阱表。
第一遍(约 3 小时):按 1.1 → 1.2 → 1.3 → 1.4 → 1.5 → 1.6 → 1.7 顺序读,但要跳过所有 proof 折叠框。目标是能在白纸上画出「结构 → 损失 → 梯度 → 更新」的循环,并说出每一环出错时的症状。
必读、不许跳的框:
- 每个
def后面的intuition(建立手感,比定义本身重要); - 1.2 的形状推演表与例 1.2.x(这是排错的第一技能);
- 1.5 的计算图与 VJP 视角(不读它,反向传播就只是背公式);
- 1.6 的 AdamW 与 L2 的区别(工程上最容易用错的一处);
- 1.7 的归一化层对比表与双下降(前者是日常工具,后者是「经典图景的边界」)。
二刷(约 4 小时):逐行读 proof——1.2 的通用逼近边界讨论、1.3 的饱和定量分析、1.4 的 softmax + 交叉熵梯度、1.5 的完整反向传播递推、1.6 的 Adam 偏差修正与 AdamW 分解。读完后合上书,把 1.5 的两层网络反向传播从零推一遍。
动手:把 1.5 的 numpy 实现和 1.6 的优化器对照组各跑一遍;再做 Lab 1 的第一部分。改动两处观察后果——去掉非线性(看它退化成线性模型)、学习率乘 10(看它发散)。
自检路径:每节的「即时自测」→ 本讲 习题集(A/B/C/D 四组)→ 回忆卡(当天 / 隔天 / 第 3 天 / 第 7 天)→ 综合自测卷(闭卷计时,100 分制)。
中文配套读物(可选,用于补手感):李沐等《动手学深度学习》(Dive into Deep Learning 中文版,含可运行代码)——第 1–4 章与本讲 1.2–1.5 节几乎逐项对应,适合代码第一遍;邱锡鹏《神经网络与深度学习》——第 2–4 章的推导风格与本讲 1.4、1.5 节接近,适合推导第一遍。
时间预算参考:只求建立范式直觉,读导览 + 1.2、1.4、1.5 的动机段与小结论(约 1 小时);要能独立写训练代码,走完上面全部三遍并做完 Lab 1 第一部分(约 8–10 小时)。
本讲把一切网络都归结为「结构 + 损失 + 梯度下降」,但 MLP 有一个硬约束:它要求输入是固定长度的向量,并且对输入各维之间的顺序不作任何假设。序列数据(文本、语音、音符)恰好两条都不满足——长度可变、顺序携带信息。第 2 讲从这个问题出发,先给出递归结构(RNN)与其梯度病态,再引出让所有位置直接互相看见的注意力机制。