☰
人工智能经典习题集及各章总结:知识漏洞驱动的考前复习
2026/10/31 13:14:56 网站建设 项目流程

简介:这份《人工智能经典习题集及各章总结(期末考试必备)》面向高校人工智能课程学习者和期末备考学生,围绕概念梳理、章节复习与习题训练组织内容。资料以1个doc文档交付,压缩包约2.19MB,将各章小结与典型习题解答集中呈现,便于按章节对照复习。内容覆盖人工智能发展历程、研究内容、三大研究学派与主要研究领域,并延伸到知识表示中的谓词表示、产生式规则、框架表示和语义网络,以及归结演绎推理、自然演绎推理、不确定与非单调推理等核心方法。通过绪论、知识表示、推理等部分的习题解析,读者可对照题目理解求解思路,梳理搜索技术、专家系统、机器学习、神经网络等知识点之间的联系。目前已有101人学习,适合需要系统整理课堂重点、检查概念掌握程度并针对期末考试查漏补缺的学生使用。

1. 习题集不是刷题量:「人工智能经典习题集及各章总结」真正扫描的是知识漏洞

考前两周翻开一本人工智能经典习题集,第一章的名词解释一路顺下去,翻到 EM 那一页突然卡住——这就是最典型的信号:作业做对了,不代表推得动。各章总结的价值也不在「再背一遍」,而在于把散落在监督学习、评估方法、无监督、神经网络、强化学习里的概念压成一张能互相索引的地图,让任何一个知识点都能被三个方向检索到:它解决什么问题、它的假设是什么、它的算法步骤能不能手写出来。这套东西适合三类人:正在准备期末复习的本科生、跨专业补基础的在职开发者、把课程内容当面试材料重新过一遍的工程师。能不能用得起来,取决于你有没有把「看懂了」换成「写得出、跑得通、算得对」这三条硬标准,而不是翻页数量。

2. 拆解各章总结:把六个主线方向对齐到可验证的知识点

各章总结最容易写成目录抄写:把标题抄一遍,配两行定义,合上本子什么也没留下。我在整理这类复习材料时,会强制每一章只填三类内容——定义与假设、算法步骤、可验证的数值结论,并且把这三类内容落到同一张表里。这样做的理由很实际:期末题的失分点几乎全部集中在「假设被悄悄改掉」和「中间量算错」这两处,而不是「没听说过这个名词」。

2.1 每章只保留「定义—假设—算法」三个锚点

先说清楚什么是锚点。以 PCA 为例,定义是「寻找一组正交方向,使数据投影后的方差最大(等价于重构误差最小)」;假设是「方差大的方向承载更多信息,且数据的主要结构是线性的」;算法是「去均值 → 算协方差矩阵 → 特征分解 → 取前 k 个特征向量 → 投影」。这三句话必须能脱稿写出来,而且顺序不能乱,因为考试里让你证明「PCA 的最优投影方向是协方差矩阵的特征向量」时,你依赖的正是定义里那句「方差最大」。

再以逻辑回归为例,定义是「用 sigmoid 把线性打分映射成概率,用交叉熵做极大似然估计」;假设是「对数几率是特征的线性函数」;算法是「初始化 → 前向算概率 → 算梯度 → 更新」。注意这里的假设是可以被出题人动手脚的地方:把对数几率改成二次项,模型就不再是逻辑回归了,但很多人答「还是逻辑回归,只是特征变了」,这就是典型的假设没抓住。

三个锚点里,定义决定你能不能答名词解释,假设决定你能不能答判断题和证明题,算法决定你能不能答计算题和设计题。我一般要求学生每一章至少能默写三个这样的三元组,多写没用,写不熟等于没写。

2.2 一张对齐表:核心概念、高频题型、手推重点、验证点放在同一行

把六个主线方向列成行,每一行填四列。这张表的作用不是背诵,而是自查:哪一行的「验证点」你写不出来,就说明那一章的算法你只是记住了名字。

