跳到主要内容

通读笔记(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。

ch21 Base Classification Model(略读)

  • Module 加 accuracy(预测=argmax,与标签比对求均值);进度板画 train/val loss 与 acc。

ch22 Softmax from Scratch(略读)

  • 展平 28×28=784;W∈R^{784×10};手实现 softmax(减 max 防溢出)与交叉熵;训练同上。

ch23 Concise Softmax(略读)

  • nn.Linear(784,10) + 框架交叉熵;注意框架版把 log-softmax 与损失合在一起数值更稳。

ch24 Generalization in Classification(已读)

  • 三个问题:测试集要多大?重复用同一测试集会怎样?为什么训练线性模型比死记强?
  • 测试误差是均值估计问题:中心极限定理 O(1/√n) 收敛——精度翻倍要 4 倍数据,提百倍要一万倍;Bernoulli 方差 ε(1−ε),±0.01 一个标准差≈2500 条,95% 置信≈1 万条(这正是常见 benchmark 测试集大小);Hoeffding 有限样本界≈1.5 万条(渐近分析给球算足够)。每年几千篇论文为 0.01 的改进大做文章。
  • 测试集复用:k 个分类器都测一遍→false discovery/多重假设检验,20 个模型就可能有一个拿到误导分数;f2 是在看过 f1 的测试成绩后选的→adaptive overfitting(Dwork 2015);信息一旦泄露给建模者,它就不再是真正的测试集。对策:尽量少碰、挑战赛把旧测试集降级为验证集。
  • 统计学习理论:想给出 a priori 保证——对任意分布,样本够 n 就能让经验误差贴近真实误差;但对深度网络这些界要求的样本量荒谬(可能上万亿),而实践中几千样本就泛化得很好;所以实践者放弃先验保证,靠 post hoc 验证。「test sets are all that we really have」。

ch25 Environment and Distribution Shift(已读)

  • 开场:Oxford 鞋=还款、球鞋=违约——一旦按此放贷,人人改穿 Oxford,模型自毁。「把模型决策引入环境,可能把模型打破」。
  • 不加假设时 shift 不可学(上帝把猫狗标签全翻转,输入分布不变)。
  • 三种 shift:covariate shift(P(x) 变、P(y|x) 不变;x→y 时合理;训练用照片测试用卡通);label shift(P(y) 变、P(x|y) 不变;y→x 时合理,如疾病引起症状);concept shift(标签定义本身变:美国软饮料 pop/soda 地图)。
  • 实例:医疗创业公司用大学生血样当健康对照(年龄/激素/饮食全不同,极端 covariate shift,不可修复,钱白花);自动驾驶用游戏引擎合成数据(所有路沿同一纹理,模型学了捷径);美军森林坦克(学了「树有没有影子」——第一批早晨拍、第二批中午拍)。
  • 非平稳:iPad 发布、垃圾邮件进化、圣诞后还在推圣诞帽;人脸检测器没见过占满整张脸的特写。
  • 纠正:经验风险 vs 风险;covariate shift 用重要性加权 β_i=p(x_i)/q(x_i),用 logistic 回归训练「区分来源分布」的分类器估 β=exp(h(x))(截断到常数 c 防爆);前提:目标分布中每个点训练时概率非零。label shift 用混淆矩阵 C 与测试集预测均值 μ(ŷ) 解线性系统 C·p(y)=μ(ŷ)。
  • 环境会记得并反应:套利机会被发现就消失;对抗(spammer)、合作。
  • 公平/问责/透明:accuracy 很少是正确的度量;预测警务反馈回路(多巡逻→多发现→更多巡逻),runaway feedback loops。

ch26 MLP(已读)

  • 线性假设太强:隐含单调性(收入 0→5 万 vs 100→105 万对还款概率影响不同);体温 vs 健康 37°C 两侧都危险;猫狗:单个像素亮度与类别无关(反色图类别不变),像素的意义依赖上下文——手工算不出这种表示,所以用隐藏层从数据里学。
  • 两层全连接不带非线性=白堆:O=(XW¹+b¹)W²+b²=XW+b 塌缩回单层(affine of affine is affine)。关键配料:激活函数 σ,如 ReLU=max(0,x)。激活函数的输出叫 activations。
  • 万能逼近:单隐层足够宽能表示任何函数(Cybenko 1989),但学到它才是难点;类比 C 语言能表达任何程序但写程序难。深比宽更省参数(Simonyan & Zisserman)。
  • 激活函数:ReLU(导数 0 或 1,缓解梯度消失;0 点不可导取 0,「measure zero」;pReLU 负半轴留 α);sigmoid=1/(1+e^{-x}) 压到 (0,1),是阈值单元的平滑近似,二分类输出层还在用(可看作 softmax 特例),导数最大 0.25,两端饱和梯度消失;tanh 压到 (−1,1),原点对称,0 附近近似线性,导数 1−tanh²。GELU、Swish 更新。
  • 「你的工具箱已到 1990 年从业者水平,还有框架加成」。

ch27 MLP Implementation(略读)

  • 一层隐藏层 256 单元;展平输入;参数个数 784×256+256×10 等。

ch28 Backprop(已读)

  • 以单隐层 MLP+weight decay 为例:z=W¹x,h=ϕ(z),o=W²h,L=l(o,y),s=λ/2(‖W¹‖²_F+‖W²‖²_F),J=L+s。
  • 反传链:∂J/∂o=∂L/∂o;∂J/∂W²=∂J/∂o·hᵀ+λW²;∂J/∂h=W²ᵀ∂J/∂o;∂J/∂z=∂J/∂h⊙ϕ'(z);∂J/∂W¹=∂J/∂z·xᵀ+λW¹。
  • 前向存中间值供反向复用(避免重算)→ 训练内存远大于预测;中间值大小∝层数×批大小→OOM。「pay the cost to be the boss」(James Brown)。

ch29 Numerical Stability & Init(已读)

  • L 层网络梯度=L−l 个矩阵 M 的乘积:特征值分布宽 → 连乘爆炸或消失;sigmoid 两端梯度≈0,Goldilocks zone 外逐层切断梯度——曾长期困扰训练;ReLU 因此成为默认。
  • 对称性:同层隐藏单元置换对称;若 W¹ 全初始化为常数 c,梯度全相同,永远破不了对称,隐藏层等于只有一个单元;随机初始化破对称;dropout 也能破。
  • Xavier 初始化:前向要求 n_in·σ²=1,反向要求 n_out·σ²=1,折中 σ²=2/(n_in+n_out)(Glorot & Bengio 2010);均匀分布版 U(−√(6/(n_in+n_out)),+√…)。Xiao et al. 2018:精心设计初始化可训 10000 层网络(无架构技巧)。

ch30 Generalization in Deep Learning(已读)

  • ML 研究者是优化算法的消费者;优化只是手段,泛化才是目的;两个故事(为什么能优化、为什么泛化)都还是 wild west。
  • no free lunch(Wolpert 1995);inductive bias(MLP 偏好用简单函数复合出复杂函数)。
  • 反直觉:所有候选架构都能零训练误差时,「进一步只能减过拟合」;而更复杂的模型反而常能再降泛化误差;gap vs 复杂度非单调——double descent(Nakkiran 2021);VC/Rademacher 界解释不了(网络能拟合随机标签,zhang2021understanding)。
  • 非参数视角:k-NN 训练误差恒 0 但一致收敛到最优预测器;过参数化网络像插值器;NTK(Jacot 2018):无限宽随机初始化 MLP 等价于特定核函数。
  • early stopping:拟合随机标签的能力要很多轮才出现,所以早停有效(数据越脏越该早停)。

ch31 Dropout(已读)

  • 第三种「简单」:平滑性(对输入小扰动不敏感)。Bishop 1995:输入加噪 ≡ Tikhonov 正则化;Srivastava/Hinton 2014 把噪声注入内部层=dropout。原论文的性繁殖类比(打破 co-adaptation)是作者自承的叙事。
  • h' = 0(概率 p)或 h/(1−p):无偏,E[h']=h;训练时开、测试时关(测试时也可开多次采样估计不确定性)。
  • 走查:5 单元隐藏层 p=0.5,h2、h5 被置零,输出层不再依赖它们,梯度也消失——输出不能过度依赖任何一个隐藏单元。靠近输入的层 dropout 概率通常更低。

