通读笔记(d2l 全书 168 章)
格式:章号 章名 — 机制/关键数字/值得引的短语(行号记在 text/ 原文件,不是 /tmp 剥离版)。 引用行号一律以 library/dive-into-deep-learning/text/ 为准;写章时再 grep 定位。
ch1 Preface
(待读)
ch4 Introduction(1878 行,已读)
- 起手:普通程序=写死的规则(business logic);有些任务规则写不出来(唤醒词:每秒 44000 个采样点,没人会写规则)→ ML = 能从经验学习的算法。
- 核心套路:定义一个带参数(knobs)的灵活程序 → 参数定了叫 model → 所有参数能调出的程序集合叫 model family → 用数据选参数的「元程序」叫 learning algorithm。训练循环 4 步:随机初始化 → 取数据 → 拧参数让表现更好 → 重复。「programming with data」。
- 四大组件:数据(features/label;200×200 彩照=12 万个数)、模型(深度学习=许多层变换链起来)、目标函数(惯例越低越好=loss;平方误差/错误率;error rate 不可导→ surrogate objective)、优化算法(梯度下降)。
- train/test 划分;overfitting=训练集好、新数据差(学生背题库比喻)。
- 任务类型:监督(回归 how much/how many——水管工 3h$350、2h$250 推出 $100/h+$50 上门费的例子;分类 which one——概率输出;毒蘑菇 0.2×∞ 决策论例子;tagging 多标签 28000 MeSH;search/ranking PageRank;推荐系统 censored feedback 与反馈回路;序列学习:tagging/ASR/TTS/MT)。
- 无监督:聚类、子空间估计(PCA)、词向量算术 Rome-Italy+France=Paris、因果、生成模型(VAE→GAN→flows→diffusion);自监督:填空(BERT)、图像块相对位置。
- 环境交互/RL:offline learning 局限;RL 框架(观察→动作→reward);credit assignment(升职 10 月 11 日的例子)、部分可观察(机器人困在柜子里)、exploit vs explore;MDP / contextual bandit / multi-armed bandit 三个特例。
- Roots:高斯最小二乘;Köbel 16 人脚长平均(最早的 trimmed mean);Fisher(Iris 1936;优生学警告);Shannon、Turing(1950 论文、图灵测试);Hebb 1949 学习规则→Rosenblatt perceptron。神经网络名字来自生物学(Bain 1873/Sherrington 1890),两条核心原则:线性+非线性层交替、chain rule(=backpropagation)全网调参。
- 1995-2005 低谷:算力贵、数据小(Iris 还在用;MNIST 6 万条算「巨大」)→ kernel methods/决策树更强。转折:Web 数据 + GPU(游戏卡)。表格:1970 100 条 Iris / 1KB / 100KF → 2020 1T 社交网 / 100GB / 1PF。内存增速 < 数据增速 < 算力增速。
- decade 进步清单:dropout(训练时注入噪声);attention=learnable pointer structure(不用背整个序列);Transformer(2017)scaling 行为好,多模态通吃(Gato);语言模型 scaling(GPT 系、Chinchilla、LLaMA);memory networks 迭代推理;GAN(判别器=two-sample test,sampler 换成可微算法);diffusion(加噪→学去噪,DALL-E 2/Imagen);分布式训练(minibatch 64000,ResNet-50/ImageNet 7 分钟 vs 最初数天);RL+模拟器;框架三代(Caffe/Torch/Theano → TF/MXNet → PyTorch/JAX 命令式)。2014 年 CMU 博士作业:逻辑回归;现在 10 行代码。
- Success stories:MNIST 来 自 90 年代邮件分拣;ImageNet top-5 错误率 2010 年 28% → 2017 年 2.25%;TD-Gammon→DeepBlue→AlphaGo(2015)→Libratus 扑克(部分可观察);自动驾驶主要靠 DL 做视觉部分。
- AI 风险立场:离有意识的 AI 很远(系统都是定向工程的;没有能自我改进的 AGI 工具);更紧迫的是就业与算法偏见。
- Essence of DL:多层变换;每层表示联合从数据中学(区别于手工特征);end-to-end training 取代 feature engineering(Canny/SIFT 统治十年后被自动调出的 filter 取代);参数化→非参数化;接受次优解、非凸优化、先试再证(empiricism)。
ch1 Preface(已读)
- 本书定位:概念+上下文+代码三位一体;「just in time」教学(先让你尝到训练出第一个模型);每个组件给两版实现:from scratch(只用 NumPy 式操作+autograd)与 concise(高层 API)。
- 结构三部分:基础与预备 / 现代 DL 技术(CNN/RNN/注意力) / 可扩展性·效率·应用(仅在线)。
- 利益相关:AWS 资助写作(点名感谢 Jassy 等);2021-07 起主框架从 MXNet 换成 PyTorch;四框架并行(mxnet/pytorch/tensorflow/jax tabs)。
ch5 Data Manipulation(略读)
- tensor=多维数组;比 NumPy 多两个杀手特性:自动微分 + GPU 加速。
- 内容:创建(arange/zeros/ones/randn)、shape/reshape(-1 自动推断)、索引切片、elementwise 运算、broadcasting(沿长度为 1 的轴扩 展)、连接 cat、转 NumPy、转 Python 标量 item。
ch6 Data Preprocessing(略读)
- pandas 读 CSV;处理缺失值:插值(数值列填均值)与删除;类别列 one-hot(get_dummies);最后转 tensor。
ch7 Linear Algebra(已读)
- scalar/vector/matrix/tensor = 0/1/2/n 阶;order=轴数,dimensionality=分量数(刻意区分)。
- Hadamard 积(elementwise,记 ⊙)vs 矩阵乘法;dot product = 同位乘积之和;加权平均=权重和为 1 的点积;单位向量点积=夹角余弦。
- 矩阵-向量积 Ax:第 i 个元素是第 i 行与 x 的点积 = 从 R^n 到 R^m 的变换;可表示旋转;是神经网络每层的关键计算。
- 矩阵乘法 AB = m 个矩阵-向量积拼起来;比 Hadamard 贵得多(三次 vs 二次)。
- 范数三条公理(缩放、三角不等式、非负);ℓ2=欧氏长度;ℓ1=曼哈顿距离,对离群值更不敏感;ℓp 一般式;Frobenius 范数=把矩阵当向量算 ℓ2;谱范数提一句。深度学习里「距离」常以范数表达(最大似然、推荐收益、同脸近异脸远)。
ch8 Calculus(已读)
- Archimedes 多边形逼近圆面积 → 极限是微积分的根。
- 导数=变化率;accuracy/AUC 不可导 → 优化可导代理(surrogate)。
- 例子 u=3x²-4x,x=1 处导数=2;常用求导规则表(常数倍/和/积/商)。
- 偏导数:其余变量当常数;梯度=所有偏导拼成的向量;向量微积分规则:∇Ax=Aᵀ、∇xᵀAx=(A+Aᵀ)x、∇‖x‖²=2x。
- 链式法则:单变量 dy/dx=dy/du·du/dx;多变量 ∇x y = A∇u y(向量-矩阵乘积)。前向算函数值,反向沿依赖图算梯度——backpropagation 就是系统应用链式法则的过程。
ch9 Automatic Differentiation(已读)
- autograd:框架在数据流过每个函数时建 computational graph;反向走图应用链式法则=backpropagation。历史:Wengert 1964;现代反向传播核心在 Speelpenning 1980 博士论文;Julia 用前向。
- 例子 y=2xᵀx,∇=4x;PyTorch 梯度默认累加不清零(要 x.grad.zero_())。
- 非标量 y:Jacobian;框架一般返回 sum 的梯度;PyTorch 要求给 v 算 vᵀ∂y。
- detach:把某变量从图里摘出来(u=y.detach(),z=x·u 对 x 的梯度是 u 不是 3x²);控制流(if/while 依赖输入)也能微分——图是运行时实现的,无法预先算梯度。
ch10 Probability and Statistics(已读)
- 频率派 vs 贝叶斯派(对不可重复事件赋置信度、允 许不同先验);统计=从数据反推生成过程。
- 概率=理论量(硬币本身的性质),统计量=经验量(数据的函数);estimator/consistency;law of large numbers;中心极限定理:误差按 1/√n 下降(10→1000 观测不确定性缩 10 倍,再来 1000 只缩 1.41 倍——「easy gains, then expensive」)。
- Kolmogorov 1933 三公理;样本空间/事件;随机变量可比样本空间更粗;多个随机变量共享同一样本空间(警报响/被入室)。
- 联合概率、边缘化(对另一变量求和)、条件概率 P(B|A)=P(A,B)/P(A);贝叶斯定理=反转条件顺序;prior/likelihood/posterior/evidence;P(A|B)∝P(B|A)P(A)。
- 独立 A⊥B;条件独立;explaining away(骨折与肺癌在「住院」条件下负相关);共同原因(鞋码与阅读水平在「年龄」条件下独立)。
- HIV 两次检测走查:患病率 0.0015,第一次阳性→13.06%;第二次(更差:0.98/0.03)也阳性→83.07%(条件独立假设是关键;同一测试做两遍没信息量)。「诊断其实是藏在明处的分类器」。
- 期望(投资:0.5·0+0.4·2+0.1·10=1.8);效用对数(效用版期望 0.7,不如存银行);方差=E[(X-EX)²]=E[X²]-E[X]²;标准差同单位;协方差矩阵 Σ,vᵀΣv=线性组合的方差。
- aleatoric(固有随机)vs epistemic(参数不确定,可随数据减少)uncertainty——术语本身被作者标注为「轻微滥用语言」。Chebyshev 不等式。
ch11 Documentation(略读)
- 查 API:dir()/help();本书 d2l 包即此习惯。
ch12 Linear Regression(已读)
- 模型:price = w_area·area + w_age·age + b;严格说是 affine transformation(线性+平移);bias 让直线不必过原点。
- 设计矩阵 X∈R^{n×d};ŷ=Xw+b;目标:对同分布新样本期望误差最小。
- 平方误差 l=½(ŷ-y)²(½ 为求导消去);二次形式双刃剑:鼓励避免大误差,也对异常值过敏。
- 解析解:w*=(XᵀX)⁻¹Xᵀy,要求 XᵀX 可逆(特征线性无关)。「you should not get used to such good fortune」——解析解的要求苛刻到会排除深度学习几乎所有有趣的部分。
- 全量梯度下降慢;单样本 SGD 两个问题:向量-向量运算比矩阵-向量低效一个数量级(处理器乘加比搬数据快得多)、batch norm 等层需要一次多个观测。折中:minibatch SGD,批大小 32-256、2 的大幂次倍数起步。
- 更新式 (w,b)←(w,b)−η/|B| Σ∂l;hyperparameters(学习率、批大小)不在训练循环里更新,用 validation set 调。
- 深网损失面多鞍点与极小值;实践者很少为「训练集上找不到低损失」发愁,难的是 generalization。
- prediction vs inference:深度学习圈把预测叫 inference 是误称,统计里 inference 指参数推断;本书坚持用 prediction。
- 向量化:for-loop vs 单调用,量级级提速。
- 正态分布与平方损失:y=wᵀx+b+ε,ε~N(0,σ²) ⇒ 最小化 MSE ≡ 高斯噪声假设下的最大似然估计(负对数似然第二项即平方误差)。
- 线性回归=单层全连接神经网络;McCulloch-Pitts 神经元模型(树突/突触权重/轴突);Russell & Norvig:飞机受鸟启发,但鸟类学早已不是航空学的主要驱动力。
ch13 OO Design(已读)
- 三个类:Module(模型+损失+优化器,forward/training_step/configure_optimizers)、DataModule(train_dataloader/val_dataloader)、Trainer(fit(model, data),max_epochs 轮)。灵感来自 PyTorch Lightning。
- 工具:add_to_class(类创建后注册方法,适配 notebook 短代码块)、save_hyperparameters、ProgressBoard。
ch14 Synthetic Regression Data(已读)
- 合成数据的价值:真参数已知,可验证实现能恢复它们。1000×2,X 标准正态,w=[2,-3.4],b=4.2,噪声 σ=0.01。
- get_dataloader:训练模式随机顺序,验证模式固定顺序(便于调试);框架内置 loader 高效、可组合(加载+裁剪+…成 pipeline)。
ch15 Linear Regression from Scratch(已读)
- 只用 tensor+autograd 实现:初始化 w~N(0,0.01)、b=0;forward=Xw+b;loss=平方误差均值;SGD 类(step;PyTorch 要 zero_grad);训练循环:每 epoch 遍历全数据,每 iteration 取 minibatch → training_step 算 loss → 反传 → 更新。
- 恢复出 w≈[2,-3.4],b≈4.2;但别当作理所当然——深网没有唯一解;ML 关心的是预测准的参数而非恢复真参数(Vapnik 引文);SGD 常能找到相当好的解,部分因为深网存在大量预测等价的参数配置。
ch16 Concise Implementation(略读)
- 框架版:nn.Linear、内置 MSELoss、optim.SGD、Trainer 抽象;同一结构代码量大减。
ch17 Generalization(已读)
- Extraordinary Ellie(背旧题)vs Inductive Irene(抓规律):旧题卷 Ellie 赢,新题卷 Irene 赢。generalization=ML 的根本问题,甚至是整个科学的问题(何时能从个别观察跳到一般陈述)。
- IID 假设:没有它「dead in the water」。训练误差 R_emp=统计量;泛化误差 R=对分布的期望(无限数据流上的平均),永远算不出精确值,只能用独立测试集估计。训练误差是有偏估计(模型依赖训练集的选择)。
- 模型复杂度:模型类若能拟合任意随机标签,训练误差低不能证明学到了任何东西(Popper 可证伪性:能解释一切观察的理论什么都没说);但也不能反推泛化误差一定高——深网就是这种:实践中泛化好,理论上训练误差说明不了什么,只能靠 holdout(validation error)事后认证。
- underfitting(训练/验证误差都高且差距小)/overfitting(训练远低于验证);过拟合不总是坏事——最终只关心泛化误差本身。
- 多项式拟合:次数=样本数时可完美拟合训练集;数据集越 大泛化误差通常越小,more data never hurts;深度学习常需几千样本才赢过线性模型。
- Model selection:测试集只能在最后碰;用测试集选模型会 overfit test data(那就没办法知道了);实际中 benchmarks 被反复用几十年(ImageNet/MNIST SOTA 链接)。本书实验其实都是 train+validation,没有真正的 test set——作者自曝。
- K-fold cross-validation:数据稀缺时用。
ch18 Weight Decay(已读)
- 不直接砍参数个数,而是限制参数取值:f=0 是「最简单」的函数,复杂度=参数离零的距离。
- 目标改为 L(w,b)+λ/2·‖w‖²;λ=0 退化为原损失。平方范数为求导方便。ℓ2=ridge,ℓ1=lasso(权重清零→特征选择);ℓ2 倾向把权重均摊到更多特征上,对单变量测量误差更稳。
- 更新式 w←(1−ηλ)w−…:每步先把 w 往零缩——所以叫 weight decay。
- 实验:d=200、训练集只有 20 条;不加正则:训练误差降、验证误差不动(教科书式过拟合);加正则:训练误差升、验证误差降。
- 框架把它集成进优化器(PyTorch weight_decay 参数);bias 通常不正则化。
ch19 Softmax Regression(已读)
- 分类=回答 which one;hard vs soft assignment;one-hot 编码(类别无自然顺序时)。
- 线性模型:每个类一个仿射函数;4 特征 3 类→12 权重+3 bias;o=Wx+b;全连接层。
- 直接把 o 当概率的两个毛病:不保证和为 1、不保证非负(买豪宅概率>1)。softmax:ŷ_i=exp(o_i)/Σexp(o_j);保序(argmax ŷ=argmax o,不算 softmax 也能知道谁最大);Gibbs 1902 借自 Boltzmann 统计物理 exp(−E/kT)。
- logit=o(未归一化的输出)。数值上指数会溢出,框架自动处理。
- 交叉熵损失 l=−Σy_j log ŷ_j;one-hot 下只剩一项;损失=0 要求以无穷大 logit 给出确定预测,有限权重达不到;−log 0=∞。
- softmax+交叉熵的梯度 = softmax(o)_j − y_j(预测概率减真实标签),与回归的「预测−观测」同构——指数族模型对数似然梯度皆如此。
- 信息论:熵 H[P]=Σ−P log P(编码下限,nats;1 nat≈1.44 bit);surprisal=−log P(j);好预测⇔好压缩;交叉熵 H(P,Q)=观察者拿 Q 当世界观看 P 产生的数据的期望惊讶;P=Q 时最小=H(P)。两种解读:最大似然 / 最小惊讶(比特数)。
- 全连接层成本 O(dq),可用结构化矩阵压缩(Deep Fried Convnets 等),目标是 GPU 上跑得快而非 FLOPs 最小。
ch20 Image Classification Dataset(略读)
- Fashion-MNIST:10 类 28×28 灰度图,6 万训练 1 万测试,替代 MNIST(太简单);读取进 tensor、可视化、内置 DataLoader。