主线方向核心概念高频题型手推重点代码验证点
概率与数学基础期望、方差、贝叶斯公式、极大似然名词解释、概率计算极大似然求导、共轭先验用采样估计期望,误差随样本量收敛
监督学习基础线性回归、逻辑回归、正则化计算题、损失函数推导正规方程、交叉熵梯度闭式解与梯度下降结果一致
模型评估与选择偏差方差、交叉验证、ROC/AUC简答、指标计算偏差方差分解、AUC 定义手算 AUC 与排序统计量一致
无监督学习K-means、PCA、EM、GMM算法步骤、收敛性说明EM 的 ELBO 推导、K-means 目标迭代中目标函数单调不增
神经网络链式法则、激活函数、softmax反向传播推导、梯度计算softmax 交叉熵梯度数值梯度与解析梯度对齐
强化学习MDP、Bellman 方程、值迭代状态价值计算、策略比较Bellman 最优算子、压缩映射值迭代收敛到不动点

填这张表有个技巧:验证点这一列必须写成「可执行的一句话」,比如「迭代中目标函数单调不增」可以直接变成三行代码去测;如果写成「理解 K-means 的收敛性」,那这一格就是空的。

横向看这张表还能发现一个常见误区:很多人把「模型评估」当成独立的一章去背指标公式,实际上它和后面的每一章都咬合——你在无监督那一章答「用轮廓系数选 k」,在神经网络那一章答「用验证集早停」,本质上是同一套评估思路在两个场景的落地。复习时按行记,答题时才能跨章调用。

2.3 用一段 NumPy 代码把线性回归和 K-means 串起来

表格填完,接下来要让「算法」这一列落地。下面这段代码把两个最基础、也最容易被低估的算法放在一起跑:线性回归用闭式解和梯度下降互相对照,K-means 用来验证目标函数单调下降。它替代不了任何一道题,但能让你在考场上写计算步骤时心里有底。

import numpy as np rng = np.random.default_rng(7) # ---------- 1) 线性回归:闭式解 vs 梯度下降 ---------- n, d = 200, 3 X = rng.normal(size=(n, d)) X = np.c_[np.ones(n), X] # 补一列 1,把截距吸收进权重 w_true = np.array([0.5, 1.2, -0.8, 2.0]) y = X @ w_true + rng.normal(scale=0.1, size=n) w_closed = np.linalg.solve(X.T @ X, X.T @ y) # 正规方程,避免显式求逆 w = np.zeros(d + 1) lr, epochs = 0.05, 2000 # 学习率与迭代轮数,见下方说明 for _ in range(epochs): grad = 2.0 / n * X.T @ (X @ w - y) # 均方误差对 w 的梯度 w -= lr * grad print("闭式解 :", np.round(w_closed, 4)) print("梯度下降 :", np.round(w, 4)) # ---------- 2) K-means:目标函数是否单调不增 ---------- pts = np.r_[rng.normal(0, 1, 50), rng.normal(6, 1, 50)] c = np.array([-1.0, 3.0]) # 故意选偏,观察迭代次数 sse_hist = [] for it in range(20): label = np.argmin((pts[:, None] - c[None, :]) ** 2, axis=1) # 分配步 new_c = np.array([pts[label == k].mean() for k in range(2)]) # 更新步 sse = sum(((pts[label == k] - new_c[k]) ** 2).sum() for k in range(2)) sse_hist.append(sse) if np.allclose(new_c, c, atol=1e-8): break c = new_c print("K-means 中心:", np.round(c, 3), "迭代轮数:", it + 1) print("SSE 序列单调不增:", all(sse_hist[i] >= sse_hist[i + 1] for i in range(len(sse_hist) - 1)))

逻辑说明:第一段用正规方程给出解析最优解,再用批量梯度下降逼近同一个解,两者一致说明你对梯度推导没有写错符号。注意梯度前的系数2.0/n,如果漏掉,学习率需要整体改小,这是计算题里最常见的符号与系数错误。第二段先做「分配」再做「更新」,交替进行,每一步都不会让平方误差和上升,这正是 K-means 收敛性的证明骨架,代码里的sse_hist就是把这个骨架变成可观测的序列。

