
期末季的图书馆四层总能看到有人抱着一摞打印的slides从第一页翻到最后一页翻完之后长叹一口气——知识点全见过题一个不会做。深度学习这门课的期末考试就属于这种类型它不考你背了多少名词而是把反向传播的推导、卷积参数的手算、优化器和归一化的辨析揉在一张卷子上让你在有限的三个小时里同时调动数学、代码和工程直觉。这篇笔记记录的是一套完整的复习路径从考点分布判断到推导过程复原再到考场上的高频计算题适合正在准备期末的同学直接拿来对照复习也适合刚入门深度学习、想把零散知识点串成骨架的人。1. 复习之前的第一个判断这门课到底想考你什么我见过太多人复习深度学习的方式是把slides当小说读读完三遍做题时依然卡壳。问题不在努力程度而在于没有先判断这门课的出题逻辑。深度学习这门课的期末考试出题人通常会把内容切成三条线推导线、计算线、辨析线。三条线的复习方式完全不同混在一起复习效率会低一半。1.1 从课程大纲反推考点权重的实操方法先做一件很朴素的事把整个学期的slides目录抄下来然后给每一章标注三个标签中的一个或多个——会推会算会背。会推反向传播、Softmax交叉熵的梯度、BatchNorm的前向与反向、注意力机制的加权求和。这类知识点考的是你能不能在白纸上从零写出来光看懂没用。会算卷积输出尺寸、卷积层参数量、感受野、FLOPs、显存占用、感受野叠加。这类题有固定公式但公式容易记混必须靠做题固化。会背各类激活函数的优缺点、经典网络的结构差异、优化器的演进顺序、正则化手段的适用场景。这类内容适合在考前用对比表格集中突击。把目录标完标签你会发现会推的部分其实只占20%左右的篇幅但它往往决定了你卷面上的高分题能不能拿下来。因为推导题的分值通常不低而且是最难蒙的——你写错一步后面全错。一个很实用的判断技巧翻一翻往年题或者课后习题凡是题干里出现证明推导写出梯度表达式的全部归入会推凡是出现计算求多少的归入会算剩下的判断题和简答题归入会背。三类题的比例大致是2:3:5但推导题的单位分值最高。1.2 三类题型对应的三种复习节奏不同类型的内容复习节奏要错开。推导类必须手写复现。我的做法是拿一张白纸不看任何资料把计算图画出来从损失函数一层层往回推到每个参数的梯度。第一次大概率推不出来卡在哪一步就回去看哪一步第二天再默写一遍直到能在五分钟内不卡壳地推完一个两层网络。这件事没有任何捷径看十遍不如写一遍。计算类必须带着数字算。很多人记公式只记符号形式比如输出尺寸公式 $(W - K 2P)/S 1$但真给他 $W224$、$K7$、$P3$、$S2$他还要想半天。复习时每一类公式至少手算五组不同的数字组合尤其是步长不为1、padding不对称、池化层参与的情况。辨析类适合做成表格。比如把SGD、Momentum、AdaGrad、RMSProp、Adam放到一张表里对比它们各自解决了什么问题、引入了几阶矩、对学习率敏感程度如何。表格化的知识在考场上提取速度快不容易张冠李戴。提示复习的第一天不要急着看具体内容先花两个小时把考点地图画出来。这张地图会决定你后面每一小时往哪个方向投入避免把时间浪费在低分值的背诵内容上。2. 把神经网络那套推导亲手走一遍从线性回归到反向传播深度学习所有推导的根都扎在同一个地方——复合函数的链式法则。你在这一章花的功夫会直接决定后面卷积、序列、注意力各章的推导能不能自己写出来因为那些复杂结构的反向传播拆开来看依然是链式法则的反复应用。2.1 逻辑回归为什么是所有推导的起点很多人觉得逻辑回归太简单直接跳过结果在推多层网络时连最基础的梯度形式都写不利索。逻辑回归的完整推导链条值得反复练给定输入 $\mathbf{x}$权重 $\mathbf{w}$偏置 $b$先算线性部分 $z \mathbf{w}^\top\mathbf{x} b$再经过 Sigmoid 得到 $\hat{y} \sigma(z)$。损失用二元交叉熵$$L -[y\log\hat{y} (1-y)\log(1-\hat{y})]$$关键的一步是 $\sigma(z) \sigma(z)(1-\sigma(z))$这个导数把交叉熵里的对数消掉最后得到极其干净的梯度$$\frac{\partial L}{\partial z} \hat{y} - y$$这个结果一定要背下来因为它会反复出现。无论是 Softmax 加交叉熵还是多层网络的输出层最终梯度都长得像预测值减真实值。我在复习的时候把这一步单独抄在一张卡片上做题时先看看能不能套用这个形式能套的题基本就秒了。顺便说一句多分类的 Softmax 加交叉熵结论是同一件事对第 $i$ 个类别的 logit 求导结果是 $p_i - y_i$。这个统一性很重要它意味着你只要记住了预测减真实输出层无论二分类还是多分类都不用重新推。2.2 反向传播的链式法则一张计算图顶十页笔记反向传播的本质是动态规划。前向传播时每个节点算出一个值反向传播时从损失往回走把上游传回来的梯度乘以本地的偏导再往下游分发。用计算图来表达比用一堆求和符号直观得多。手推一个两层MLP作为练习模板。设输入 $\mathbf{x}$第一层 $z_1 W_1\mathbf{x} \mathbf{b}_1$激活 $\mathbf{a}_1 \text{ReLU}(z_1)$第二层 $z_2 W_2\mathbf{a}_1 \mathbf{b}_2$输出经过 Softmax 得到 $\mathbf{p}$交叉熵损失 $L$。反向顺序是先算 $\frac{\partial L}{\partial z_2} \mathbf{p} - \mathbf{y}$再算 $\frac{\partial L}{\partial W_2} (\mathbf{p} - \mathbf{y})\mathbf{a}_1^\top$偏置梯度就是 $\mathbf{p} - \mathbf{y}$传到第一层$\frac{\partial L}{\partial \mathbf{a}_1} W_2^\top(\mathbf{p} - \mathbf{y})$经过 ReLU 时乘以门控$\frac{\partial L}{\partial z_1} \frac{\partial L}{\partial \mathbf{a}_1}\odot \mathbb{1}[z_1 0]$最后 $\frac{\partial L}{\partial W_1} \frac{\partial L}{\partial z_1}\mathbf{x}^\top$。整个过程里有三件事特别容易错一是转置的位置$W^\top$ 和 $W$ 搞反是高频错误二是 ReLU 的门控要按元素乘不是矩阵乘三是偏置的梯度在求和后会变成一个向量维度要和偏置本身对齐。我当年第一次推的时候把 $W_2^\top$ 写成了 $W_2$检查了半天才发现维度对不上。一个防止转置写错的笨办法把每一步的维度写在旁边维度对不上的地方一定是错的。2.3 泛化误差界这类抽象题的复习姿势除了具体的推导这门课还常考一些偏理论的概念比如泛化误差界、偏差-方差分解、ERM原则。这类内容看起来玄其实核心就一句话训练误差小不代表泛化好模型复杂度需要和样本量匹配。泛化误差界的典型形式是把泛化误差拆成经验误差加上一个复杂度项。复杂度项通常和假设空间的大小比如VC维、Rademacher复杂度成正比和样本量 $N$ 成反比大致是 $O(\sqrt{\text{复杂度}/N})$ 的量级。复习的时候不用背具体常数但要理解几个推论样本量越大界越紧泛化越有保障假设空间越大模型越复杂界越松越容易过拟合这个界是最坏情况的保证实践中深度网络的泛化往往比界给出的要好这本身就是一个值得讨论的现象。考题经常让你判断以下哪种做法能减小泛化误差界答案是增加数据、限制模型复杂度、加入正则化。反过来单纯增加训练轮数不会减小泛化误差界反而可能扩大训练误差和泛化误差的差距。理解了这个逻辑这类题基本不会失分。3. 卷积网络章节参数计算、感受野与经典结构的对照卷积网络是这门课内容最密集的一章也是计算题的高发区。这一章的复习策略很明确公式必须手算经典网络必须能说出解决了什么问题。不要满足于我知道VGG很深要能讲清楚它为什么用3×3卷积堆叠而不是用大卷积核。3.1 输出尺寸与参数量的手算公式输入特征图边长 $W$卷积核 $K$填充 $P$步长 $S$输出边长是$$W_{out} \left\lfloor \frac{W - K 2P}{S} \right\rfloor 1$$这个公式一定要配合感受野一起理解。填充的作用是控制输出尺寸让边缘信息不被过度丢弃步长控制下采样的比例。举个常考的例子输入 $224\times224$卷积核 $7\times7$步长2填充3输出是 $\lfloor(224-76)/2\rfloor1 112$。这个配置就是经典网络第一层的设置。参数量的公式更简单一个卷积层的参数量是$$\text{Params} (K_h \times K_w \times C_{in} 1) \times C_{out}$$那个 $1$ 是偏置。举个例子$3\times3$ 卷积输入通道 64输出通道 128参数量是 $(3\times3\times641)\times128 73{,}856$。如果换成两个 $3\times3$ 卷积堆叠替代一个 $5\times5$ 卷积参数量从 $5\times5\times C^2$ 降到 $2\times3\times3\times C^2$这就是为什么3×3成为主流。计算题最常见的坑是忘记乘输出通道数或者把偏置算重了。建议每算一步就在旁边标注单位避免漏项。下面这张表是我复习时整理的高频计算对比可以直接拿去练习题型公式易错点输出尺寸$\lfloor(W-K2P)/S\rfloor1$忘记向下取整卷积参数量$(K^2C_{in}1)C_{out}$漏乘输出通道、漏算偏置全连接参数量$N_{in}\times N_{out}N_{out}$偏置重复计入卷积计算量(MACs)$H_{out}W_{out}K^2C_{in}C_{out}$与参数量混淆感受野逐层累加忽略步长的累积效应3.2 感受野的递推计算感受野指的是输出特征图上一个点对应输入图像上多大的区域。它是理解深层网络为什么能看到全局信息的关键。递推公式是$$RF_{i} RF_{i-1} (K_i - 1)\prod_{ji} S_j$$从第一层开始往前推每加一层感受野增加 $(K-1)$ 乘以之前所有步长的乘积。经典网络的感受野增长很快几层池化和步长卷积之后就能覆盖整个输入。考试里常出现的问法是经过这样几层之后输出一个像素对应输入多少像素这时候就老老实实按顺序推。我的习惯是画一个小表格逐层记录当前感受野和累积步长避免在中途算错累积项。3.3 从LeNet到ResNet每一代解决的问题光会算还不够经典网络的结构演进是简答题的常客。与其死记每一层的通道数不如记住每一代网络解决的核心问题LeNet证明卷积池化全连接的组合在手写数字识别上可行奠定了CNN的基本范式。AlexNet用ReLU替换Sigmoid缓解梯度消失用Dropout抑制过拟合用数据增强和大规模GPU训练把CNN带入实用阶段。VGG用连续的3×3小卷积堆叠替代大卷积核在保持感受野的同时减少参数量、增加非线性。GoogLeNet/Inception用多尺度并行卷积和1×1卷积降维在控制计算量的前提下增加网络宽度。ResNet引入残差连接让梯度可以跨层直连解决了深层网络的退化问题把网络深度推到上百层。这五条线索串起来就是一部如何让网络更深更准更省的历史。答题时哪怕记不住具体数字只要能讲清楚每一代针对的痛点分数不会低。4. 序列与注意力RNN到Transformer的动机链条如果说卷积网络复习的关键是算得准那序列建模这一章的关键就是讲得通。因为序列模型的结构演进有非常清晰的因果链条你只要理解了每一步为什么这么改整章内容就能连成一条线而不是一堆孤立的结构图。4.1 梯度消失与LSTM门控的直觉朴素RNN的问题不是不能记而是记不住太久。反向传播沿时间展开后梯度要连乘 $T$ 次只要每步的系数小于1梯度就会指数衰减长期依赖的信号在传回来之前就消失了。LSTM的思路是给信息开一条高速公路——细胞状态。它通过三个门控制信息的流动遗忘门决定丢掉多少旧信息输入门决定写入多少新信息输出门决定暴露多少状态。门本身是Sigmoid函数输出在0到1之间相当于一个可学习的开关。理解LSTM不需要背公式但要能讲清楚为什么门控能缓解梯度消失因为细胞状态的更新是加法形式的 $C_t f_t\odot C_{t-1} i_t\odot \tilde{C}_t$梯度回传时至少有一条通路是乘上遗忘门 $f_t$只要 $f_t$ 接近1梯度就能近似无损地传回去。GRU做的事情类似只是把三个门合并成两个更新门和重置门参数更少效果在多数任务上接近。复习时最容易被问的对比题是LSTM和GRU怎么选。一个实用的判断依据数据量小、计算资源紧张时GRU更合适因为参数少不易过拟合任务对长距离依赖要求高、数据充足时LSTM的表达能力上限略高。但这只是经验不是定律。4.2 注意力机制到底在算什么注意力机制的直觉可以用一句话概括别把所有信息平等对待按相关程度加权。给定一组键值对 $(\mathbf{k}_i, \mathbf{v}_i)$ 和一个查询 $\mathbf{q}$先算 $\mathbf{q}$ 和每个 $\mathbf{k}_i$ 的相似度归一化成权重再对 $\mathbf{v}_i$ 加权求和。缩放点积注意力的公式是$$\text{Attn}(Q,K,V) \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V$$那个 $\sqrt{d_k}$ 的缩放很重要很多人会忽略。原因是当维度 $d_k$ 很大时点积的方差会随维度增长导致 Softmax 的输入分布过于尖锐梯度接近饱和。除以 $\sqrt{d_k}$ 把方差拉回1附近训练才稳定。这个细节经常出现在简答题里。自注意力就是把 $Q$、$K$、$V$ 都来自同一个序列多头注意力则是把表示空间切成多个子空间分别做注意力再拼接起来。多头的好处是让不同的头关注不同的模式比如有的头关注语法关系有的头关注位置邻近。4.3 Transformer的编码器-解码器结构拆解Transformer 把 RNN 的循环结构彻底换成了注意力加前馈网络带来了两个直接好处并行度高、长距离依赖路径短。编码器由若干相同的层堆叠每层包含一个多头自注意力子层和一个前馈网络子层两个子层都配有残差连接和 LayerNorm。解码器额外插了一层交叉注意力让输出序列能看到编码器的输出。复习的时候我建议把 Transformer 的每一块都问自己三个问题它是什么、为什么放在这里、去掉它会怎样。比如位置编码为什么必须有因为自注意力本身是置换不变的打乱输入顺序结果不变必须显式注入位置信息。再比如残差连接为什么每层都加因为它是梯度回传的高速路也是深层网络能训得动的关键。把这几个为什么搞清楚Transformer 那一章的内容就活了。剩下的实现细节比如LayerNorm放在残差前还是后、前馈网络的隐藏维度是模型的4倍记住结论即可不用深究。5. 训练工程细节优化器、归一化与正则化的取舍前三节讲的是模型长什么样这一节讲的是模型怎么训得动。这部分内容在考试里主要以辨析题和简答题出现看起来零碎但把背后的动机理清楚之后其实是整门课最有工程感的部分。5.1 优化器的演进与选择依据优化器的发展史本质上是如何更聪明地走每一步的历史。下面这张表是我复习时反复看的对比优化器核心思想解决什么问题适用场景SGD沿当前梯度方向走简单直接数据量大、有充足调参时间Momentum累积历史梯度方向抑制震荡、加速收敛病态曲率问题AdaGrad按历史梯度平方缩放学习率稀疏特征自适应稀疏数据RMSProp用指数滑动平均替代累加AdaGrad学习率过快衰减非平稳目标Adam一阶矩二阶矩偏差校正综合以上优点通用默认选择理解这张表的关键是每一步在修正上一步的什么问题。Momentum解决的是SGD在峡谷地形里左右震荡的问题AdaGrad解决的是不同参数需要不同学习率的问题Adam则是把动量和自适应学习率结合起来还加了偏差校正让初期估计更准。考场上如果让你选优化器一个稳妥的回答是没有万能选择Adam适合快速得到基线效果SGD加Momentum在精心调学习率后往往能达到更好的最终精度。这个结论在很多论文里都被验证过答上去很加分。5.2 BatchNorm与LayerNorm的适用边界归一化的核心作用是让每层的输入分布保持稳定避免内部协变量偏移从而允许更大的学习率和更快的收敛。BatchNorm 在 batch 维度上做归一化也就是对同一通道、同一个 batch 内所有样本求均值和方差。它对 batch size 敏感batch 太小统计量不准效果会明显变差。LayerNorm 则是在单个样本内部、跨特征维度做归一化不依赖 batch size因此在序列建模和 batch 很小的场景里更常用。两者的适用边界是高频简答题卷积网络和图像分类多用 BatchNormTransformer 和序列任务多用 LayerNorm。原因也很清楚——序列长度可变、batch 经常很小BatchNorm 的统计量不稳定而 LayerNorm 每个样本独立计算天然适配变长输入。需要注意的一个细节BatchNorm 在训练和推理时的行为不同训练时用当前 batch 的统计量推理时用滑动平均的统计量。这是很多人第一次写出bug的地方考题里也爱问为什么推理时要固定统计量。5.3 正则化与数据增强的组合拳正则化手段不止一种复习时要能把它们按作用位置和作用机理分类。Dropout 是在训练时随机丢弃一部分神经元逼网络不要过度依赖某几条路径。L2 正则是在损失里加上权重的平方和把权重往小的方向拉让模型更平滑。早停是根据验证集表现提前终止训练用最简单的方式防止过拟合。数据增强是通过旋转、裁剪、翻转等方式扩充训练集的有效多样性。这几招在实战里往往是组合使用的。一个典型的组合是数据增强打底Dropout 放在全连接层L2 正则加在优化器里早停作为最后的守门员。考题如果问给一个过拟合的场景你有哪些手段把这四类按优先级列出来再说明各自的适用条件基本就是满分答案。注意正则化强度不是越大越好。L2 系数过大模型会欠拟合Dropout 概率过高训练时有效容量不足。答题时如果被追问可以提一句需要通过验证集调参,这个细节能体现工程经验。6. 考场上的高频计算题与易错点清单前面几节讲的是知识框架这一节专门收口那些最容易丢分的具体题型。我把复习过程中反复出错的点整理成三块梯度推导、计算量估算、概念辨析。6.1 Softmax交叉熵的梯度推导这是全卷最值得反复练的一道推导。设 logits 为 $\mathbf{z}$Softmax 输出 $p_i \frac{e^{z_i}}{\sum_j e^{z_j}}$真实标签的独热编码是 $\mathbf{y}$交叉熵损失是 $L -\sum_i y_i \log p_i$。推导分两步。第一步算 $\frac{\partial p_i}{\partial z_j}$分 $i j$ 和 $i \neq j$ 两种情况当 $i j$$\frac{\partial p_i}{\partial z_i} p_i(1 - p_i)$当 $i \neq j$$\frac{\partial p_i}{\partial z_j} -p_i p_j$第二步代入链式法则损失对 $z_j$ 的导数化简后正好是 $p_j - y_j$。这个结果漂亮得让人怀疑但它确实是自洽的。常见的错误有两个一是把 $p_i(1-p_i)$ 和 $p_i p_j$ 的符号搞反二是忘记 $y$ 是独热向量、只有一项为1。复习时把这两种情况分清楚推导过程就不会乱。我在考场上遇到这类题第一件事是先把 $ij$ 和 $i\neq j$ 两条分支写出来再往下推稳。6.2 卷积层FLOPs与显存估算计算量题的关键是分清三个概念参数量、MACs、FLOPs。参数量是权重个数MACs 是一次前向传播里的乘加次数FLOPs 通常约等于 2 倍 MACs一次乘法加一次加法。对一个卷积层$$\text{MACs} H_{out} \times W_{out} \times K_h \times K_w \times C_{in} \times C_{out}$$显存占用则要同时考虑激活值、权重和梯度。激活值占的大头通常是 batch 内所有中间特征图的存储量级是 $N \times H \times W \times C$ 乘以每层累加。考试如果让你估算某个网络的显存需求思路是先算最大一层的激活占用再乘以 batch size最后加上参数和优化器状态Adam 会额外存两份。这类题没有唯一答案关键是写出你的估算模型和假设。把假设列清楚即使数字略有出入过程分也能拿到。6.3 概念辨析题的陷阱概念题看着简单实际最容易失分因为选项之间往往只有一两个词的差别。下面这几个是我踩过的坑概念对区别要点参数 vs 超参数参数由训练得到超参数由人工设定epoch vs batch vs iteration一个epoch扫一遍全量数据iteration是处理一个batch偏差 vs 方差偏差是模型的系统性偏离方差是对数据扰动的敏感度判别式 vs 生成式判别式建模 $P(y|x)$生成式建模 $P(x,y)$梯度消失 vs 梯度爆炸系数连乘小于1衰减大于1放大复习这类内容的方式是自己做选择题然后解释每个选项为什么对、为什么错。只对答案没用讲清楚理由才算真会。7. 两周复习节奏怎么把知识点变成肌肉记忆知识点梳理完最后落地的是时间安排。我的经验是深度学习这门课两周时间足够但前提是每天都动手写而不是被动看。7.1 输出倒逼输入自己出题自己答最有效的复习方式不是重复阅读而是假装自己是出题人。每复习完一章逼自己写三道题一道推导、一道计算、一道辨析。写的时候不看资料写完再对照笔记改。这个过程会暴露你以为自己会了的所有漏洞。我自己那会儿的做法是攒了一个小本子专门记我出错的题。考前翻这个本子比翻任何资料都管用因为那里面的每一道都是我真实的薄弱点。7.2 用代码验证公式很多东西纸面上推一遍还是会虚。用几行 PyTorch 验证一下立刻就实了。比如验证 BatchNorm 在训练和推理时的差异import torch import torch.nn as nn bn nn.BatchNorm1d(4) bn.train() x torch.randn(8, 4) y_train bn(x) # 用当前 batch 统计量 bn.eval() y_eval bn(x) # 用滑动平均统计量 print((y_train - y_eval).abs().max())跑一次就会看到两者结果不同这个差异在纸面上是抽象的在代码里是具体的。类似的验证还可以用于感受野计算、卷积输出尺寸、Dropout 的训练推理差异。用代码验证过的公式考场上很难写错。7.3 考前48小时做什么最后两天不要碰新知识只做三件事默写推导把反向传播、Softmax梯度、BatchNorm这些高频推导在空白纸上默写一遍卡住的立刻回去补。翻错题本只看自己出过的错不刷新题。过一遍公式表把输出尺寸、参数量、感受野、MACs 这几个公式各手算两组数字保持手感。还有一个小技巧把最容易混的概念做成一张只有关键词的卡片考前一小时扫一遍。比如BatchNorm-通道-依赖batch、LayerNorm-特征-不依赖batch这种关键词联想能在考场上快速唤醒记忆。我自己在实战中最大的体会是深度学习的期末考不考你记住了多少考的是你能不能在压力下把一套推导逻辑稳定地复现出来而这种稳定性只能靠反复动手练出来。