ch32 Kaggle House Price(略读)

  • 真实数据流程:缺失值、标准化、对数变换标签、K 折交叉验证选模型、提交 Kaggle。

ch33-38 Builders Guide(33/39 已读,34-38 略读)

  • module 抽象:单神经元/层/整个模型都是「输入→输出+参数」同构结构;ResNet-152 数百层由重复的「层组」构成→需要比层大、比模型小的抽象;模块可递归组合;自定义模块只需 init + forward(autograd 自动管反向);nn.Sequential=有序链条;net(X) 是 call 语法糖。
  • 参数管理
    i
    .weight/bias 访问;参数初始化;共享参数(同一对象多处引用,梯度汇总)。
  • lazy init:框架在第一次见到输入形状时才真正分配参数(省得手写 784)。
  • 自定义层:不带参数的层(居中化)与带参数的层。
  • 文件 I/O:save/load 参数(state_dict)。
  • ch39 GPUs:GPU 性能自 2000 年起每十年 1000 倍;tensor 有 device;运算双方必须在同一设备,跨设备复制慢(远慢于计算),框架故意报错逼你意识到;许多小传输不如一次大传输;每 minibatch 把 loss 搬回 CPU 打印会触发 GIL 停住所有 GPU——应在 GPU 上记账、批量搬运。

ch40-45 CNN(见下)

ch40 Why Conv(已读)

  • 百万像素×1000 隐藏单元=10^9 参数,全连接不可行。Where's Waldo 启发:Waldo 长什么样不取决于他在哪。
  • 两条设计原则:translation invariance(早期层对同一 patch 不论位置同样响应)、locality(早期层只看局部,不管远处);深层再聚合长程特征。
  • 推导:全连接四阶权重张量 V[i,j,a,b] → 平移不变要求 V 不依赖 (i,j) → 得卷积 H[i,j]=u+ΣΣ V[a,b]X[i+a,j+b] (参数从 10^12 → 4×10^6)→ 局部性再砍:|a|,|b|≤Δ,Δ 通常 <10,参数 → 4Δ²。TDNN 1989 最早用此思想。
  • 严格说这是 cross-correlation(真卷积要翻转核;核是学出来的所以无差别)。
  • channels:图像是 3 阶张量(高×宽×通道);隐藏表示也做成多通道(feature maps);核变 4 阶 V[a,b,c,d]。inductive bias 与现 实相符→样本高效、泛化好;不符则连训练集都拟合不了。
  • 历史:Neocognitron (Fukushima 1982)。

ch41 Conv Layer(已读)

  • 走查:3×3 输入 × 2×2 核 → 2×2 输出;第一个输出 0·0+1·1+3·2+4·3=19(图 fig_correlation)。输出尺寸 (n_h−k_h+1)×(n_w−k_w+1)。
  • 边缘检测走查:6×8 图(中四列黑其余白),核 [1,−1] → 白→黑处 +1、黑→白处 −1;转置图则全 0(只检竖边)。核 = 有限差分算子 = 水平方向一阶导的离散近似。
  • 学核:随机初始化 → 平方误差 → 10 轮后学出的核 ≈ [1,−1]。
  • receptive field:某层元素受前层哪些元素影响;两层 2×2 卷积后输出的感受野覆盖全部 9 个输入;名字来自 Hubel & Wiesel 1959-68 视觉皮层实验(低层响应边缘),Field 1987 在自然图上验证;深网训练出的前几层核与生物视觉皮层相似(Kuzovkin 2018)。

ch42 Padding & Stride(略读)

  • padding 补零保持尺寸(p_h=k_h−1 时尺寸不变);stride 步长>1 减分辨率;输出尺寸 ⌊(n_h−k_h+p_h+s_h)/s_h⌋。

ch43 Channels(略读)

  • 多输入通道:每个输入通道一个核,结果相加;1×1 卷积=逐位置的全连接层,只跨通道混合,不看邻域——降通道数的工具。

