Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 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 导数上限 14\tfrac14 是深层不可训的直接原因;ReLU 族不饱和但有死亡问题;现代大模型默认 SwiGLU + RMSNorm输出层也用 ReLU 族;把 ReLU 的「稀疏」当成普遍优点;以为 GELU / SiLU 一定比 ReLU 好
1.4 损失函数:把任务翻译成优化目标损失从哪来?为什么分类不用 MSE?损失是负对数似然;不同的输出分布导出不同的损失;交叉熵在「错误且自信」时惩罚最陡网络里加了 Softmax 又用 CrossEntropyLoss(做了两次);回归数据有离群点时仍用 MSE
1.5 梯度下降与反向传播上百万参数的梯度怎么在有限时间里全算出来?反向传播 = 链式法则 + 中间结果复用,代价从 O(参数量)O(\text{参数量}) 次前向降到 O(1)O(1) 次前向 + O(1)O(1) 次反向把反向传播当成「另一种数学」;忘了清空梯度(累加);没做梯度检查就相信实现
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 并给启发式饱和的定量上界 0.25L0.25^{L}、死亡 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)

本讲不覆盖什么(避免期望错位)

主题去哪
卷积、池化与视觉骨干第 3 讲
序列建模与注意力第 2 讲
分布式训练、混合精度与并行策略第 9 讲
环境配置、显存估算与实验管理工程工具箱
矩阵求导与自动微分的数学基础先修工具箱

本讲地图

                    [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)与其梯度病态,再引出让所有位置直接互相看见的注意力机制。