参数说明:lr=0.05是在特征已标准化、样本量 200 的前提下取的保守值,如果特征量纲差距大,先标准化再调学习率;epochs=2000只是上限,真正的判据是相邻两轮权重变化的范数小于 1e-6。K-means 里初始中心选得偏,迭代轮数会明显变多,这解释了为什么作业题总让你比较不同初始化的结果——它收敛到的是局部最优,不是全局最优。atol=1e-8用来判定中心不再移动,设得太大可能提前退出,设得太小会白跑几轮。

3. 手推公式的复现路径:梯度、期望、KL 散度怎么写代码自证

习题集里丢分最狠的一类题是「推导 + 计算」,因为这两步的验证成本最高:你写了一页纸,却不知道中间哪一步错了。我的做法是,凡是有梯度的公式,一律用数值梯度反查;凡是涉及概率分布的公式,一律用构造的小分布算两遍。

3.1 三个必须手推到底的公式

第一个是极大似然到交叉熵。给定样本与模型输出概率,对数似然取负就是交叉熵,这个等价关系必须能一行行写出来,包括为什么取对数(把连乘变连加,数值上避免下溢)、为什么取负(把最大化转成最小化)。

第二个是 softmax 加交叉熵的梯度。结论很干净:梯度等于「预测概率减去 one-hot 标签」,再乘上输入。但考试要的是过程,你要写出 softmax 的雅可比矩阵,再用链式法则消项。这个推导写不出来,反向传播那一章的计算题基本无从下手。

第三个是 KL 散度与最大似然的关系。最小化 KL 散度等价于最大化似然,其中熵那一项与参数无关,所以训练时只优化交叉熵。很多人背了结论,被问「为什么不用优化熵」时就哑了。

3.2 用中心差分做数值梯度校验:步长、容差和失败判据

数值梯度的中心差分形式是(f(x+h) - f(x-h)) / (2h),误差是 O(h²),比前向差分稳。步长取 1e-5 左右比较合适:太大截断误差抬头,太小浮点相减丢有效位。判据不看绝对误差,看相对误差,|g_num - g_ana| / (|g_num| + |g_ana| + eps)的最大值低于 1e-6 视为通过。

import numpy as np def softmax(z): z = z - z.max(axis=-1, keepdims=True) # 减最大值防 exp 溢出 e = np.exp(z) return e / e.sum(axis=-1, keepdims=True) def ce_loss(W, X, y_idx): p = softmax(X @ W) return -np.log(p[np.arange(len(y_idx)), y_idx] + 1e-12).mean() def numeric_grad(f, x, h=1e-5): g = np.zeros_like(x) it = np.nditer(x, flags=['multi_index']) while not it.finished: i = it.multi_index old = x[i] x[i] = old + h; fp = f(x) x[i] = old - h; fm = f(x) x[i] = old # 复原,避免污染后续维度 g[i] = (fp - fm) / (2 * h) it.iternext() return g def analytic_grad(W, X, y_idx): p = softmax(X @ W) p[np.arange(len(y_idx)), y_idx] -= 1 # softmax - onehot return X.T @ p / len(y_idx) rng = np.random.default_rng(0) X = rng.normal(size=(6, 4)) W = rng.normal(scale=0.1, size=(4, 3)) y_idx = rng.integers(0, 3, size=6) g_num = numeric_grad(lambda w: ce_loss(w, X, y_idx), W.copy()) g_ana = analytic_grad(W, X, y_idx) rel = np.abs(g_num - g_ana) / (np.abs(g_num) + np.abs(g_ana) + 1e-12) print("最大相对误差:", rel.max())

逻辑说明:numeric_grad逐元素扰动权重矩阵,每次只改一个位置、算两次损失、再复原,得到的是同一个函数在这一点上的局部斜率。analytic_grad用的是你手推出来的结论。两者对上,说明推导里的符号、转置、除以样本数都没有问题;对不上,先查转置维度,再查是否漏了1/n,最后查 softmax 是否沿正确的轴归一化。

参数说明:h=1e-5是双精度下的经验值;如果你用单精度或者损失值本身量级很小(比如 1e-8),需要把 h 放大到 1e-3 量级,否则相减会丢精度。scale=0.1初始化权重是为了让 softmax 输出接近均匀分布,梯度量级适中;权重太大会让概率饱和到 0 或 1,数值梯度和解析梯度都接近零,相对误差反而失去意义。这也是一个常被忽略的考点:softmax 在极端输入下梯度消失。