ch44 Pooling(已读)

  • 目的:降分辨率+对微小平移不敏感(快门震动也会移位一两个像素)。
  • max-pooling(2×2 窗口:max(0,1,3,4)=4)vs average pooling;max 来自认知神经科学(Riesenhuber & Poggio 1999),更早见于语音识别;实践中 max 几乎总是更好。
  • 无参数(没有核);padding/stride 同样适用;默认窗口=stride(不重叠)。

ch45 LeNet(已读)

  • LeCun(AT&T Bell Labs)为手写数字设计;1989 年首个成功用反向传播训练 CNN;误差率 <1%,与当时 SVM 相当;ATM 至今还在跑这份 90 年代代码。
  • 结构:卷积编码器(2 卷积层:5×5 核+sigmoid+2×2 平均池化,通道 1→6→16)+ 密集块(120→84→10);当时 ReLU/max-pooling 还没被发明。第一层 padding=2 保持 28×28;MNIST 的 28×28 是从 32×32 裁掉 2 像素省空间(当年 MB 级存储)。
  • CNN 参数少但每个参数参与更多次乘法,计算可能更贵。

ch46 AlexNet(已读)

  • 1990s-2012 间 CNN 没统治:传统 CV 靠手工特征(SIFT/SURF/HOG/bags of visual words),学习算法是 afterthought;CV 研究者认为特征与几何比学习算法重要得多。
  • 缺的两味料:数据(2009 ImageNet:100 万张、1000 类、224×224,Google 搜图预筛+Mechanical Turk 确认;比 CIFAR-100 大一个数量级以上)与硬件(GPU 为游戏而生,4×4 矩阵-向量乘优化恰好契合卷积;GTX 580×2、3GB 显存、1.5 TFLOPs;cuda-convnet 当了几年行业标准)。
  • CPU vs GPU:CPU 核强但贵(分支预测/投机执行占面积),笔记本 4-8 核、服务器 ≤64 核;GPU 上千个小核(Ampere 6912 CUDA 核);功耗随时钟频率平方增长——同样功耗换 4 倍主频不如 16 核 1/4 主频(净 4 倍);A100 300+ TFLOPs(BF16)/20 TFLOPs(FP32),CPU 很少超 1 TFLOPs;内存带宽 GPU 总线宽 10 倍。
  • AlexNet 架构:8 层(5 卷积+3 全连接),第一层 11×11 核(ImageNet 图大 8 倍),之后 5×5、3×3;通道数是 LeNet 十倍;ReLU 替代 sigmoid;dropout 控制两个 4096 全连接层(近 1GB 参数);大量数据增强(翻转/裁剪/变色)。
  • 末两层的效率阿喀琉斯之踵:6400×4096 与 4096×4096 矩阵=164MB、81 MFLOPs。40M+ 参数训 6 万张图几乎不过拟合——归功于 dropout 等现代正则。
  • 2012 年几个月的工作现在十几行代码;「features obtained by learning can transcend manually-designed features」。

ch47 VGG(略读)

  • 块的概念:多个 3×3 卷积堆成 VGG 块再池化;深而窄;一族模型(VGG-11/16/19);第一个「真正现代」的 CNN。

ch48 NiN(略读)

  • 1×1 卷积加通道间非线性(mlpconv);全局平均池化替代全连接层(输出通道=类别数,直接平均出 logits)——参数大减,当时令人惊讶的是不损精度;还增强平移不变性。

ch49 GoogLeNet(略读)

  • Inception 块:四条并行分支(1×1、1×1→3×3、1×1→5×5、3×3 max-pool→1×1),输出沿通道拼接;1×1 降通道控复杂度;不同感受野同时探图。

ch50 Batch Norm(已读)

  • 动机三条:输入要标准化(零均值单位方差),那网络内部层为何不;中间层变量幅度漂移(某层激活是另一层 100 倍 → 学习率难调);深网更易过拟合需要正则。BN 意外地把三件事一起办了。
  • 定义:BN(x)=γ⊙(x−μ̂_B)/σ̂_B+β;μ̂、σ̂ 用当前 minibatch 估计;γ、β 可学习恢复自由度。批大小 1 时学不了(减均值后全 0)。
  • 噪声即正则:50-100 的中等批大小注入「刚刚好」的噪声;大批估计太稳正则弱,小批信号被方差毁掉(Teye 2018 关联到贝叶斯先验;Luo 2018 关联到惩罚)。
  • 训练模式(minibatch 统计)vs 预测模式(全数据集统计,训练完后固定);与 dropout 同构。
  • 全连接:affine 后、激活前;卷积:逐通道跨所有空间位置一起统计(m·p·q 个值),与平移不变假设相容。
  • layer normalization(Ba 2016):对单个样本的所有特征求均值方差,不依赖批大小,训练/测试行为一致;LN(αx)≈LN(x) 尺度不变。

ch51 ResNet(已读)

  • 函数类嵌套问题:更大的函数类若不包含小的,f* 可能反而更远;只有嵌套(F₁⊆…⊆F₆)才能保证加层严格更强。要让新层能学成恒等函数 f(x)=x。
  • 残差块:学 g(x)=f(x)−x;若恒等是目标,把权重推到 0 即可,比直接学 f 容易;x 经 residual/shortcut connection 直接加到输出;两层 3×3 卷积+BN+ReLU;变通道数用 1×1 卷积调整输入形状。
  • ResNet-18:7×7 卷积(stride 2)+max-pool + 4 模块(每模块 2 残差块,通道翻倍、尺寸减半)+ 全局平均池化 + 全连接;2015 ImageNet 冠军;highway networks(带门控旁路)在先;残差连接影响了 RNN、Transformer、GNN。归纳偏置从「简单函数是 f=0」变成「简单函数是 f=x」。
  • ResNeXt:grouped convolution(g 组,成本与参数都降 g 倍;组间无信息交换,用前后两个 1×1 卷积混合);AlexNet 双 GPU 实现其实就是分组卷积。

