一块硬盘里躺着吃灰的 PDF,和一本翻到第二章就再也合不上的实体书,是很多想系统学深度学习的人共同拥有的资产。我自己就是后者:当年买回那本封面印着大花、社区里习惯叫花书的深度学习教材,雄心勃勃准备从第一章读到最后一章,结果在特征值分解那节败下阵来,一放就是快两年。今年我痛定思痛,从第一页开始做精读,并且强制自己每读一章就写代码验证一遍,才发现以前读不下去根本不是书的问题,是方法的问题。这篇是精读系列的第一篇,对应我笔记文件里的编号 deeplearningbook_001-1,覆盖整个地基部分:绪论、线性代数、概率与信息论、数值计算四章,外加机器学习基础这一章。适合两类人:一类是已经拿框架写过不少模型、想回头补理论的人;另一类是数学底子一般但真想看懂后面模型推导的人。看完你会知道这本书前四章到底在讲什么、哪些地方值得停下来深想、哪些地方可以放心跳,以及如何把抽象的数学笔记变成能跑的代码。
1. 一本 2016 年的书,凭什么现在还值得精读
先说一个很多人心里的疑问:这本书出版好几年了,Transformer 都没写进去,现在网上随便点开一篇综述都比它新,为什么还要花几个月啃它?
我的回答是:深度学习这十年变化最大的是工程细节和模型结构,不是底层的数学语言。Transformer、扩散模型、生成式模型,落到纸上依然是矩阵乘法、概率分布、梯度优化这三板斧。如果你能熟练读懂这本书的公式,再看任何一篇新模型论文,剩下的工作只是搞清楚"它改了什么结构、换了什么损失"这种增量信息,不会出现"每个字母都认识但连起来不知道在干嘛"的情况。
视频课和博客我也看过不少。视频课的问题在于把数学稀释得厉害,听完很爽,合上电脑能留下的东西不多;博客擅长把某一个点讲透,但知识点之间是散的,形不成系统。书是唯一能把"统一词汇表"给你的地方。读论文时你一定会反复遇到 KL 散度、特征分解、病态条件、容量、最大似然这些词,零散学习时每个都眼熟又说不清,系统读一遍之后,这些词会变成你可以用来推理的组件——看到某个损失函数,你能联想到它对应什么分布假设;看到优化不收敛,你能想到条件数、学习率这些因素。
什么人可以跳过这本书?如果你只是想快速调包跑业务、对原理没有好奇,花大力气读这本书性价比确实不高。什么人适合读?想读论文、想排查训练问题、想设计新结构的人,这本书绕不过去。我自己的体验是,工作四五年后回头读,才发现当年觉得"高深"的章节,其实在回答我实践中踩过的一个个坑。当年读不下去的遗憾,这次算是补上了。
2. 开啃之前:先做一次数学地基自查,别等卡住再回头
很多人翻开第二章就合上,不是因为内容难,而是不知道自己缺什么。这本书默认读者有基本的线性代数和概率论背景,但它不会停下来提醒你"这里你需要先会特征分解"。所以我的建议是,正式开读前花半天做一次自查,不求全会,只为建立一张"遇到不懂时去哪查"的地图。
下面这张表是我整理的自查清单,你在开始前过一遍,能做到"看到术语知道它是干什么的、公式能大致读懂"就过关:
| 数学主题 | 你需要能做到的程度 | 在书中的主要用途 |
|---|---|---|
| 向量与矩阵运算 | 矩阵乘法、转置、逆、迹 | 全书一切公式的前提 |
| 范数 | 知道 L1/L2 的含义,能算 | 正则化、优化问题 |
| 特征分解 | 理解 A = V diag(λ) V⁻¹ 的含义 | PCA、流形、表示学习 |
| SVD 奇异值分解 | 知道它能分解任意矩阵 | 主成分分析、伪逆、降维 |
| 概率分布 | 会查高斯、伯努利、均匀分布的密度与期望 | 模型假设、损失函数推导 |
| 条件/边缘/链式法则 | 会写出 P(x,y) = P(x | y)P(y) |
| 期望/方差/协方差 | 理解期望的线性性质 | 分布性质、信息论推导 |
| 浮点数 | 知道 float32 范围,理解溢出下溢 | softmax、数值稳定性技巧 |
| 梯度/雅可比/海森 | 知道梯度是向量、海森是矩阵 | 优化算法、牛顿法 |
自查时不用追求满分。我的标准是:看到术语能想起它是干什么的,公式能大致读懂,就过关。真正的掌握是后面阅读和写代码时反复用出来的。前几年我花三周系统复习了一遍线性代数,这次重读发现,真正需要的其实只是"用到时二十分钟定向补课"。这有点像学外语:与其先背完所有单词再开口,不如在对话中遇到生词现查现用,效率反而高。
如果你真的是零基础,建议先用可视化讲解视频建立几何直觉,再回来读书。我的经验是"直觉先行、公式随后",比直接啃公式舒服得多。注意在目录里标记好每个数学概念的章节号,读正文章节时随时往回翻,别不好意思——第二次读的时候我也经常翻回第二章查东西。
提示:第一遍读这本书的目标不是证明全部公式,而是建立一套能读懂论文方法部分的词汇表和直觉。遇到推不下去的地方,标记"待补"然后继续,不要停。
3. 前四章精读:值得停下来反复想的位置
这本书的前四章常被当成"可以跳过的数学复习",但它恰恰决定了你能不能读懂后面所有推导。我按章拆成三块讲,每块给你几个应该停下来想一会儿的点。
3.1 线性代数:不是复习,是模型的第一语言
矩阵乘法的真正直觉是变换的复合。把矩阵想成一个对向量空间做伸缩旋转的操作,而不是一张需要逐行逐列相乘的表。Ax=b 无解、唯一解、无穷解三种情况,对应矩阵的秩和列空间的不同性质。这个直觉会在后面看全连接层、卷积、注意力权重时反复用到。
特征分解是全书最值得反复咀嚼的工具。对于能对角化的矩阵,A=V diag(λ) V⁻¹ 意味着一个复杂变换可以拆成"旋转、缩放、再旋转"三个步骤。现实里遇到的对称矩阵——协方差矩阵、海森矩阵——天然满足可对角化条件,特征值全是实数。正定、半正定这些概念会在判断损失函数凸性、优化收敛性时反复出现,我当时看模型初始化论文里一堆条件,读完这章才明白它们在说什么。
SVD 是特征分解的升级版:任何矩阵,不管是不是方阵,都能分解成 U D Vᵀ,奇异值就是矩阵在主要方向上的伸缩系数。书中用 PCA 当例子:计算样本协方差矩阵,取特征值最大的 k 个特征向量作为投影方向。建议你亲手把 PCA 写一遍,你会注意到一个细节——教科书用特征分解,工程实现常用 SVD,因为 SVD 数值稳定性更好。这个细节本身就是线性代数章节价值的证明:它给了你判断"纸上算法能不能上机器"的能力。
迹和行列式也别跳过。行列式是变换后体积的缩放系数,迹在矩阵求导里频繁出现,softmax 的雅可比、正则项求导都会碰到。伪逆解决的是非方阵、不可逆矩阵的"最小二乘意义下的逆",后面处理欠定回归问题时它就是工具。读这一章时我最大的收获不是学会某个具体的公式,而是学会把模型看作一组矩阵变换的复合——这个视角在之后读任何架构论文都能用上。
3.2 概率论:真正的主角是比较分布
深度学习的损失函数、生成模型、贝叶斯方法全在概率框架里说话。读这一章要建立的核心视角是:模型训练本质上是在比较预测分布和真实分布。期望、方差这些工具都服务于这个目的。
常见分布最好整理成一张速查表,我贴在这儿:
| 分布 | 支持域 | 典型场景 |
|---|---|---|
| 伯努利分布 | {0, 1} | 二分类、dropout 开关 |
| 类别分布 | 有限个类别 | 多分类 softmax |
| 高斯分布 | 实数轴 | 回归误差假设、参数初始化 |
| 指数/拉普拉斯分布 | 非负 / 实数 | 稀疏性、L1 正则的分布解释 |
贝叶斯公式不要当玄学。P(x|y) = P(y|x)P(x)/P(y),本质是一个"由结果反推原因"的加权规则。优先级从高到低:先记住条件概率和链式法则,能写出联合分布怎么拆,再记住贝叶斯公式的形式,后面的生成模型章节会用得上。
信息论三件套是这篇笔记里最重要的连接点。自信息 -log P(x) 衡量一个事件带来的惊讶程度;熵是所有事件的平均惊讶程度;KL 散度衡量"用 Q 分布编码来自 P 的样本,平均多花多少比特";交叉熵 = 熵 + KL 散度。因此,最小化交叉熵就是在最小化模型分布和真实分布的 KL 散度,这和最大似然估计是同一件事的两副面孔。以前我以为交叉熵是专门给分类任务设计的损失函数,读完信息论才明白它是从信息论里自然长出来的东西。现在我看到一个新的损失函数,第一反应是问"它假设了什么样的数据分布"——这就是这章给你的思维习惯。
3.3 数值计算:整个深度学习最容易翻车的隐性章节
这章篇幅不长,却解释了训练中大量灵异现象的根源。先说最经典的 softmax 溢出:float32 能表示的最大数约 3.4e38,当 logits 里出现 1000 时,exp(1000) 直接溢出成 inf,softmax 输出变成 nan。教科书不会细讲,但代码里你迟早会遇到。解决办法是先减去最大值再算,数学上结果不变:
import numpy as np def stable_softmax(z: np.ndarray) -> np.ndarray: z = z - np.max(z) exp_z = np.exp(z) return exp_z / np.sum(exp_z) def naive_softmax(z: np.ndarray) -> np.ndarray: exp_z = np.exp(z) return exp_z / np.sum(exp_z) z = np.array([1000.0, 1000.0, 999.0]) print(naive_softmax(z)) # 出现 inf / inf = nan print(stable_softmax(z)) # 正常输出概率这就是所谓的 log-sum-exp 技巧。下溢同样阴险:多个概率连乘,比如朴素贝叶斯、生成模型里,很快就变成 0;损失函数里对连乘取 log,所以永远要在 log 域操作。书中强调的"用 log 空间做概率计算",是训练任何概率模型的基本修养。
病态条件这个点,我建议你反复读两遍。条件数很大时,输出对输入的微小扰动极度敏感。放到优化里就是:海森矩阵病态时,梯度下降会来回震荡、收敛极慢。批归一化、精心设计的初始化这些现代技术,很大程度上的作用就是改善优化问题的条件——这个连接让我非常兴奋,它把数学概念和工程实践直接串起来了。
雅可比矩阵和海森矩阵是理解梯度的升级版。梯度是标量函数对所有参数的一阶偏导向量;海森是二阶偏导矩阵,天然对称。牛顿法用 H⁻¹g 修正步长,理论上收敛快,但海森是 n×n 的矩阵,参数几千万时根本存不下,所以深度学习主流还是坚持梯度下降加自适应学习率。理解这一层,你再去看优化器论文时就不会被各种公式劝退,因为你知道它们都是在"近似海森信息"这条路上做文章。
4. 第五章:这章才是整本书真正的"第一章"
很多人按目录顺序读,把第五章当成又一个背景章节跳过,这是最大的浪费。第五章讨论的是机器学习的基本问题,后面所有深度网络只是这些原则的具体实例。先理顺概念,后面才不会被树挡住森林。
容量和泛化是第一个要刻进脑子的对。欠拟合是模型容量不够,过拟合是容量过大记住了噪声。正则化的定义不是"惩罚复杂度"这么简单,书中定义是在不降低训练误差的前提下减少泛化误差的修改。权重衰减、dropout 只是众多正则化手段中的两种,搞清楚这个定义,你才能理解为什么早停、数据增强也被算作正则化。
无免费午餐定理值得多读两遍。它的结论是:不存在一种算法在所有任务上都最优。这对刚入门的人有点打击,但其实是好消息——它告诉你"为什么深度学习能赢"这个问题,必须回到数据的结构和先验里找答案,而不是期待一个万能算法。后面深度学习的种种设计,本质都是在注入"我们相信数据长什么样"的先验。随机梯度下降(SGD)用一小批样本近似全量梯度,这个"用近似换速度"的思路,也是后面所有优化器讨论的起点。
最大似然估计是这一章的数学核心。θ_ML = argmax Σ log P(x⁽ⁱ⁾; θ),把损失函数统一成负对数似然之后,回归用平方误差、分类用交叉熵都不是拍脑袋定的,而是对不同分布假设的必然结果。配着上一章的信息论看会非常顺:每当你看到一个损失函数,第一反应应该是它背后对应哪种分布。这个习惯一旦养成,读模型论文的体验会完全不一样。
本章末尾"深度学习的挑战"一节也要认真读。维度灾难讲的是高维空间中样本稀疏、距离概念失效;局部极值在高维里反而不是最大问题,鞍点才是。深度学习的真正动机是线性模型连 XOR 这种简单非线性都表达不了,必须引入非线性变换和多层组合。读完后,你对"为什么不能用线性模型硬怼"这个问题就有了扎实答案,而不是停留在"大家都这么说"的层面。
5. 把理论读成能跑的代码:我的两类笔记法和验证实验
纯读书很难留下东西。我的方法是两类笔记并行。第一类写在书页边上的问题笔记,专门记录读到这里时产生的疑问,哪怕是很蠢的问题——比如"为什么这里要对称矩阵""为什么特征值排序从大到小"。第二类是每章结束后的观念笔记,一页纸,要求自己用一句话概括这章在说什么,再写三个"这在现代模型里体现在哪里"的例子。第二类最花功夫,也最值钱,因为逼着你把孤立概念和真实世界连接起来。
实验不用复杂,每个十到二十行 numpy 就够,目的是让抽象公式和数值现象之间建立一座桥。我给自己列的清单:
- 主成分分析:生成两个带相关性的高斯点云,用协方差特征分解做投影,再用 SVD 做一遍,对比两种做法得到的主成分方向。
- softmax 稳定性:把 naive 和 stable 版本放在同一批大 logits 上跑,亲眼看 NaN 出现。
- KL 散度不对称性:计算两个不同方差高斯分布之间的 KL 散度,正反方向各算一次,体会它的不对称性。
- 病态条件下的梯度下降:写一个简单的二次函数,把海森矩阵条件数调大,观察梯度下降步数从几步涨到几百步。
KL 散度的代码在这里,你可以直接跑:
import numpy as np def gaussian_kl(mu1, sigma1, mu2, sigma2): # KL(N(mu1,sigma1) || N(mu2,sigma2)) return (np.log(sigma2) - np.log(sigma1) + (sigma1**2 + (mu1 - mu2)**2) / (2 * sigma2**2) - 0.5) # 两个方向结果不一样,这就是 KL 散度的不对称性 print(gaussian_kl(0.0, 1.0, 0.0, 2.0)) # 约 0.318 print(gaussian_kl(0.0, 2.0, 0.0, 1.0)) # 约 0.807做完实验再回到书里,你会发现自己看公式的方式变了:每个公式不再是一串符号,而是一段可以预判行为的过程。这套方法对后面更抽象的章节尤其重要——第六章的反向传播、第七章的正则化,没有代码实验兜底,很容易读成"貌似懂了"。
6. 这次重读踩过的几个坑,以及下一步计划
唠点实际的,这次重读我踩了不少坑,写出来帮你避一避。
第一个坑是死磕证明。这本书引用了很多领域内的经典结论,有些证明在附录,有些要翻原始论文。第一遍读完全没必要每一个都证出来,标记"待回来补"就好,否则你会在一个引理上耗掉一周,然后弃书。第二个坑是没有输出的阅读。读过不等于掌握,输出——笔记、代码、给别人讲——才是。我给自己定了一条规矩:每章结束不能只写"这章讲了很多",至少写一个"这章解释了 X 现象"的句子,X 必须是实际训练或读论文时遇到的问题。比如读完信息论,我写的就是"KL 散度解释了标签平滑为什么有效",读完数值计算,写的是"softmax 溢出解释了训练出现 NaN 的一个常见来源"。
第三个坑是中英文术语来回切换。书有中译版也有原版,术语对照非常重要。capacity 有时译成"容量"有时译成"表达能力",regularization 译成"正则化"或"正则",混着看容易脑壳疼。我的做法是选定一种版本为主,遇到词义模糊时再翻另一种,顺手在笔记里记下两组术语。第四个坑是把数学复习章节当背景跳过。前四章看起来像复习,但组织方式是服务后面的,轻轻一翻后面必然后悔。
下一步计划也汇报一下:这个精读系列的第二篇,对应编号 deeplearningbook_002,会覆盖深度前馈网络和正则化这两章,我打算手写一个纯 numpy 的两层 MLP,实测反向传播的数值梯度对比,再把权重衰减、dropout 逐个手写实现一遍,看看它们各自改的到底是什么。你要是也在啃这本书,欢迎对一下各自的观念笔记,尤其是"这章解释了哪个现象"那一栏,互相补一补往往能拼出更完整的图。
最后分享一个小技巧:读完整个地基部分后,去找一篇你一直读不懂的论文,只看它的方法部分,把每个公式里出现的符号对应回这本书的具体章节。只要十个公式里你能说出七八个"这个在哪一章见过",就真的把地基读成自己的了。我自己做完这件事之后,才确认之前花的时间没有白费。