3.3 KL 散度与最大似然:用两个小分布算两遍

KL 散度不对称,这一点必须用数字记住,而不是用「KL 不是距离」这句话记住。取 p = [0.7, 0.2, 0.1],q = [0.5, 0.3, 0.2],分别算 KL(p‖q) 和 KL(q‖p),你会看到前者小于后者。这个差异在变分推断那类题目里会直接决定你写的是「前向 KL」还是「反向 KL」,以及对应的「零强制」和「均值寻找」行为。

import numpy as np p = np.array([0.7, 0.2, 0.1]) q = np.array([0.5, 0.3, 0.2]) kl_pq = np.sum(p * np.log(p / q)) kl_qp = np.sum(q * np.log(q / p)) print("KL(p||q) =", round(kl_pq, 4)) print("KL(q||p) =", round(kl_qp, 4)) print("非负性检查:", kl_pq >= 0 and kl_qp >= 0)

逻辑说明:p * np.log(p / q)逐项展开就是定义式,直接照着公式写,不要图省事写成np.sum(np.log(p/q))/len(p),那是把期望写成了平均,是计算题里非常典型的错误。非负性检查用来看你有没有把方向写反——写反了结果还是正数,但数值会变,和标准答案对不上。

参数说明:两个分布必须归一化且每一项大于零,否则 log 会出现负无穷;工程里一般在分母加一个极小量,考试里则要说明「假设所有取值的概率严格为正」。这也是一个可以主动写进答案的细节,能体现你理解定义域。

4. 五种题型的答题模板:从名词解释到设计题怎么拿步骤分

同一份习题集里的题,分值分布差别很大:名词解释两三分,推导题十分往上,设计题按点给分。用同一套写法应对所有题型,结果通常是简单题写太多、大题写不完。

4.1 名词解释与简答:三句话结构

第一句给定义,用「是什么 + 输入输出」的形式;第二句给作用,说明它解决了什么问题、替代了什么;第三句给边界,说明它在什么条件下失效。以「过拟合」为例:模型在训练集上误差低、在未见数据上误差高;成因是模型容量相对数据量过大;边界是它与「欠拟合」不是程度问题而是方向不同,且在小样本、高维特征场景下更容易出现。三句话写完就停,不要展开例子,例子留给后面的题。

简答题同理,但可以把第三句换成「一个具体的判断依据」,比如「看训练损失与验证损失的差距是否随训练持续扩大」。这句话是阅卷人最想看到的,因为它证明你会用,不只是会背。

4.2 计算题:把中间量写成表格留痕

计算题失分很少是因为不会,而是因为中间量没写。我的习惯是在草稿区先画一张三列表:步骤、公式、数值。以逻辑回归的交叉熵计算为例,第一行写线性打分,第二行写 softmax 或 sigmoid,第三行写损失,第四行写梯度。每一行都保留四位小数,最后统一判对错。

步骤写什么占分点
线性打分z = Wx + b 的具体数值是否写全偏置项
激活sigmoid / softmax 的输入输出是否沿样本维归一化
损失交叉熵定义式代入是否取负、是否平均
梯度预测减标签是否乘输入、是否除样本数

表格的用处是让你在时间紧张时按行检查,而不是从头重算。真正上考场时不必画得这么整齐,但中间量的数值必须留在卷面上。

4.3 推导与证明:从假设写到结论的三段式

第一段写清前提:数据独立同分布、参数空间是什么、优化目标是什么。第二段做变形,每一步只做一件事,取对数、交换求和与期望、配方,写完一步在旁边注明依据。第三段收口:明确写出「因此最优解为……」,不要停在半路让阅卷人猜。

以「最小二乘的闭式解」为例,前提是设计矩阵列满秩;中间对目标函数求导、令梯度为零、移项,得到正规方程;收口时补一句「当 XᵀX 可逆时解唯一」。最后这句是加分项,因为它点出了假设的边界——列不满秩时要用伪逆或者正则化,这个延伸很多人在设计题里还会再用一次。