ch52 DenseNet(略读)

  • dense block:每层的输入是前面所有层输出的拼接(x→[x,f₁(x),f₂([x,f₁(x)]),…]),growth rate 控制膨胀;transition layer 用 1×1 卷积降通道+平均池化减半尺寸。ResNet 是加法,DenseNet 是拼接。

ch53 CNN Design(略读)

  • 从「手工设计单个最佳网络」到「设计网络的设计空间」:AnyNet 模板(stem/body/head;body 分 4 stage,每 stage 分辨率减半);17 个设计参数;RegNet 结论:优化网络的分布而不是单个网络,得到一族好网络+设计原则。

ch54 Working with Sequences(已读)

  • 序列=有序特征向量列表 x_1..x_T;序列之间独立,序列内部各步不独立(第 10 天用药依赖前 9 天)。
  • 任务形态:固定目标/序列目标;aligned(词性标注)vs unaligned(机器翻译)seq2seq。
  • 自回归模型:P(x_t|x_{t-1},…,x_1);输入数随 t 变 → 两策:只看 τ 窗口(固定长度);或维护隐状态 h_t=f(x_t,h_{t-1}) 的 latent autoregressive model。
  • 链式法则分解联合概率;Markov 条件(给定近 τ 步,未来与更早过去独立);k 阶 Markov;今天的大模型上下文也很少超过几千词。
  • 解码顺序:左到右更自然、可对任意长序列赋概率、相邻词比远端词好预测(因果结构:x_{t+1}=f(x_t)+ε 成立而反向不成立)。
  • 走查:sin(0.01t)+噪声,τ=4 窗口训练;多步预测:用预测值喂回 → 误差累积,越往后越崩。

ch55 Text→Sequence(略读)

  • 载入《时间机器》;tokenization(词或字符级);vocab:词频排序、低频词设 ;corpus 转索引序列。

ch56 Language Models(已读)

  • 目标:估计整句联合概率;用处举例「to recognize speech」vs「to wreck a nice beach」、「dog bites man」vs「man bites dog」、「eat, grandma」。
  • n-gram(unigram/bigram/trigram)计数估计;词频越长的组合越稀疏;Laplace smoothing:计数加常数(ε→∞ 退化为均匀分布)。四个死穴:稀有 n-gram 太多、要存全部计数、完全忽略词义(cat/feline 语境应相似)、长序列几乎必是新组合。
  • perplexity=exp(平均交叉熵)=「下一步实际有多少真实选择」的倒数几何均值;最好 1,最差 ∞,均匀基线=词表大小(不压缩的上界,任何模型必须赢过它)。
  • 序列切分批:随机裁剪 vs 顺序分区(保隐状态连续)。

ch57 RNN(已读)

  • n-gram 存 |V|^n 个数,爆炸 → 潜变量模型 P(x_t|h_{t-1}),h_t=f(x_t,h_{t-1});f 足够强时不是近似(可以把所有历史都存进 h)。
  • hidden layer vs hidden state 是两个概念:后者是「当前步的输入」,只能由之前时间步算出。
  • RNN:H_t=ϕ(X_t W_xh + H_{t-1} W_hh + b_h);O_t=H_t W_hq+b_q;所有时间步共享参数 → 参数不随序列长度增长;等价于把 [X_t;H_{t-1}] 拼接后过一个全连接层(代码验证 (3,1)+(3,4)→(3,5)×(5,4))。
  • 字符级语言模型:输入与目标错开一个 token。

ch58 RNN from Scratch(略读)

  • one-hot 输入;手实现隐状态更新;perplexity 评估;gradient clipping(范数超阈值则缩回)防偶发大梯度。

ch59 RNN Concise(略读):nn.RNN 高层 API。

ch60 BPTT(已读)

  • 展开计算图:同一参数在每步出现,梯度=各处出现之和(weight tying,与 CNN 共享核同理)。1000 步 = 2000 次矩阵乘(前向+反向)。
  • 分析:∂h_t/∂w_h = b_t + Σ_{i<t}(Π_{j=i+1..t} c_j)b_i,连乘项是爆炸/消失之源。
  • 三种策略:全计算(慢、蝴蝶效应、几乎不用);截断 τ 步(近似梯度、偏向短期影响——其实反而是想要的正则);随机截断(ξ_t 期望为 1 的随机变量,Tallec & Ollivier 2017,理论上无偏但实测不比规则截断好:方差变大、我们本来就想要短程模型)。
  • 细节:无 bias、恒等激活下推全梯度;weight tying 的梯度求和。

ch61 LSTM(已读)

  • 背景:Elman RNN 1990 之后长期依赖问题凸显(Bengio 1994;Hochreiter 1991 德语硕士论文);梯度裁剪只管爆炸,消失要更精巧的方案→ Hochreiter & Schmidhuber 1997 LSTM。
  • memory cell:内部状态带权重 1 的自环边,梯度可跨多步不消失;「长短期记忆」:权重=长期记忆、激活=短期记忆、memory cell=中间层存储。
  • 三个 sigmoid 门(值域 (0,1)):input gate(新输入写入多少)、forget gate(旧状态保留多少)、output gate(状态露出多少);input node 用 tanh(−1,1)。
  • C_t = F_t⊙C_{t-1} + I_t⊙C̃_t;F≡1、I≡0 时状态永远不变;H_t = O_t⊙tanh(C_t)。可以积累很多步不输出,然后突然在某一步打开 output gate 影响网络。

ch62 GRU(略读)

  • 两门:reset gate(旧状态记多少)与 update gate(新状态里多少是旧状态的拷贝);候选隐状态 H̃=tanh(X W_xh + (R⊙H_{t-1}) W_hh);H_t = Z⊙H_{t-1} + (1−Z)⊙H̃_t。

ch63 Deep RNN(略读):多层堆叠,L 层隐状态逐层传递。

ch64 Bi-RNN(略读):前向+后向两个方向,输出拼接;适合标注类任务,不适合语言模型(会偷看未来)。

ch65 MT Dataset(略读):英法平行语料;下载、预处理、词表、定长截断/补齐、

ch66 Encoder-Decoder(已读):encoder 把变长输入压成定长状态;decoder 是 conditional language model,拿编码状态+目标序列左侧上下文逐词预测;「They are watching .」→「Ils regardent .」。

