期末周的图书馆,凌晨两点还坐着一半人,桌上摊开的不是《深度学习》就是打印出来密密麻麻的课件。我这门国科大人工智能学院的深度学习课,从开课到现在经历了三次作业、一次期中、无数次对着loss曲线发呆的夜晚,最后攒下了一份自认为还算能打的复习笔记。这份笔记不是把教材目录抄一遍,而是我按考试和面试的双重标准,把整门课的骨架重新拆了一遍。它适合两类人:一类是正在准备深度学习期末的同学,想快速抓住重点;另一类是想入门人工智能但被公式劝退的学习者,需要一份能"说人话"的地图。我会把每个知识点为什么重要、考试爱怎么考、实际代码里长什么样讲清楚,能推公式的推公式,能上代码的上代码。
1. 复习前先搞清楚这门课到底在考什么
很多人一上来就翻PPT从第一页背到最后一页,结果背到卷积那章就崩溃了,前面的BP推导也忘了七八成。我踩过这个坑,期中就是这么栽的。后来我换了个思路:先把整门课画成一张知识地图,再决定每一块该花多少时间。这一步看着虚,实际上决定了你后面复习效率的上限。
1.1 知识地图:从数学地基到前沿模型的四层结构
我把这门课的内容切成四层。最底层是数学地基,包括线性代数、概率论、微积分和一点点信息论,考试里它通常不单独出大题,但会渗透在推导题的每一步里。第二层是神经网络的核心机制,也就是前向传播、反向传播、激活函数、损失函数这一套,这是整门课的心脏,几乎所有学校的大题都绕不开反向传播的链式推导。第三层是主流网络结构,卷积神经网络、循环神经网络、注意力机制和Transformer,这部分考察的是你对"为什么这样设计"的理解。第四层是训练技巧和生成模型,包括优化器、正则化、批归一化、GAN、VAE这些,偏工程和直觉。
这四层不是并列关系,而是层层支撑。你如果第二层的反向传播没吃透,第三层的CNN反向怎么传、Transformer的梯度怎么流,你也只能背结论。所以我的时间分配是这样的:数学地基花20%,核心机制花30%,网络结构花35%,训练技巧和生成模型花15%。事实证明这个比例还算靠谱,因为考试的大分往往集中在反向传播和几种经典网络上。
1.2 我的复习节奏安排与资料取舍
资料这块我做了一次狠心取舍。教材、课件、还有那本被大家叫"花书"的《深度学习》,我最后只精读了两样:老师的课件和作业题。原因很简单,期末出题的人就是老师,他的课件里反复出现的公式,大概率就是考点。花书适合当字典查,不适合当复习主线,从头读到尾你会发现读完就忘。
节奏上我用了"三轮法"。第一轮用三天快速过一遍全部内容,不求记住,只求知道每章在讲什么,把不懂的地方标记出来。第二轮用五天精读重点章节,边读边手推公式,尤其是反向传播、卷积输出尺寸计算、注意力公式这几块,我都是在草稿纸上推了三遍以上。第三轮是考前两天,只做一件事:看自己整理的一页纸速查表和错题。这一轮不碰新知识,避免越看越慌。这个节奏的关键是第二轮,它决定了你到底是"看过"还是"会了",很多人复习失败就失败在只做了第一轮。
2. 数学地基:别跳过,考试就爱在这儿挖坑
我身边不少同学觉得深度学习就是调包,数学不用管。结果一到考试看到"请推导某层梯度"就傻眼。数学是这门课的隐性考点,它不会单独给你一道纯数学题,但它会在每一个推导步骤里等着你。这块我整理了三块最常被考的内容:矩阵求导、概率与信息论、泛化误差界。
2.1 线性代数与矩阵求导:梯度推导的语言
深度学习的梯度本质上是向量和矩阵的求导,而考试最爱考的就是各种维度变换和链式法则。先记住几个基础结论:标量对向量求导得到的是向量,形状和原向量一致;标量对矩阵求导得到的是矩阵,形状和原矩阵一致。这个"形状一致性"是我用来检查推导对不对的土办法,非常好用。
再来说关键的那几个。对于 $y = Wx$,其中 $x \in \mathbb{R}^n$,$W \in \mathbb{R}^{m \times n}$,那么 $\partial y / \partial x = W$。如果损失 $L$ 是标量,那么 $\partial L / \partial W$ 和 $W$ 同形状。链式法则在矩阵语境下依然成立,只是要注意乘法的顺序,因为矩阵乘法不可交换。我当时最容易搞混的就是转置的位置,后来总结了一句话:把梯度传回前一层时,凡是涉及权重的,都要用权重的转置去乘上游梯度,这样才能保证维度对得上。
一个具体例子,全连接层的前向是 $z = Wx + b$,反向时已知 $\partial L / \partial z$,那么 $\partial L / \partial W = (\partial L / \partial z) x^T$,$\partial L / \partial x = W^T (\partial L / \partial z)$。你可以自己拿维度验一遍:$W$ 是 $m \times n$,$x$ 是 $n \times 1$,那么 $(\partial L / \partial z) x^T$ 就是 $m \times n$,和 $W$ 一致,完美。这个维度检查法在考场上救过我好几次,推导完顺手验一下,能抓出大部分低级错误。
2.2 概率论与信息论:损失函数背后的道理
为什么分类用交叉熵而不是均方误差?这个问题的答案就在信息论里。交叉熵衡量的是两个概率分布之间的距离,当我们用softmax把网络输出变成概率分布后,交叉熵刚好对应最大似然估计。具体来说,单个样本的交叉熵损失是 $L = -\sum_{i} y_i \log \hat{y}_i$,其中 $y$ 是one-hot标签,$\hat{y}$ 是预测概率。考试里经常让你推导softmax加交叉熵的梯度,结果非常优美:$\partial L / \partial z = \hat{y} - y$,也就是预测减真实。这个结论一定要背下来,因为它不仅常考,而且直观:预测偏高就往下压,预测偏低就往上拉。
概率部分还要掌握极大似然估计和贝叶斯的基本思想。很多损失函数的本质都是负对数似然,比如回归用均方误差,背后其实假设了噪声服从高斯分布。这个联系考试爱考简答,问"为什么用MSE",你答"等价于假设输出服从高斯分布下的极大似然",就很到位。另外KL散度也常出现,它是交叉熵减去熵,衡量两个分布的差异,VAE的损失里就用到它。
2.3 泛化误差界:从直觉到公式
这块是很多人觉得最"玄"的部分,但其实考起来套路很固定。泛化误差指的是模型在未见数据上的错误率,我们真正关心的是它,而不是训练误差。偏差方差分解把期望泛化误差拆成三部分:偏差的平方、方差、还有不可避免的噪声。偏差衡量模型预测的平均值偏离真实值的程度,方差衡量模型对训练集变化有多敏感。
考试里常让你解释过拟合和欠拟合分别对应哪一项。我的记法是:欠拟合是高偏差,模型太简单,怎么学都学不到位;过拟合是高方差,模型太复杂,训练集稍微变一点,学出来的函数就大变样。降低偏差的办法是增加模型复杂度,降低方差的办法是加正则化、增加数据、用集成方法。这组对应关系几乎每年都考,答题时把"高偏差-欠拟合-加复杂度"和"高方差-过拟合-加正则"这两条线背熟。
泛化误差界还有一类理论工具,比如VC维。VC维衡量的是一个假设类能"打散"多少样本点的能力。直观理解:一个模型的VC维越高,它能拟合的函数就越复杂,理论上它的泛化误差上界也越松。考试一般不会让你算VC维的具体数值,但会让你解释"为什么VC维高不代表一定过拟合",这里的答案是:界是上界,是理论保证,实际泛化还取决于优化过程、数据量和正则化。这道题我期中答偏了,只说了"VC维高容易过拟合",没说出"上界是松的、实践还要看优化",导致扣分。所以答这类题一定要有辩证的两面。
3. 神经网络的核心机制:整门课的心脏
如果把深度学习比作一台机器,数学是图纸,那神经网络的核心机制就是这台机器真正转动起来的齿轮。这部分是考试的绝对重点,反向传播的推导几乎年年出现,而且分值很高。我花了最多时间在这里,下面把三个最关键的模块拆开讲。
3.1 前向传播与反向传播的手推过程
前向传播很直白,数据从输入层一路乘权重、加偏置、过激活函数,最后到输出层算出损失。真正的难点在反向传播,也就是用链式法则把损失对每个参数的梯度算出来。我用一个两层网络完整推一遍,这个推法考试直接能用。
设输入 $x$,第一层权重 $W_1$、偏置 $b_1$,激活函数 $\sigma$,第二层权重 $W_2$、偏置 $b_2$。前向是:$z_1 = W_1 x + b_1$,$a_1 = \sigma(z_1)$,$z_2 = W_2 a_1 + b_2$,损失 $L$ 由 $z_2$ 算出。反向时,先算 $\partial L / \partial z_2$,这个取决于损失函数,比如softmax加交叉熵就得到 $\hat{y} - y$。然后往回传:$\partial L / \partial W_2 = (\partial L / \partial z_2) a_1^T$,$\partial L / \partial b_2 = \partial L / \partial z_2$,接着 $\partial L / \partial a_1 = W_2^T (\partial L / \partial z_2)$,再乘上激活函数的导数 $\partial L / \partial z_1 = \partial L / \partial a_1 \odot \sigma'(z_1)$,最后 $\partial L / \partial W_1 = (\partial L / \partial z_1) x^T$,$\partial L / \partial b_1 = \partial L / \partial z_1$。这里的 $\odot$ 是逐元素相乘。
这套推导的关键是记住"上游梯度乘本地梯度",并且每一步都用维度检查。我在考场上会先把所有变量的维度写出来,然后一步步算,最后逐个验维度,这样即使算错也很容易发现。还有一个高频考点是激活函数导数:sigmoid的导数是 $\sigma(1-\sigma)$,tanh的导数是 $1 - \tanh^2$,ReLU的导数在正区间是1、负区间是0。这几个导数必须做到闭着眼都能写出来。
3.2 激活函数怎么选:别只会背,要懂取舍
激活函数是引入非线性的关键,没有它,再深的网络也等价于一个线性变换。考试爱考的是几种激活函数的对比,以及各自的优缺点。我整理了一张表,复习时直接看它。
| 激活函数 | 表达式 | 优点 | 缺点 | 典型场景 |
|---|---|---|---|---|
| Sigmoid | $1/(1+e^{-x})$ | 输出在0到1,可当概率 | 容易梯度消失,输出非零中心 | 二分类输出层 |
| Tanh | $(e^x-e^{-x})/(e^x+e^{-x})$ | 零中心,收敛比sigmoid快 | 仍有梯度消失 | 早期RNN隐藏层 |
| ReLU | $\max(0, x)$ | 计算快,缓解梯度消失 | 负区间死亡神经元 | 现代CNN默认 |
| Leaky ReLU | $\max(\alpha x, x)$ | 解决死亡神经元 | 多了超参数 | 深层网络 |
| GELU | 高斯误差相关 | 平滑,效果好 | 计算稍复杂 | Transformer |
选激活函数的逻辑是这样的:隐藏层优先ReLU系,因为它计算便宜又能缓解梯度消失;输出层看任务,二分类用sigmoid,多分类用softmax,回归直接线性输出不加激活。这里有个坑我提醒一下,ReLU的"死亡神经元"问题——如果某个神经元的输入长期为负,它的梯度一直是0,权重就再也不更新了。解决办法是用Leaky ReLU或者把学习率调小一点。这个点在简答题里出现过,我当时就是靠这句答对的。
3.3 损失函数:任务决定选择
损失函数是优化的目标,选错了模型根本学不对。分类任务最常用交叉熵,回归任务常用均方误差。这里要理解一个容易被忽视的点:交叉熵配softmax,梯度是 $\hat{y} - y$,非常干净;而均方误差配sigmoid,梯度里会带上sigmoid的导数,在输出饱和时梯度会非常小,导致学习缓慢。这就是为什么分类任务几乎不用MSE。
考试里还常考一个变体:多标签分类用什么?答案是binary cross entropy,对每个类别独立做二分类,因为标签之间不互斥。如果是多分类且标签互斥,就用categorical cross entropy。这个区分我在作业里吃过亏,当时用softmax处理多标签,结果预测被强行归一化,几个标签不能同时为高概率。另外还有对比损失、三元组损失这类度量学习里的损失,考试涉及不深,但面试会问,知道它们是为了拉近同类、推远异类就行。
4. 优化算法与训练技巧:模型能不能学会就看这里
有了网络结构,接下来就是怎么把它训好。这部分看着杂,但其实围绕一个核心问题:如何又快又稳地找到损失函数的低点。我把它分成优化器、学习率和正则化三块来记。
4.1 从SGD到Adam:优化器演进的主线
最基础的优化是随机梯度下降,也就是SGD,参数更新公式是 $w \leftarrow w - \eta \nabla L$,其中 $\eta$ 是学习率。SGD的问题是方向震荡、收敛慢,尤其在损失面的"峡谷"地形里会来回横跳。为了解决这个问题,出现了动量法Momentum,它引入一个速度项,把历史梯度累积起来,相当于给下降加了惯性,能平滑震荡。公式是 $v \leftarrow \beta v + \nabla L$,$w \leftarrow w - \eta v$。
再往后是自适应学习率方法。AdaGrad会根据每个参数历史梯度的大小自动调整学习率,梯度大的参数步子小一点,梯度小的参数步子大一点。但它的问题是累积梯度会越来越大,学习率最终衰减到几乎为零。RMSProp用指数移动平均代替累加,解决了这个问题。最后是Adam,它把动量和RMSProp结合起来,同时估计梯度的一阶矩和二阶矩,还加了偏差修正。我整理了一张对比表:
| 优化器 | 核心思想 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| SGD | 直接沿梯度下降 | 简单,泛化有时更好 | 收敛慢,需调学习率 | 图像分类微调 |
| Momentum | 累积动量 | 加速收敛,抑制震荡 | 多一个超参数 | 通用 |
| AdaGrad | 累积梯度平方 | 自适应学习率 | 学习率单调衰减 | 稀疏数据 |
| RMSProp | 梯度平方的滑动平均 | 缓解衰减问题 | 无偏差修正 | RNN常用 |
| Adam | 动量加自适应 | 收敛快,易上手 | 某些任务泛化略差 | 默认首选 |
考试里最爱问的是"Adam为什么需要偏差修正"。答案是:一阶矩和二阶矩初始化为0,训练初期估计会偏向0,除以一个偏小的二阶矩会导致更新步长过大,偏差修正就是在初期把这个偏差纠正过来。这个点我背了好久才想通,其实你只要记住"初期估计偏小,所以修正",就够答题了。
4.2 学习率调度与参数初始化
学习率是深度学习里最重要的超参数,没有之一。太大直接发散,太小收敛慢得让人想砸电脑。常见的学习率调度策略有阶梯衰减、余弦退火、以及带热启动的策略。阶梯衰减就是每隔若干epoch把学习率乘以一个因子,比如0.1。余弦退火让学习率按余弦曲线从大到小平滑下降,训练后期步子越来越小,有助于收敛到更精细的解。
参数初始化同样关键。如果全部初始化为0,那么同一层的所有神经元会输出相同结果,反向传播时梯度也相同,网络退化成线性模型,这叫对称性问题。常用做法是Xavier初始化,它让每一层的输出方差保持一致,适合sigmoid和tanh。对于ReLU,Kaiming初始化更合适,它考虑了ReLU会把一半激活置零。这个知识点考试常以填空或简答出现,你只要记住"不能全零初始化,Xavier配sigmoid,Kaiming配ReLU"就能拿分。
4.3 正则化与批归一化:对抗过拟合的武器
过拟合是训练中绕不过去的敌人,正则化就是对付它的手段。L2正则化在损失里加上权重的平方和,让权重趋向于小,从而降低模型复杂度。L1正则化加的是权重绝对值之和,它有个额外效果:会让部分权重变成0,起到特征选择的作用。这两个的区别考过,记住"L1稀疏、L2平滑"。
Dropout是另一把利器,训练时随机让一部分神经元失活,测试时全部启用但按比例缩放。它的直觉解释是:每次训练都相当于在训练一个不同的子网络,最后相当于集成了很多子网络,从而降低方差。这里有个细节考试爱考:为什么测试时要乘上保留概率?因为要保持训练和测试时的期望输出一致。我当时没理解这句,后来想明白,训练时一个神经元有 $p$ 的概率被保留,那么它的期望输出被缩小了,测试时乘 $p$ 就能对齐。
批归一化BN是对每一层的输入做标准化,让均值接近0、方差接近1,再做一次可学习的缩放和平移。它的好处是加速收敛、允许更大的学习率、还有轻微的正则效果。BN在训练时用当前batch的统计量,测试时用训练阶段累积的滑动平均,这个"训练测试不一致"是高频考点。我之前一直以为测试也用batch统计量,直到做实验发现batch size为1时BN会崩,才真正记住。层归一化LN则是对单个样本的所有特征做归一化,不受batch size影响,所以Transformer里用的是LN而不是BN。
5. 卷积神经网络:视觉任务的看家本领
CNN是我这门课里最感兴趣的部分,也是考点最密集的地方。它的核心思想是局部连接、权值共享和池化,这三个词能解释CNN为什么比全连接网络更适合图像。下面从原理到经典网络,再到代码,一层层拆。
5.1 卷积、池化与感受野:尺寸计算是必考项
卷积操作是用一个卷积核在输入上滑动,每次把对应位置相乘再求和。由于权值共享,一个卷积核只有一组参数,却能在整张图上复用,参数量大大减少。这里最常考的是输出尺寸的计算公式:$H_{out} = (H_{in} - F + 2P)/S + 1$,其中 $F$ 是卷积核大小,$P$ 是padding,$S$ 是步长。这个公式必须背熟并能倒推,比如已知输入和输出求卷积核大小。
举个例子,输入 $32 \times 32$,卷积核 $5 \times 5$,步长1,没有padding,那么输出是 $(32-5)/1+1 = 28$,也就是 $28 \times 28$。如果加了padding 2,输出就变回 $32 \times 32$。考试特别喜欢在这个上面设陷阱,比如问你"stride为2时输出是多少",你只要老老实实代公式就不会错。感受野是另一个高频概念,它指输出特征图上一个点对应输入图上的区域大小。层数越深、卷积核越大、步长越大,感受野就越大。理解感受野是理解为什么深层网络能捕捉全局信息的关键。
池化层用来降维,最常用的是最大池化和平均池化。池化没有可学习参数,它只做下采样,减少计算量的同时也提供了一定的平移不变性。要注意的是,池化会丢失空间信息,所以有些现代网络用步长卷积代替池化。
5.2 经典网络演进:每一步都在解决什么问题
从LeNet到ResNet,CNN的演进就是一部解决"更深网络难训练"问题的历史,考试很爱考这条线。LeNet是最早的卷积网络之一,用于手写数字识别,结构简单:卷积、池化、全连接。AlexNet把它做大,用了ReLU、Dropout和数据增强,在当年的大规模图像比赛上一战成名。VGG的核心贡献是用连续的 $3 \times 3$ 小卷积核堆叠,两个 $3 \times 3$ 卷积的感受野等于一个 $5 \times 5$,但参数更少、非线性更强。
ResNet解决的是退化问题:网络太深时,训练误差反而上升。它的思路是引入残差连接,让网络学习残差 $F(x) = H(x) - x$,而不是直接学 $H(x)$,这样至少能保证恒等映射,深层网络不会比浅层差。这个设计极其重要,现在几乎所有深层网络都用残差连接。我整理一张演进表帮助记忆:
| 网络 | 关键创新 | 解决的问题 |
|---|---|---|
| LeNet | 卷积加池化 | 图像特征提取 |
| AlexNet | ReLU、Dropout、数据增强 | 大规模图像分类 |
| VGG | 小卷积核堆叠 | 参数量与表达力平衡 |
| GoogLeNet | Inception多尺度 | 不同尺度特征融合 |
| ResNet | 残差连接 | 深层网络退化 |
答题时要注意把"创新点"和"解决的问题"对应起来,这是拿分的关键。很多人只记住了结构,却说不出为什么要这么设计,这种答法只能拿到一半分。
5.3 一个最小可运行的CNN实现
光看理论不够,我用PyTorch写一个最小的CNN,考试里如果有代码填空,这个模板基本能套。结构是两层卷积加两层全连接,跑在MNIST上。
import torch import torch.nn as nn class SmallCNN(nn.Module): def __init__(self, num_classes=10): super().__init__() self.features = nn.Sequential( nn.Conv2d(1, 32, kernel_size=3, padding=1), # 28x28 -> 28x28 nn.ReLU(), nn.MaxPool2d(2), # 28x28 -> 14x14 nn.Conv2d(32, 64, kernel_size=3, padding=1), # 14x14 -> 14x14 nn.ReLU(), nn.MaxPool2d(2) # 14x14 -> 7x7 ) self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(64 * 7 * 7, 128), nn.ReLU(), nn.Dropout(0.5), nn.Linear(128, num_classes) ) def forward(self, x): x = self.features(x) return self.classifier(x) model = SmallCNN() criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)这里每一步都有讲究。第一层卷积把单通道变成32通道,padding设为1是为了让输出尺寸不变。两次池化把 $28 \times 28$ 降到 $7 \times 7$,展平后是 $64 \times 7 \times 7 = 3136$ 维。全连接层后面加Dropout是为了防过拟合。损失用交叉熵,因为它自带softmax,所以网络最后不加softmax。这个模板我在作业里改改就能用,考前把它默写一遍很有帮助。
6. 序列模型与注意力:从RNN到Transformer
如果说CNN是处理图像的能手,那处理文本、语音这类序列数据,就要靠RNN和它的进化版。这部分考试重点是LSTM的门控机制和Transformer的自注意力,尤其是后者,现在几乎是必考。
6.1 RNN、LSTM与GRU:解决长期依赖的三种思路
RNN的核心是隐藏状态在时间步之间传递,公式是 $h_t = \sigma(W_h h_{t-1} + W_x x_t + b)$。它的优点是能处理变长序列,缺点是长序列上梯度容易消失或爆炸,导致学不到远距离的依赖。梯度爆炸可以用梯度裁剪解决,梯度消失则要靠门控机制。
LSTM引入了三个门:遗忘门决定丢弃多少旧记忆,输入门决定写入多少新信息,输出门决定输出多少记忆。还有一个细胞状态 $C_t$ 贯穿整条链,它像一条传送带,让梯度能比较顺畅地流动,这就是它缓解梯度消失的关键。GRU是LSTM的简化版,把遗忘门和输入门合并成更新门,还加了个重置门,参数更少、训练更快,效果在很多任务上和LSTM差不多。考试爱让你画出LSTM的结构并解释每个门的作用,这个必须能手画。
我提供一个LSTM在PyTorch里的用法,注意输入维度是(batch, seq_len, input_size),还要初始化隐藏状态:
import torch import torch.nn as nn lstm = nn.LSTM(input_size=128, hidden_size=256, num_layers=2, batch_first=True, bidirectional=True) x = torch.randn(16, 30, 128) # batch=16, seq_len=30, feature=128 output, (hn, cn) = lstm(x) # output: (16, 30, 512) 双向输出拼接 # hn: (4, 16, 256) 每层每方向有个坑我提醒一下:如果设置了batch_first=True,但忘记匹配输入形状,很容易报维度错误。另外双向LSTM的输出维度是hidden_size乘2,接全连接层时别忘了这个细节。
6.2 自注意力与Transformer:一个公式打天下
自注意力的核心公式是 $\text{Attention}(Q, K, V) = \text{softmax}(QK^T / \sqrt{d_k}) V$。这里Q是查询,K是键,V是值。Q和K点积衡量的是"当前位置该关注哪些位置",除以 $\sqrt{d_k}$ 是为了防止点积过大导致softmax梯度消失,这个"为什么除以根号d"是高频考点,一定要会答。
多头注意力就是把Q、K、V分成多组并行计算,最后拼接。它的好处是能让模型在不同子空间关注不同类型的关系,比如一个头关注语法、另一个关注语义。Transformer整体由编码器和解码器构成,编码器里有多头自注意力和前馈网络,加上残差连接和层归一化;解码器多了一个掩码自注意力,防止看到未来信息。位置编码是必须的,因为自注意力本身没有顺序概念,需要显式地告诉模型每个词的位置。
考试里Transformer的题往往出得很细,比如让你写出注意力的计算步骤、解释掩码的作用、或者说明为什么用LayerNorm而不用BatchNorm。答LayerNorm那一问的关键是:文本序列长度不一,BatchNorm对batch维度统计会受padding影响,而LayerNorm对每个样本独立归一化,更稳定。
7. 生成模型与强化学习:选修但别裸考
这部分在不同学校权重不同,我们学院的考法是概念为主、推导为辅。生成模型里重点看自编码器、VAE和GAN,强化学习里重点看基本概念。
7.1 自编码器、VAE与GAN的核心思想
自编码器由编码器和解码器组成,目标是让输出尽量还原输入。它中间的瓶颈层逼着网络学出压缩表示,常用于降维和特征提取。但它的问题是学到的潜在空间不连续,随机采样往往生成不出合理的东西。VAE解决了这个问题,它不直接编码成一个点,而是编码成一个分布,通常是高斯分布的均值和方差,然后从分布里采样再解码。它的损失由两部分组成:重构损失和KL散度,前者保证还原,后者让潜在分布接近标准正态,这样采样才可控。
GAN是另一条路,它由生成器和判别器对抗训练。生成器负责造假,判别器负责识破,两者博弈,最终生成器能造出以假乱真的数据。GAN的训练难点是稳定性,容易出现模式崩塌,也就是生成器只会生成少数几类样本。考试爱考的是GAN的损失函数和训练流程,你要能说清楚"先固定生成器训判别器,再固定判别器训生成器"这个交替过程。这三者的区别建议做成个小表:AE是确定编码、VAE是概率编码加KL、GAN是对抗训练。
7.2 强化学习的基础概念与深度结合
强化学习的五个要素是:智能体、环境、状态、动作、奖励。智能体的目标是最大化累积奖励。马尔可夫决策过程是它的数学框架,核心是状态转移和奖励只依赖当前状态和动作。价值函数衡量某状态或某状态动作对有多好,Q学习是经典的基于价值的算法,它用贝尔曼方程迭代更新Q值。
深度强化学习就是把Q表换成神经网络,DQN是代表,它用了经验回放和目标网络两个技巧来稳定训练。经验回放是把过去的经验存起来随机采样,打破样本之间的相关性;目标网络是单独维护一个更新缓慢的网络来计算目标值,避免目标一直变动导致训练不稳。这两个点是考试和面试的高频问题。策略梯度是另一类方法,直接优化策略,REINFORCE是基础版本,Actor-Critic结合了价值和策略,是现在很多算法的骨架。
8. 常见问题与考场应对:这些坑我都替你踩了
复习到最后,知识都会了,但考场上和实验里还是会出问题。这一节我把遇到的典型问题和排查思路整理出来,考前扫一眼能省不少心。
8.1 训练常见问题速查表
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 损失不下降 | 学习率太小或太大 | 先试1e-3,再上下调整 |
| 损失变成NaN | 学习率过大或梯度爆炸 | 降学习率,加梯度裁剪 |
| 训练好测试差 | 过拟合 | 加正则、Dropout、更多数据 |
| 训练测试都差 | 欠拟合 | 加模型复杂度,检查标签 |
| 准确率卡住 | 学习率太大跳过低点 | 用学习率衰减 |
| BN层报错 | batch size为1 | 换LayerNorm或增大batch |
这张表是我实验里总结的,考试简答题如果问"训练中遇到XX问题怎么排查",按这个思路答基本能覆盖。这里再补一个经验:如果损失突然飙升,第一反应是看学习率,第二反应是看有没有脏数据,这两个覆盖了八成情况。我有个作业就是数据里混了个标签为-1的样本,导致算loss时直接爆炸,找了好久才发现。
8.2 答题技巧与复习收尾
理论题答题有个通用套路:先给定义,再说原理,最后补充优缺点或适用场景。比如问卷积,你先说它是局部连接加权值共享,再说它减少参数、提取局部特征,最后说它适用于图像、通过堆叠扩大感受野。这个三层结构几乎能套所有概念题。
公式题一定要写推导过程,哪怕最后结果错了,过程分也很可观。我期中一道反向传播题结果算错了,但因为步骤清晰、维度标注到位,还是拿到了大部分分。计算题要注意单位和小数点,尤其是卷积输出尺寸这类,很容易算错一位数。最后,考前不要熬夜刷新知识,把速查表和错题看熟,保证会的题不丢分,比多背一个冷门点更划算。
考完这门课我最大的体会是,深度学习看着花哨,内核其实就那么几根支柱:梯度怎么传、参数怎么更新、模型怎么防过拟合、结构怎么设计。你把这几根支柱吃透,剩下的都是它们的排列组合。我复习时最有用的做法不是把书读厚,而是逼自己对着白纸把反向传播和注意力公式默写出来,写不出来的地方就是你真正的薄弱点。这份笔记我后来又拿它去准备保研面试,问到的CNN、Transformer、优化器问题几乎都在里面,算是意外收获。如果你也有类似的复习经历,欢迎把你的坑补充进来,毕竟每个人的盲区都不一样,互相填坑才是最快的进步方式。