4.4 设计题:先写评估口径再写模型

设计题最容易写成「我选个神经网络,因为它效果好」。正确顺序是先定义成功标准:用什么指标、在什么数据划分下评估、基线是什么。然后再选模型,并说明为什么这个模型适配数据的结构,比如样本量小、特征稀疏、存在类别不平衡,各自对应不同的处理。

把评估口径写在前面还有一个实际好处:后面模型部分的篇幅可以压缩,因为评分点已经拿到了。反过来,先写模型再补评估,往往时间不够,最后只剩一句「用准确率评估」,在类别不平衡的场景里这一句基本等于自动放弃。

5. 复习翻车排查:五条现象、原因与解决办法

复习过程中出错的方式高度重复,下面五条是我见得最多的。

5.1 公式与推导类的三种翻车

现象一:梯度推导写出来量纲对不上,比如损失是标量,梯度却是个向量加标量。原因多半是链式法则里漏了「对谁求导」的维度关系,把矩阵乘法顺序写反。解决办法是先在纸上标出每个量的形状,前向写一遍形状流,反向对照着写,最后用第 3 章的数值梯度做一次校验。

现象二:概率题里熵和交叉熵混用,算出来数值总是差一截。原因是把「真实分布的熵」当成了常数项,在求导时错误地保留了下来。解决办法是每次写 KL 或交叉熵时,明确标出哪一项与参数无关,无关项直接划掉,不要带着走。

现象三:收敛性证明写成了「迭代会越来越好」。原因是没写出单调性的依据,比如 K-means 的分配步和更新步各自不增。解决办法是背下这两步的证明骨架:固定中心时按最近中心分配必然不增,固定分配时取均值必然不增,两步交替因此整体不增且有下界。

5.2 代码与心态类的两种翻车

现象四:自己写的验证脚本和教材结论不一致,于是怀疑教材。原因通常是随机种子没固定,或者标准化做在了划分数据集之后造成信息泄漏。解决办法是先固定种子,把所有预处理放进流程里,用同一份数据跑两遍确认结果可复现,再谈结论对错。

现象五:复习计划前几天很猛,后几天全在刷已经会的章节。原因是缺少暴露弱点的机制,只按舒服的顺序推进。解决办法是把第 2 章那张对齐表的「验证点」列当成唯一进度条,写不出来的格子才安排时间,写得出来的一律跳过,哪怕它看起来很重要。

6. 考前 72 小时:把习题集压缩成一张可执行的检查表

最后这段时间不该再刷题量,而是做压缩。我一般分三轮,每轮有明确产出物,没有产出物就不算完成。

6.1 三轮压缩法与验收标准

时间窗任务产出物验收标准
72h~48h只回炉做过标记的错题一张错因分类表每道错题能归到「假设、公式、计算、表达」之一
48h~24h白纸默写六个主线方向的核心推导六页手写推导不看资料能在 8 分钟内推完一个
24h~开考过五种题型的答题模板一页纸公式与模板每个模板能说出第一句写什么

第一轮的关键在分类,不在重做。同一类错因出现三次以上,说明它不是粗心,而是概念缺口,这时候才值得回到第 2 章的对齐表去补那一行。第二轮的默写要用空白纸,允许卡住,但卡住之后必须当场推完,不要翻答案再「哦我懂了」,那是最容易骗自己的环节。第三轮只做减法,把一页纸压到半页,压不下去说明你还在靠记忆而不是靠结构。

有个具体技巧:把手写推导拍下来,隔两小时再默写一遍,对比两版的差异位置。差异点往往就是你在考场上会卡住的地方,比任何押题都准。血泪经验是,我曾经把三轮时间全花在第一轮,错题重做了三遍,结果考场上遇到一道需要现场推 softmax 雅可比的题,笔停在那里十分钟——那十分钟本来是可以提前用一次空白纸默写换来的。

现在我自己带人复习,只看一个指标:能不能在没人提示的情况下,把「定义—假设—算法—验证」四件事对同一个知识点讲完整。讲不完整的地方,就是还需要投入的地方;讲得完整的地方,哪怕它出现在目录最显眼的位置,也可以放心跳过。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询