ch67 Seq2Seq(已读)

  • encoder RNN:h_t=f(x_t,h_{t-1});context c=q(h_1..h_T)(最简单取 c=h_T);Sutskever 2014 / Cho 2014。
  • decoder:s_t'=g(y_{t'-1},c,s_{t'-1}),输出 P(y_{t'+1}|y_1..y_t',c); 开头、 结束;encoder 终态初始化 decoder(两 RNN 层数与隐单元数要一致),且 c 拼接到 decoder 每步输入。
  • teacher forcing:训练时喂真实前缀而非自己的预测;测试时喂自己的预测。
  • embedding layer:权重矩阵第 i 行=第 i 个词的特征向量。
  • BLEU 评估(匹配 n-gram 精度×长度惩罚)。

ch68 Beam Search(已读)

  • 目标:最可能序列 ≠ 每步最可能词;贪心例子:A B C eos=0.048 但 A C B eos=0.054(第 2 步选次优的 C 反而整体更优)。
  • 穷举 O(|Y|^T'):|Y|=10000、T'=10 → 10^40,不可行;贪心 O(|Y|T')=10^5。
  • beam search:每步保 k 个候选序列(展开 k×|Y| 个候选再留 k);长度归一化(对数概率除以长度防短序列偏好)。

ch69 QKV(已读)

  • 数据库类比:D={(Zhang,Aston),(Li,Mu),…},查询 q="Li" 返回 "Mu";查询可以设计得与库大小无关;不用压缩库。
  • Attention(q,D)=Σ α(q,k_i) v_i;特例:凸组合(softmax,最常用);独热=传统数据库查询;全等权重=平均池化。
  • softmax 归一化保证非负+和为 1,可微、梯度不消失;非可微注意力可用 RL 训(Mnih 2014)但复杂。

ch70 Attention Pooling(已读)

  • Nadaraya-Watson 核回归:f(q)=Σ v_i α(q,k_i)/Σα;Gaussian/Boxcar/Epanechikov 核;无需训练、一致收敛;y=2sin x+x+ε 例子;核越窄越不平滑越贴局部;演示「手工注意力」的极限 → 后面学 query/key 的表示。

ch71 Attention Scoring(已读)

  • 高斯核展开:a=qᵀk −½‖k‖²−½‖q‖²;归一化消掉第三项,layer norm 下第二项近似常数 → 简化成点积。
  • 方差论证:q、k 各分量独立零均值单位方差 → 点积方差=d → 除以 √d 保持方差 1:scaled dot product attention a=qᵀk/√d。
  • softmax(QKᵀ/√d)V;masked softmax(把 padding 处打分设为 −10^6 使其权重≈0;比条件分支快,GPU 宁可浪费计算);BMM 批量矩阵乘。
  • additive attention(Bahdanau):a=w_vᵀtanh(W_q q + W_k k),query/key 维度可不同,等价于拼接后过单隐层 MLP。

ch72 Bahdanau Attention(已读)

  • seq2seq 的定长 context 是瓶颈(Graves 2013 手写生成最早遇到;思想可溯到语音识别 HMM 对齐);Bahdanau 2014:c_t' = Σ α(s_{t'-1}, h_t) h_t,解码每步用 decoder 上一步状态当 query、encoder 全部隐状态当 key/value,动态重算 context;可视化解码各步关注输入的不同部分。「arguably 过去十年最有影响力的想法之一」。

ch73 Multi-Head Attention(已读)

  • h 组独立学习的线性投影把 q/k/v 投到不同表示子空间,各自做注意力,输出拼接后再线性变换 W_o;h_i=f(W_i^q q, W_i^k k, W_i^v v);为控成本设 p_q=p_k=p_v=p_o/h;不同头可关注不同范围(短程/长程)依赖。

ch74 Self-Attention & Positional Encoding(已读)

  • self-attention:每个 token 以自己为 query、全体为 key/value,输出同长序列。
  • 三家对比(n 个 token、d 维):CNN O(knd²)、O(1) 顺序操作、最长路径 O(n/k);RNN O(nd²)、O(n) 顺序操作、最长路径 O(n);self-attention O(n²d)、O(1) 顺序操作、最长路径 O(1)——并行最好、路径最短,但序列长了平方复杂度吃不消。
  • 位置编码:sin/cos,p_{i,2j}=sin(i/10000^{2j/d}),p_{i,2j+1}=cos(…);类比二进制位(低位高频高位低频),连续更省;关键性质:任意固定偏移 δ,P_{i+δ} 是 P_i 的线性投影(2×2 旋转矩阵与 i 无关)→ 容易学相对位置。

ch75 Transformer(已读)

  • 整体:encoder-decoder;embedding+位置编码;encoder 每层两子层(multi-head self-attention + positionwise FFN),残差连接+layer norm 包住每个子层;sublayer(x)∈R^d 使残差可行。
  • decoder 三子层:masked self-attention(只看自己及之前,保自回归)、encoder-decoder attention(query 来自 decoder,key/value 来自 encoder 输出)、FFN。
  • positionwise FFN:同一个两层 MLP 独立作用于每个位置。
  • LN vs BN:NLP 变长序列上 BN 通常不如 LN;训练时 embedding 乘 √d 再与位置编码相加。
  • 实验:2 层、4 头,英法翻译;可视化:encoder 自注意力不关注 padding;decoder 自注意力是下三角。

ch76 ViT(略读)

  • 图像切 p×p patch 当 token, 特殊 token;patch embedding=核与步长都等于 p 的单个卷积;GELU;pre-normalization(先 LN 再注意力/MLP,比 post-norm 更好训);大数据集上 ViT 显著超 ResNet,小数据集(Fashion-MNIST)不如 CNN——归纳偏置少的代价。

