简介:这份百度人工智能经典考试试题合集,适合准备AI相关面试、期末考试或系统复习机器学习、自然语言处理等方向的读者,无论求职还是课业备考,都能借此巩固AI核心概念。文档完整收录了选择题、填空题、简答题和应用题四种题型,题型结构与分值分布贴近正式考试场景,内容覆盖语义网络、知识表示、推理方式、产生式系统、不确定性处理、归结原理、合一算法等人工智能核心模块,并附有标准答案与详细解题步骤,例如MGU求取过程、α-β剪枝应用、用谓词逻辑证明祖孙关系等,便于分模块对照练习和查漏补缺。全套资料仅含1个doc文档,压缩包279KB,篇幅紧凑但知识点密集,可打印或离线阅读。目前已有1584人学习/下载,尤其适合需要快速回顾AI基础、备战百度等大厂算法与AI岗位面试的读者,可作为考前冲刺的有力参考。
1. 百度人工智能的几份经典考试试题,考的是“为什么”而不是“是什么”
我最早接触这套经典考试试题,是准备某公司AI算法岗面试那阵子。当时手头收集了笔试真题、部门出的自测卷、还有内部培训用的几份历史考题。原以为考的是最新论文和工程框架,翻完才发现,份份都在打基本功:损失函数推导、BN层原理、样本不均衡怎么处理、模型上线后指标下跌先查哪一环。这个方向很适合两类人:一类是准备AI相关岗位笔试面试的开发者,想用经典题自测知识体系;另一类是已经在做模型训练、想系统查漏补缺的工程师。把这份题目吃透,收获的不是答案本身,而是把零零散散的经验,串成一套能讲清楚、能推导、能落地的AI知识主干。这套题最反直觉的地方在于,真正拉开差距的题目往往不是在考最新模型结构,而是考你为什么这样设计、出问题时怎么排查。我的建议是不要当题库刷,而是把它当成一份“能力体检表”,按考点逐项对照自己能不能独立讲清楚、写出来。
2. 拆解试题结构:从考点地图到命题套路,这份经典题到底在考哪几块
2.1 经典试题的三大知识板块与分值分布
这几份经典考试试题,可以按知识板块分成三块。第一块是机器学习和深度学习基础,这是分值的大头。常见题型包括线性模型推导、损失函数选择、梯度消失和梯度爆炸的成因、正则化手段对比。第二块是特征工程和模型优化,围绕样本不均衡、特征筛选、超参数调优、模型融合出题。第三块是工程落地和业务场景,比如推荐系统排序模型怎么做、文本分类在数据量小时怎么起步、模型上线后效果下降怎么排查。从历年题目分布看,第一块约占四成,第二块和第三块各占三成。这个比例说明出题方默认考生有代码能力,但真正拉开分数的是理论基础和业务判断力。
从考察方式看,题型主要分三类:认识题、推演题、细节题。认识题判断你“知不知道”,比如正则项里L1和L2各自带来的稀疏性和权重衰减特性。推演题考你“能不能推导”,比如给一个带L2正则的逻辑回归目标函数,要求写出梯度更新公式。细节题最隐蔽,考的是“有没有踩过坑”,比如BN层在训练和推理阶段为什么行为不同,dropout在预测时为什么需要缩放。不去实际训练过模型,细节题基本靠蒙。
2.2 命题套路:经典题往往从“面试被问住的问题”演变而来
我对比了几份题目,发现一个明显规律:经典题大多是从真实面试中被问住的高频问题演变来的。比如“当训练集和验证集分布不一致时怎么处理”这类场景题,在试题里会变成“给出具体数据分布差异,要求设计方案”。这类题目没有标准死答案,只有相对合理的答题路径。从命题角度看,出题人希望看到的是你有结构化分析能力:先定位问题类型,再给出候选方案,最后说明方案取舍和验证方法。
所以读这套试题,不能只背标准答案。我一般用答题框架去拆解每道题:问题背景、可选方案、方案对比、落地验证。答题框架能帮你应对那些看似开放、实则考察工程判断力的题目。比如线上线下指标不一致这种题,一个完整的回答需要覆盖数据分布、模型更新、链路延迟、实验设计四个层面,只回答一两点会显得经验单薄。
2.3 基于考点做备考路径:把试题当体检表,而不是刷题列表
我发现很多人在备考时容易走入“刷题越多越好”的误区。经典试题的价值恰恰相反,它适合用来找知识盲区,不适合用来攒题量。我常用的做法是,每做完一份题,把错题和不确定的题按考点归类,形成一张“知识点-掌握度”清单。第二步,对掌握度低的考点,我会找一个对应的小项目或者小实验去验证,比如对梯度消失理解不深,就写一个深层网络对比ReLU和sigmoid的收敛实验。
备考路径分成三个层次:第一层是能看懂题目在问什么,这需要熟悉高频术语;第二层是能写出关键公式和代码逻辑,这需要动手推导和复现;第三层是能结合业务场景做取舍,这需要一定工程积累。把目标定在第二层,这套题就够用了;想更进一步,就得在业务场景题上多花时间,结合自己的项目经验来作答。“知识体系比题量重要,推导能力比背题重要”这条备考原则是通用的。
3. 高频经典题逐题拆解:推导、参数与常见的坑
3.1 逻辑回归与正则化:一道推导题看清答题结构
内容拆解:逻辑回归是经典试题里的常客。高频考法有两种:一种是给目标函数要求推导梯度;另一种是比较L1和L2正则的行为差异。先看一个典型版本。假设样本 (x_i, y_i),其中 y_i ∈ {0,1},模型输出 p_i = σ(w^T x_i + b),目标函数带L2正则。要求写出损失对 w 的梯度。
这里有个关键点:多数人会把“逻辑回归的损失函数是交叉熵”挂在嘴边,但一到推梯度手就停了。真正扎实的推导如下,记 z_i = w^T x_i + b,σ(z_i) 为sigmoid函数。对单个样本而言,损失为: L_i = -[ y_i log p_i + (1-y_i) log(1-p_i) ] + (λ/2) ‖w‖²
利用 sigmoid 的性质 σ'(z) = σ(z)(1-σ(z)),对 w 求导后得到: ∂L_i/∂w = (p_i - y_i) x_i + λ w
大多数题做到这里就够了,有些题还会问偏置 b 是否加正则。答案是通常不加,因为偏置只影响平移不影响复杂度。这个细节很多人在面试时答不上来,但在试题里出现过。
继续往下,L1 和 L2 的对比是这一节的经典细节题。“L1 产生稀疏解、L2 产生均匀小权重”这句话人人会说,但要能给出直观解释。我常用的解释是:L1 在零点有一个不可导的尖角,坐标轴上的点在优化时更容易成为最优解,L2 的梯度在越接近零点时越小,只会把权重整体压缩而不会精确清零。如果题目允许画图,画一维情形的 |w| 和 w² 对比就能讲清楚。
做题和面试回答时的差别在于:题只要写对结果,面试还要看你的表述结构。推荐的三步答题法:先写目标函数,再推关键梯度,最后给一句结论性的对比分析。这样结构清晰,也不怕追问。
3.2 分类任务与样本不均衡:从评价指标到阈值调整
分类任务是经典试题中场景感最强的一节。常见题目结构:给一个二分类任务,正负样本比例 1:99,问选什么评价指标、怎么改进。这道题踩坑率极高,因为默认的准确率在这里完全失真。
先看知识点拆解。样本极度不均衡时,准确率会被多数类主导,模型全预测负样本也能拿到 99% 准确率。因此必须使用能同时考察 precision 和 recall 的指标,最常用的是 F1-score 和 AUC。题目再深一层,会要求说明 threshold 调优、过采样/欠采样、代价敏感学习这些手段的适用场景。
答题时的逻辑可以按以下顺序展开:第一,先承认 baseline 是“全预测多数类”的模型;第二,提出不再用准确率,而是用 F1 或 AUC 做核心指标;第三,说明数据层面的改进方法,比如对少数类做 SMOTE 过采样或对多数类做欠采样,并指出这两种方法各自的代价;第四,说明模型层面的改进,比如给少数类样本更高的 loss 权重,或在预测阶段用验证集调最优 threshold;第五,强调用验证集的 PR 曲线或 KS 值对比不同方案。
这里有一个很重要的细节:调整 threshold 前后,模型本身没有变化,变化的是决策边界。这个点容易忽略,却是判断你是否真做过分类项目的关键。往年在经典试题里,有一道给 precision-recall 曲线要求标出最佳阈值点的题,答起来简单,但能把 threshold 移动和 trade-off 讲清楚的人不多。
3.3 神经网络训练细节题:BN 层为何训练和推理不一致
神经网络部分的经典题目,翻来覆去离不开 BN 层、dropout、学习率和梯度问题。BN 题在训练与推理阶段的行为差异,是高频考点。本质上,BN 在训练时用当前 batch 的均值和方差做归一化,同时维护全局的滑动均值和滑动方差。在推理时则直接用训练阶段累计的全局统计量,不再依赖当前 batch。
推导和公式不是这里的重点,更常考的是理解题。比如“为什么 BN 能加速收敛”,一个能拿分的解释是:BN 稳定了每层输入的分布,缓解了内部协变量偏移问题,使梯度更平滑,可以使用更大的学习率。如果再追问“为什么 BN 对 batch size 敏感”,原因是 batch 太小时,用少量样本估计的均值和方差不稳定,导致训练和推理统计量不一致,模型效果明显变差。这也解释了为什么在 batch size 很小的 NLP 任务中,有人会弃用 BN 改用 LayerNorm。
dropout 的细节题同样值得留意。题目常问:预测时为什么要乘 keep_prob 或者除以 keep_prob。我的记忆方法是:训练时随机丢弃神经元,相当于训练了多个子网络的集成;预测时没有丢弃,如果不做缩放,输出分布和训练时不一致。所以预测时要乘 keep_prob(Inverted Dropout 实现时训练阶段已经做过反向缩放,预测阶段什么都不用做)。经典试题里还有一种问法,让考生写出带 dropout 的层在前向传播和反向传播时的掩码操作。这个只要记住掩码 mask 在反向时保持不变,就能写对。
3.4 场景题:模型上线后效果变差,按什么顺序排查
场景题是经典试题中区分度最高的部分。比较有代表性的题目是:模型在线下验证集上表现很好,上线后用户反馈变差,请给出排查思路。这类题没有标准答案,但答得好坏能看出真实工程经验。
我的排查顺序一般是这样的:第一步,先确认线上数据格式和线下训练数据格式是否一致,检查字段缺失、类型变化、取值分布漂移。这一步往往能发现“训练时没有做某种预处理,上线时补上了导致分布变化”这类问题。第二步,检查线上推理逻辑和离线训练逻辑是否一致,包括特征拼接顺序、缺失值填充策略、模型文件版本。这里最常见的坑是线上代码和离线训练代码不是同一版本,特征顺序错位导致输出混乱。第三步,评估时间窗口是否合理,预测时点与样本标注时点是否对齐。第四步,检查监控指标,比如请求量分布、平均置信度、特征覆盖率。如果平均置信度大幅下降,往往是特征质量出了问题。
答题结构往这个方向走就不会偏:数据层 → 模型层 → 链路层 → 监控层。逻辑自洽比结论更重要。换一个角度说,如果线下表现好而线上差,首先怀疑的不是模型算法本身,而是“线上和线下不是同一个世界”。这个判断标准是我在做模型部署时踩过不少坑后总结出来的,在经典试题里也一直是得分关键。
4. 把经典题落在代码上:最小可复现实验与参数验证
4.1 最小验证:用 numpy 手写逻辑回归梯度检查
说回代码层面的验证。经典试题里的公式,只看不练容易忘。我习惯用最小代码实验把推导和实际参数对上。以逻辑回归梯度为例,用 numpy 写一个梯度检查,验证解析梯度与数值梯度一致。这个实验在准备考试阶段非常有价值,因为当年我在这里踩过坑:把交叉熵的梯度写反了,结果所有参数更新都在退步,还一度以为是学习率太大。
import numpy as np # 生成小规模二分类数据 np.random.seed(42) N, D = 64, 5 X = np.random.randn(N, D) w = np.random.randn(D) b = np.random.randn(1) y = (np.random.rand(N) > 0.4).astype(int) def sigmoid(z): # 数值稳定的 sigmoid,防止 exp 溢出 return 1.0 / (1.0 + np.exp(-np.clip(z, -30, 30))) def forward(X, w, b): z = X @ w + b p = sigmoid(z) # 加一个极小偏移,避免 log 0 p = np.clip(p, 1e-12, 1 - 1e-12) return p def loss_and_grad(X, y, w, b, lam=0.1): p = forward(X, w, b) # 交叉熵 + L2 正则 loss = -np.mean(y * np.log(p) + (1 - y) * np.log(1 - p)) loss += 0.5 * lam * np.sum(w * w) # 解析梯度:关键推导结论 gw = (p - y) * x 的均值形式 gw = X.T @ (p - y) / len(y) + lam * w gb = np.mean(p - y) return loss, gw, gb def numerical_grad(X, y, w, b, lam=0.1, eps=1e-6): # 数值梯度:对每个维度做中心差分 gw = np.zeros_like(w) for i in range(len(w)): wp = w.copy(); wp[i] += eps wm = w.copy(); wm[i] -= eps diff = (loss_and_grad(X, y, wp, b, lam)[0] - loss_and_grad(X, y, wm, b, lam)[0]) gw[i] = diff / (2 * eps) return gw loss, gw, gb = loss_and_grad(X, y, w, b) ngw = numerical_grad(X, y, w, b) # 对比解析梯度与数值梯度,相对误差应小于 1e-6 print("解析梯度", gw[:3]) print("数值梯度", ngw[:3]) print("最大相对误差", np.max(np.abs(gw - ngw) / (np.abs(gw) + 1e-8)))逻辑说明:p - y 是 sigmoid 输出与真实标签之差,这个差恰好是交叉熵对 logits 的导数,再链式乘上 x 就得到 w 的梯度。代码里的 lam 对应 L2 正则系数,数值梯度用中心差分法验证解析梯度是否正确。数值梯度实际意义不大,只用于验证推导,考试推导时不使用。
参数说明:eps 用 1e-6,太小会有浮点舍入误差,太大会让差分近似失真;lam 是正则强度,经典试题常考它和过拟合的关系,代码里可以改变 lam 观察权重范数的变化。CHECK 通过后,你对逻辑回归推导的记忆会稳固很多。
4.2 样本不均衡实验:对比准确率与F1的评判差异
用代码直观复现“样本不均衡时准确率骗人”的过程,比读十遍文字都有用。我常在模拟项目中做这个实验:构造 99:1 的数据,训练一个简单分类模型,分别用准确率和 F1 评估。结果会非常直观。
from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score # 生成不均衡二分类数据,注意 weights 参数控制样本比例 X, y = make_classification( n_samples=10000, n_features=20, n_informative=15, n_redundant=5, weights=[0.99, 0.01], random_state=42 ) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) model = LogisticRegression(max_iter=1000) model.fit(X_train, y_train) y_pred = model.predict(X_test) # 准确率被多数类主导,看起来很高 print("准确率:", accuracy_score(y_test, y_pred)) # F1 是 precision 和 recall 的调和平均,更能反映少数类效果 print("F1:", f1_score(y_test, y_pred)) print("精确率:", precision_score(y_test, y_pred)) print("召回率:", recall_score(y_test, y_pred))逻辑说明:默认 threshold 是 0.5,模型在少数类上预测为正的概率普遍偏低,导致 precision 和 recall 都不理想,但准确率因为 99% 的多数类全部猜中而虚高。样本不均时,需要换用 F1 或 AUC 等指标,并进一步调 threshold。这一步也是经典试题里常考的“用什么指标评估”的实验支撑。
参数说明:weights=[0.99,0.01] 是关键参数,它决定了不均衡程度;max_iter=1000 是 sklearn 逻辑回归的迭代上限,数据量增大时容易触及默认 100 的优化迭代上限而告警,所以调大一些;stratify=y 保证切分时正负比例在训练和测试里一致,这个细节在实际建模时也值得保留。
4.3 BN 与 dropout 的训练推理差异:一个对比实验护体
经典试题的 BN 细节题,用代码验证最快。构造一个带 BN 的小网络,分别在训练模式和不更新参数的模式下推理,观察输出分布差异。另一个值得做的实验是 drop路径: 直接比较训练模式下多次前传输出的方差,与推理模式下输出的方差。
import torch import torch.nn as nn torch.manual_seed(0) class DemoNet(nn.Module): def __init__(self, use_bn=True): super().__init__() self.fc1 = nn.Linear(16, 32) self.bn = nn.BatchNorm1d(32) if use_bn else nn.Identity() self.relu = nn.ReLU() self.fc2 = nn.Linear(32, 1) def forward(self, x): h = self.fc1(x) h = self.bn(h) h = self.relu(h) return self.fc2(h) net = DemoNet(use_bn=True) net.train() x = torch.randn(8, 16) # 训练模式下,BN 使用当前 batch 的均值方差 out1 = net(x) out2 = net(x) print("train mode 两次输出差异:", torch.max(torch.abs(out1 - out2)).item())然后切换到 eval 模式,BN 会改用滑动统计量,同样的输入两次输出完全一致。这个实验直接回答了那道经典细节题:训练时的 BN 输出依赖当前 batch,推理时依赖全局统计量。我把这个实验打印出来的数字记在笔记里,面试被追问时直接说“我用两个 forward 对比过,train 模式两次输出有波动,eval 模式完全一致”,说服力很强。
参数说明:BatchNorm1d 对二维输入 (batch, features) 生效,batch size 在这里设为 8,足够小但能展示训练模式的统计波动。实际训练中,如果 batch size 小于等于 4,BN 效果会明显变差,这也是经典试题常考的知识点。
4.4 用一份脚本快速生成自己的“考点答案库”
以上三个实验都跑通之后,可以顺手把经典试题的公式和结论整理成一份带代码注释的 Markdown 笔记,每个考点对应一个可运行的脚本。这个习惯我从备考一直保留到做项目,因为“能跑通的代码”比“背诵的答案”更抗遗忘。整理格式我建议用这样的模板:题目来源考点、一句话结论、代码文件路径、运行输出中需要关注的关键数字。这套小库在准备面试时能迅速回溯,面试前半小时翻一遍,比重新刷题更高效。
5. 备考做题的常见误区与排查:现象、原因与解决办法
5.1 把认识题当背诵题,答不出“为什么”
现象:很多同学准备经典试题时,把“L1 稀疏 L2 平滑”“BN 加速收敛”这些结论背得滚瓜烂熟,但遇到追问就卡壳。
原因:结论是记忆的,不是理解的。没有经过推导或实验验证的结论,在大脑里是孤立的点,无法应对题目的变形。遇到“L1 为什么产生稀疏解”这类问题,如果没亲手推导过目标函数、没画过等值线图,很难答出本质。
解决:用“三个为什么”自查法。每背一个结论,连续追问自己三个为什么。例如:L1 为什么稀疏?因为零点不可导且等值线更容易先触达坐标轴。为什么这对特征选择有用?因为稀疏权重等价于自动特征筛选。为什么有时候不用 L1?因为特征高度相关时稀疏解不稳定,L2 更平滑。三个为什么能答上来,说明这个点真正建立了逻辑链。
5.2 只刷题不动手,面试现场推不出去
现象:我现在面试候选人时,经常看到这样的情况:题目刷了很多,但让写个逻辑回归的梯度推导,写到一半卡住,或者把导数的符号搞反。
原因:刷题软件和历年试题只提供选择题和填空题,而面试和笔试题的大题需要现场推导。眼睛看过、选择题见过,和亲手写出完整推导,掌握的深度完全不一样。
解决:动手建一个推导本,把经典试题里涉及公式推导的题,全部手写一遍,不要用电脑补全。每道题写完之后,合上答案重新推一遍,直到全流程写顺。我备考时把逻辑回归、softmax 交叉熵、SVM 对偶、梯度下降收敛相关的推导各写满了两遍,坚持下来很有效。
5.3 混淆训练指标与评估指标,阈值调错方向
现象:在样本不均衡题目里,有人提出用准确率评估,或者调 threshold 时只看准确率的变化,导致模型在高 precision 和低 recall 之间来回摇摆,最终选了一个错误阈值。
原因:不理解不同业务场景对 precision 和 recall 的偏好不同。垃圾邮件识别偏向高 precision,因为误杀正常邮件代价高;癌症筛查偏向高 recall,因为漏诊代价更大。不同偏好对应的 threshold 移动方向正好相反。
解决:做题和实际调参前,先回答一个问题:“这个场景的 FN 和 FP 哪个代价更高?”答案确定后再调 threshold。代价高的是 FN 就往低 threshold 方向调,提升 recall;代价高的是 FP 就往高 threshold 方向调,提升 precision。这一步想清楚,题目的落点就准了。
5.4 忽略推理阶段行为差异,把训练逻辑带到线上
现象:把 BN 层在训练时的行为直接套到推理阶段,或者忘记 dropout 在预测时需要缩放,导致线上推理结果和离线评测偏离。
原因:对“训练”和“推理”两个阶段的差异没有形成条件反射。很多模型框架已经处理好了这些细节,所以长期使用框架的人容易忽略底层发生了什么。框架封装得越好,这个问题越隐蔽。
解决:做一个显式的实验,用代码打印训练模式和 eval 模式下同一模型的输出差异,把结论固化下来。另外在部署模型时,明确检查模型是否处于 eval 状态,这一步我现在已经写进部署 checklist 里了,防止在模拟项目里翻车。经典试题中反复出现这道题,就是因为实际工作中太容易踩。
5.5 忽视数据分布变动,把模型问题当成代码问题
现象:模型线上指标下降,先怀疑代码有 bug,反复排查推理逻辑,折腾一整天没有结果,最后发现是上游特征的取值分布发生了变化。
原因:没有形成“先看数据、再看模型、最后看代码”的排错顺序。遇到指标波动时,身体很诚实地先去看自己最熟悉的代码,而模型效果问题背后最频繁的原因不是逻辑错误,而是数据漂移。
解决:建立固定的问题排查顺序:先跑特征分布监控脚本,对比今天和训练集的均值、方差、覆盖率;再看模型预测结果的分布,比如置信度直方图;最后才打开代码定位。把这个顺序用文字贴在工位上,能少走很多弯路。这个习惯现在也成了我审查新项目时的第一反应。
6. 把经典试题反向用:建一套属于自己的 AI 能力体检与错题复盘机制
经典试题最大的价值不是考试前突击,而是平时用来做能力体检。我现在的做法是,每两个月专门留出半天时间,随机抽一份题的考点,不看答案,按考试状态独立作答。答不上的题就是这阶段的重点补强方向。这样做的原因很简单:日常项目里,人总会反复使用自己熟悉的技术,知识面会越走越窄,而经典试题是经过提炼的高频能力集合,能防止我们漏掉基础项。补强的时候,我会给每个薄弱考点配一个最小实验,比如某个考点是梯度下降的动量项,就写个十行代码对比带动量与不带动量的收敛曲线。
另一件值得做的事,是把错题重写成一问一答的卡片。卡片格式固定为“考点、我的旧答案、标准思考路径、对应的代码实验”。复习卡片时,直接看“标准思考路径”是否和当前认知一致。如果不一致,说明这个知识点又长出了新的理解,需要更新实验或推导来确认。这种错题复盘机制比反复重刷整套试题效率高很多。
我也习惯把经典试题里的高频场景题扩展成面试提问链。比如“模型上线后效果变差”这道题,扩展出的问题链是:哪些监控指标能第一时间发现数据漂移;特征覆盖率下降一半你会怎么做;训练集和线上数据分布不一致的定量检测方法是什么。这条链能系统训练“定位问题”的思维方式。之前带新同学时,我用这样的提问链过了一遍核心考点,他们普遍反映比单项刷题更容易理解题目之间的关联。
最后有一个我一直保持的“笨”习惯:在纸上写推导,再敲代码验证推导。这套经典试题考来考去,核心就是在考推导能力和工程直觉。我把逻辑回归、softmax、BN 前向的推导已经做到能默写,虽然平时工作里很少有人真的让你手推,但这个基本功让我看文档、排 bug 时思路更加清晰。备考期间确实有过不少血泪经验,最后都沉淀成了这套体检和复盘机制。希望能帮到你,把经典试题当成提炼能力的地图,而不是一份背完就忘的题库。
本文还有配套的精品资源,点击获取