ch77 Large-Scale Pretraining(已读)

  • 从头训练的模型是 specific expert,对分布轻微移动都敏感;预训练通用模型渐成主流。
  • scaling law(Kaplan 2020):性能随参数/训练 token/算力呈幂律;大模型样本效率也更高(同样性能需更少 token);GPT-3 又验证了外推两个数量级。
  • 三种模式:encoder-only(BERT:masked language modeling,「I love this red car」love→,双向,无需人工标注用书籍+维基;350M 参数/2500 亿 token;微调加层;下句预测目标在 RoBERTa 被证不太有用;ALBERT/SpanBERT/DistilBERT/ELECTRA 变体);encoder-decoder(T5:text-to-text 统一格式,「Summarize: 文章」;预测连续 span,lovered car;C4 语料 10000 亿 token;T5-11B 110 亿参数;BART 强调加噪;Imagen 用冻结 T5-XXL 46 亿参数当文本编码器);decoder-only(GPT 2018 1 亿参数;GPT-2 15 亿、40GB 文本、pre-normalization,不更新参数也能做任务)。
  • in-context learning:zero/one/few-shot,不更新参数,把任务描述+示例+prompt 当前缀;GPT-3(3000 亿 token,最大版本比 GPT-2 大两个数量级,交替层用稀疏注意力)few-shot 提升最快。
  • LLM 家族:Megatron-Turing NLG 530B/270B token;Gopher 280B/300B;Chinchilla 70B/1.4T token(同算力更小模型更多数据,胜过 Gopher);PaLM 540B/780B;PaLM 2 数据模型约 1:1;Minerva、Galactica;开源 OPT/BLOOM/FALCON/LLaMA(更多 token 胜更大模型)。
  • 对齐:instruction tuning(Wei/Sanh 2021);InstructGPT=RLHF(Ouyang 2022);Constitutional AI=RLAIF(Bai 2022);emergent abilities(Wei 2022)。
  • chain-of-thought(Wei 2022):few-shot「问题+中间推理步骤+答案」;自洽性多路径采样(Wang 2023);「Let's think step by step」零样本 CoT(Kojima 2022);多模态 CoT。

ch78 Optimization Intro(已读)

  • 优化的目标(最小化训练损失)≠深度学习的目标(最小化泛化误差);经验风险最小点与风险最小点位置不同。
  • 三大挑战:局部极小(minibatch 噪声反而能把参数震出局部极小——SGD 的隐性好处);鞍点(高维下 Hessian 特征值有正有负的概率很高,鞍点比局部极小更常见;f=x³、x²−y² 例);梯度消失(tanh 在 x=4 处导数 0.0013,ReLU 前的训练难题)。

ch79 Convexity(已读)

  • 凸集(连线仍在集内;交集保凸、并集不保);凸函数 λf(x)+(1−λ)f(x') ≥ f(λx+(1−λ)x');Jensen 不等式 E[f(X)]≥f(E[X])(变分法下界)。
  • 关键性质:凸函数局部极小=全局极小(证明:若有更小点,连线中点矛盾)——「不会卡住」;但全局极小可以不唯一(max(|x|−1,0) 整段都是)或不存在(e^x 渐近 0)。
  • Hessian 半正定 ⇔ 凸;深度学习大多非凸,但局部极小附近常近似凸(Izmailov 2018 SWA)。

ch80 GD(已读)

  • 一阶 Taylor:f(x−ηf')≈f(x)−ηf'² → 只要 η 够小就下降。f=x²、x=10、η=0.2 走查;η=0.05 太慢;η=1.1 振荡发散。
  • Newton 法:ε=−H⁻¹∇f;f=½x² 一步到位;非凸时负曲率方向会朝增方向走(致命缺陷);补救:H 取绝对值或加学习率。H 存储 O(d²) 对深网不可行。

ch81 SGD(已读)

  • 全量 GD 每步 O(n),SGD O(1);随机梯度是全梯度的无偏估计;但最小值附近噪声不消失 → 必须动态降学习率。
  • 三种衰减:piecewise constant(停滞就降,深网常用);exponential(常过早收敛失败);polynomial η₀(βt+1)^{-α},α=0.5 凸情形有理论保证。
  • 非凸问题的收敛保证一般 NP hard。

ch82 Minibatch SGD(略读)

  • 向量化收益;批大小对梯度方差的影响;GPU 上大 batch 的并行效率;学习率随批大小调整。

ch83 Momentum(已读)

  • leaky average:v_t=βv_{t-1}+g_t,展开=历史梯度的指数加权;有效步长变成 η/(1−β)(β=0.9 → 10 倍,所以要降 η)。
  • 病态问题 f=0.1x₁²+2x₂²:x₁ 方向平缓 x₂ 方向陡峭,GD 被迫在「x₂ 发散」与「x₁ 太慢」之间二选一;momentum 在 x₁ 方向同号累积加速、x₂ 方向振荡相消减速——同时治两个病。Polyak 1964;Goh 2017 distill.pub 专文。
  • 「窄峡谷」场景是 momentum 的主场。

ch84 Adagrad(略读)

  • 稀疏特征:常见特征的参数早已收敛,稀有特征的参数还没见到几次,统一学习率两头不讨好;按特征计数又太粗。
  • Adagrad:s(i,t+1)=s(i,t)+(∂_i f)²,梯度平方累计当 Hessian 对角线的便宜代理(preconditioning);大梯度坐标学习率自动缩。问题:s 无界增长,学习率按 O(t^{-1/2}) 单调衰减,凸问题合适、深网不合适。

ch85 RMSProp(略读)

  • Tieleman & Hinton 2012;把 s 换成 leaky average s_t←γs_{t-1}+(1−γ)g²,把坐标自适应与学习率衰减解耦。

ch86 Adadelta(略读):RMSProp 变体,连 η 也去掉,用更新量的 RMS 定步长。

ch87 Adam(已读)

  • 合体:momentum(β₁=0.9 的梯度 EWMA)+ RMSProp 式坐标缩放(β₂=0.999 的梯度平方 EWMA,慢得多);偏差校正 v̂=v/(1−β₁ᵗ)。
  • 更新 g'=η·v̂/(√ŝ+ε),ε=10⁻⁶;Kingma & Ba 2014。
  • 问题:二阶矩估计在高方差/稀疏更新下可能失控 → Adam 甚至在凸情形下不收敛(Reddi 2019);Yogi 修复:s_t←s_{t-1}+(1−β₂)g²⊙sgn(g²−s_{t-1}),更新幅度不再依赖偏差大小。

ch88 LR Scheduling(已读)

  • 学习率四要素:幅度、衰减速率(深网要慢于 O(t^{-1/2}))、初始化 warmup(初始参数是随机的,大踏步可能朝无意义方向)、循环调整(SWA:沿参数路径平均)。
  • 策略:多项式衰减;factor scheduler(η←η·α 带下界);multi-factor(在 t∈{5,10,20} 减半——「走到驻点再降,拿更高质量的局部极小代理」);cosine scheduler(Loshchilov & Hutter 2016:开头别降太狠、结尾用小学习率精修);warmup。
  • 实验:默认 lr=0.3 训练精度涨、测试停滞(过拟合);加 scheduler 曲线更平滑、过拟合更小——理论上为什么减过拟合尚无定论。

ch89-95 Computational Performance

  • ch89 编译器:imperative(Python 逐句解释,GPU 多时解释器开销压死人、变量不敢释放)vs symbolic(先定义全图再编译执行:跳过解释器、编译器可重写 print(10)、及时释放内存);hybrid(开发用命令式、部署转符号式;Theano/TF 符号派,Chainer/PyTorch 命令派)。
  • ch90 异步:GPU 操作入队即返回,后端真算;前端不等 → CPU 继续派活;迫使自己waitall 才暴露真实耗时。
  • ch91 自动并行:框架从计算图知依赖,无依赖的任务自动并行(两个独立初始化并行跑);单设备意义不大,多 GPU/CPU+GPU 协作才有感。
  • ch92 Hardware(已读):
    • 延迟表(Jeff Dean 2010 / Colin Scott 更新):L1 1.5ns、L2 5ns、L3 16ns、内存 ~100ns、4KB 100Gbps fabric 1μs、10Gbps 以太 10μs。
    • 内存:第一次读比后续贵 500 倍(发地址 ~100ns vs 突发续读 0.2ns)→ 避免随机访问;多 bank 独立;64 位对齐。GPU 显存位宽更 大(352-bit)/GDDR6 500+GB/s/HBM 更贵。
    • 存储:HDD 7200 RPM、~100 IOPS 二十年没涨、100-200MB/s → 归档用;SSD 10万-50万 IOPS、1-3GB/s、按块(256KB+)整体擦写所以随机写很差、QLC 更慢、磨损(几千次写)→ 大日志别用;NVMe 直挂 PCIe 4 通道 8GB/s。
    • CPU:核贵(分支预测/投机执行占面积);false sharing(两线程写同一缓存行互踢)。
    • GPU:训练 vs 推理卡(T4 推理:FP16/INT8 够用、不存中间值;V100 训练:混合精度、HBM2);tensor cores(4×4 到 16×16 小矩阵,TPU 走另一个极端——systolic array 超大矩阵);GPU 不擅长中断与稀疏数据(Gunrock、DGL 例外)。
    • 建议:算法对齐硬件(参数装进缓存可数量级提速);纸上先估算性能,差一个数量级就要警惕;用 profiler。
  • ch93 多 GPU(已读):三种并行(网络分区/按层分区/数据并行);数据并行:每张卡一份完整参数,minibatch 切 k 份,各算梯度,allreduce 聚合(commutative reduction),再广播;通信是瓶颈,计算:通信比要够大。
  • ch94 简洁多 GPU(略读):nn.DataParallel / DDP 一行搞定。
  • ch95 Parameter Server(已读):单机内 allreduce 简单;跨机中央服务器带宽 O(m) 成瓶颈 → n 台 server 各存 1/n 参数 → O(m/n) 常数级扩展;worker 与 server 同机;push(累积梯度)/pull(取回)语义,key-value store 抽象(Dynamo 2007);Smola & Narayanamurthy 2010,Li et al. 2014。NVLink 100GB/s vs PCIe 4.0 32GB/s vs 100GbE 10GB/s。

ch96-109 CV 应用

  • ch96 图像增强:随机翻转(左右 50%)、随机裁剪(10%-100% 面积、宽高比 0.5-2)、颜色抖动(亮度/对比度/饱和/色调);只增强训练集,预测时不加随机操作;AlexNet 当年离不开它。
  • ch97 微调(已读):椅子例(10 万张 vs ImageNet 千万级);四步:源模型预训练 → 复制除输出层外全部结构与参数 → 新输出层随机初始化 → 目标数据上训练(输出层从头学、学习率 10η,其余层小学习率 η 微调)。热狗识别:ResNet-18 预训练;标准化 RGB 通道;微调模型同 epoch 表现更好。
  • ch98-103 目标检测:bounding box;anchor boxes(每像素为中心,n+m−1 个尺度×宽高比组合,wh(n+m−1) 个);IoU=Jaccard 指数(交/并,0-1);NMS:按置信度排序,保留最高,抑制 IoU 超阈值的同类框;SSD(2016):base network(VGG 截断)+多尺度特征图块,各层在不同分辨率上预测类别与偏移,小物体靠大特征图;R-CNN 系列:先提候选区域(Selective Search)→ RoI pooling → 每区域分类,快但贵,Faster R-CNN 用 RPN。
  • ch104-106 语义分割:逐像素分类(Pascal VOC);transposed convolution(又称 fractionally-strided conv):输入每个元素×核散布到更大的输出上累加,逆转下采样;FCN(Long 2015):CNN 提特征 → 1×1 卷积把通道数变类别数 → 转置卷积把高宽恢复回输入尺寸。
  • ch107 风格迁移:预训练 CNN 当中间特征提取器;content loss(内容层特征平方差)、style loss(Gram 矩阵=通道间相关性的平方差)、total variation loss(降噪);被优化的「模型参数」就是合成图像本身。
  • ch108-109 Kaggle CIFAR-10/狗品种:完整调参流程。

ch110-126 NLP

  • ch110 word2vec(已读):one-hot 任意两词余弦相似度=0,无法表达相似性;skip-gram(中心词→上下文,P(w_o|w_c)=softmax(u_oᵀv_c),每词两个向量,梯度要遍历全词表);CBOW(上下文平均→中心词)。自监督。
  • ch111 近似训练:负采样(正例 + K 个噪声词,二分类,不用全词表 softmax);hierarchical softmax(二叉树,log|V| 路径)。
  • ch112-113 数据集与预训练:PTB 语料;子采样降高频词;负采样分布 P(w)^{3/4}。
  • ch114 GloVe:词-词共现计数;加权的平方损失拟合 log 共现次数——count-based 与 prediction-based 两条路线的汇合。
  • ch115 subword(fastText):中心词向量=自身向量+其子词(n-gram)向量之和,OOV 词也能拼出来。
  • ch116 相似与类比:余弦相似;king−man+woman≈queen。
  • ch117-119 BERT(已读):演进线——word2vec/GloVe 是 context-independent(crane 两义同向量);ELMo 双向但任务特定架构(冻结 LSTM 权重,特征拼接);GPT 任务无关但只能左到右(bank 同向量);BERT=双向+任务无关。输入:+text+(+第二句+),segment embeddings e_A/e_B,可学习位置嵌入。两个预训练任务:MLM(15% 词被选,80%→/10%→随机词/10%→不变,防预训练-微调失配)与 NSP(50% 真相邻 vs 50% 随机配对);下游微调全部参数。
  • ch120-122 情感分析:IMDb;RNN 版(取最后隐状态);textCNN(多宽度核的一维卷积+时序最大池化)。
  • ch123-126 NLI:SNLI(前提→蕴含/矛盾/中性);decomposable attention( attend:软对齐;compare;aggregate);微调 BERT( 表示接分类层)。

ch127-129 RL(已读)

  • MDP(S,A,T,r):转移函数 T(s,a,s')=P(s'|s,a)(打滑:动作不一定执行到位);reward 由用户设计;gridworld 找绿房子避陷阱。
  • return=累计奖励;折扣 γ<1 防无穷回报,γ 小→短视,γ=0.99→鼓励探索。
  • Markov 假设:下一状态只依赖当前状态与动作(加速度例:把速度纳入状态即可马尔可夫化)。
  • 值函数 V^π(s)=期望折扣回报;Bellman 分解(两阶段:首步奖励+下一步值的期望)——一切 RL 算法的根基;Q^π(s,a) 首步动作固定版;最优策略 π*=argmax V;value iteration:反复应用 Bellman 最优方程直到收敛。
  • Q-learning:不知道 T 和 r 也能学;ε-greedy(1−ε 选当前最优,ε 随机);自纠正性:被高估的动作会被更频繁探索从而被修正——「不只收集数据,还收集对的数据」,这是 RL 与监督学习的分界;FrozenLake 4×4 实验:约 250 轮收敛(value iteration 更少轮——它有完整 MDP)。DQN=深度网络版。

ch130-132 Gaussian Processes(已读)

  • 思路转换:不估参数,直接在函数空间指定先验(变化快慢、周期、平移不变等);GP=任意有限个点集联合高斯;f~GP(m,k),核/协方差函数 RBF k=a²exp(−‖x−x'‖²/2ℓ²);a=幅度,ℓ=长度尺度(wiggliness)。
  • 后验:观测数据后函数的后验仍 GP,均值与方差闭式解;epistemic uncertainty 随数据增多而缩,离数据远处不确定性增大;95% credible interval。
  • 推理:回归闭式;分类等非高斯似然要近似;GPyTorch 库。

ch133-137 HPO(已读)

  • 超参(学习率/批大小/weight decay/dropout/层数)不能用训练损失调(会把正则调成 0 → 过拟合),要用验证集;ResNet/CIFAR-10 单次 2 小时,10 组配置串行=1 天,且超参不跨架构/数据集迁移。
  • 随机搜索优于网格(重要维度少时);异步随机搜索(worker 空闲就领新配置)。
  • 多保真:低保真(少 epoch/子采样)快速淘汰;successive halving(每个 rung 留 1/η);同步 SH 要等 rung 齐(空闲);ASHA 凑够 η 个观测就晋级,排名跨 rung 一致性高所以次优晋级代价小。

ch138-139 GAN(已读)

  • 判别学习 vs 生成建模;two-sample test(两组样本是否同分布)被 GAN 拿来当训练信号:判别器=二分类器(D(x)→真 1 假 0,cross-entropy),生成器 G(z) 从噪声 z 造样本骗 D。
  • minimax:min_D max_G {−E log D(x) − E log(1−D(G(z)))};生成器实际用 −log D(G(z))(避免 D 太强时梯度消失)。
  • 走查:用 GAN 估二维高斯的均值与协方差(单层线性 G + 三层 MLP D)——「世界最低效的高斯参数估计器」。
  • DCGAN(2015):判别器 4 层卷积+BN+leaky ReLU(治 dying ReLU),生成器 4 层转置卷积;Pokemon 精灵图。

ch140-149 推荐系统

  • 概览:显式(评分)vs 隐式(点击/购买/观看)反馈;MovieLens 数据集。
  • 矩阵分解:R≈PQᵀ(k 维潜因子)+用户/物品偏置 b_u、b_i;平方误差+ℓ2 正则;Simon Funk 2006 博客首提,Netflix Prize(100 万美元,胜 Cinematch 10%)使其闻名,BellKor 大杂烩中 MF 是核心。
  • AutoRec:自编码器重构评分向量;personalized ranking(BPR 损失:正例排负例前);NeuMF:GMF+MLP 双通路替代点积;序列感知(Caser 用卷积抓序列模式);特征丰富(CTR);FM(二阶交互 χ 通常取 2,多项式时间降到线性,适合高维稀疏);DeepFM=FM+深度网络。

ch150-160 数学附录(略读,工具书性质)

  • 几何与线性代数操作;特征分解;单变量微积分(导数/泰勒);多变量微积分(梯度/雅可比/海森/链式);积分;随机变量;最大似然;常见分布;朴素贝叶斯;统计(置信区间/假设检验);信息论(自信息 −log p、熵公理三条、KL 散度、交叉熵、互信息)。

ch161-168 工具附录(略读):Jupyter、SageMaker、AWS EC2、Colab、选 GPU 服务器、贡献指南、d2l 工具函数库、d2l API。