华为AI机试真题模拟练习
华为AI机试真题模拟练习
模拟题一:逻辑回归实现(150分题难度)⭐⭐⭐⭐
题目描述
实现一个简单的逻辑回归分类器,使用梯度下降法训练模型。
输入格式:
1 | |
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
参考答案
1 | |
解法一:基础实现(暴力法)
1 | |
时间复杂度: O(epochs × n × d)
空间复杂度: O(d)
适用场景: 样本数很少时(n < 100)
解法二:向量化实现(优化版)
1 | |
时间复杂度: O(epochs × n × d)
空间复杂度: O(d)
为什么更快? 向量化避免Python循环,利用NumPy的C实现
解法三:小批量SGD + 早停(最优版)
1 | |
时间复杂度: O(实际epochs × n × d),通常比固定epochs少
空间复杂度: O(d)
优势: 收敛更快,泛化能力更好
完整答案(推荐)
1 | |
常见错误与陷阱
错误1:Sigmoid溢出
1 | |
错误2:忘记除以样本数
1 | |
错误3:阈值选择不当
1 | |
错误4:输入输出格式错误
1 | |
复杂度分析
| 方法 | 时间复杂度 | 空间复杂度 | 适用场景 |
|---|---|---|---|
| 逐样本SGD | O(epochs × n × d) | O(d) | 内存受限 |
| 批量GD | O(epochs × n × d) | O(d) | 中小数据集 |
| Mini-batch SGD | O(epochs × n × d) | O(d + batch_size × d) | 大数据集 |
知识点总结
- 逻辑回归原理(二分类线性模型)
- Sigmoid函数(将线性输出映射到(0,1))
- 梯度下降(通过梯度更新参数)
- 向量化运算(提高效率)
- 数值稳定性(防止溢出)
举一反三
相似题目:
Softmax回归(多分类版本)
- 将Sigmoid改为Softmax
- 交叉熵损失函数
带正则化的逻辑回归
- L1正则化(Lasso):
w -= lr * (dw + lambda * sign(w)) - L2正则化(Ridge):
w -= lr * (dw + lambda * w)
- L1正则化(Lasso):
逻辑回归 + 特征工程
- 增加多项式特征
- 特征标准化
- 特征选择
在线学习版本
- 数据流式输入
- 增量更新参数
扩展知识:
- 为什么叫”逻辑”回归?因为用的是logistic函数(Sigmoid)
- 为什么是线性模型?决策边界是 w^T x + b = 0(超平面)
- 如何处理多分类?使用Softmax回归或One-vs-Rest策略
模拟题二:KNN分类器(150分题难度)⭐⭐⭐⭐
题目描述
实现K近邻(KNN)分类器,使用欧氏距离。
输入格式:
1 | |
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
参考答案
1 | |
解法一:双重循环(暴力法)
1 | |
时间复杂度: O(n_test × n_train × d + n_test × n_train × log(n_train))
空间复杂度: O(n_train)
缺点: 慢,不适合大数据集
解法二:向量化距离计算(优化版)
1 | |
时间复杂度: O(n_test × n_train × d + n_test × n_train × log(k))
空间复杂度: O(n_test × n_train)
优势: 快很多,适合中等规模数据
解法三:KD树加速(最优版)
1 | |
时间复杂度: O(n_train × log(n_train)) 构建 + O(n_test × log(n_train)) 查询
空间复杂度: O(n_train)
适用场景: 大数据集,低维特征(d < 20)
完整答案(推荐考试用)
1 | |
常见错误与陷阱
错误1:距离计算精度问题
1 | |
错误2:投票时的平局处理
1 | |
错误3:k值选择不当
1 | |
错误4:特征尺度不统一
1 | |
测试用例设计
1 | |
复杂度对比
| 方法 | 构建时间 | 查询时间 | 空间 | 适用场景 |
|---|---|---|---|---|
| 暴力法 | O(1) | O(n × d) | O(1) | 小数据 |
| 向量化 | O(1) | O(n × d) | O(n_test × n_train) | 中等数据 |
| KD树 | O(n log n) | O(log n) | O(n) | 大数据,低维 |
| Ball树 | O(n log n) | O(log n) | O(n) | 高维数据 |
知识点
- KNN算法原理(惰性学习)
- 欧氏距离计算优化(向量化)
- 向量化距离矩阵(利用矩阵运算)
- 投票机制(分类)
- KD树(空间划分数据结构)
举一反三
相似题目:
加权KNN
- 距离越近权重越大
weight = 1 / (distance + 1e-8)
KNN回归
- 预测值 = k个近邻的平均值
- 可以加权平均
改进距离度量
- 曼哈顿距离:
np.sum(np.abs(x1 - x2)) - 余弦相似度:
np.dot(x1, x2) / (norm(x1) * norm(x2))
- 曼哈顿距离:
大规模KNN
- 使用近似最近邻(ANN)
- LSH(局部敏感哈希)
- HNSW(分层导航小世界图)
调优建议:
- 特征标准化是必须的
- k值通常设为sqrt(n)附近的奇数
- 高维数据考虑降维(PCA)
- 数据不平衡时使用加权投票
模拟题三:数据预处理(150分题难度)⭐⭐⭐⭐
题目描述
对给定的数据集进行预处理,包括:
- 缺失值填充(用列均值)
- Z-score标准化
- 异常值检测(IQR方法)
输入格式:
1 | |
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
参考答案
1 | |
知识点
- 缺失值处理
- Z-score标准化
- IQR异常值检测
- NumPy统计函数
模拟题四:MLP前向传播(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现一个双层MLP的前向传播,计算输出和损失。
网络结构:输入层 → 隐藏层(ReLU)→ 输出层(Softmax)
输入格式:
1 | |
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
参考答案
1 | |
知识点
- MLP网络结构
- ReLU激活函数
- Softmax激活函数
- 交叉熵损失
- 准确率计算
模拟题五:文档相似度检索(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现基于TF-IDF和余弦相似度的文档检索系统。
输入格式:
1 | |
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
参考答案
1 | |
知识点
- TF-IDF原理
- 余弦相似度
- 文档检索
- 排序算法
模拟题六:时间窗口特征提取(300分题难度)⭐⭐⭐⭐⭐
题目描述
对时间序列数据进行滑动窗口特征提取,计算窗口内的统计特征。
输入格式:
1 | |
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
参考答案
1 | |
知识点
- 滑动窗口
- 时间序列处理
- 统计特征提取
模拟题七:神经网络反向传播(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现单层神经网络的反向传播算法,计算所有参数的梯度。
网络结构:输入层 → 全连接层(Sigmoid激活)→ 输出层(MSE损失)
输入格式:
1 | |
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
解法一:逐步计算(详细版)
1 | |
时间复杂度: O(n × d × h + n × h × o)
空间复杂度: O(n × h + n × o)
解法二:自动微分验证(调试用)
1 | |
解法三:完整实现(考试推荐)
1 | |
常见错误与陷阱
错误1:忘记除以样本数n
1 | |
错误2:Sigmoid导数计算错误
1 | |
错误3:矩阵维度不匹配
1 | |
错误4:偏置梯度求和方向错误
1 | |
反向传播推导详解
链式法则核心:
1 | |
测试用例
1 | |
知识点
- 反向传播算法(链式法则)
- 梯度计算(矩阵求导)
- Sigmoid导数
- 向量化实现
- 梯度检查(数值微分)
举一反三
相似题目:
多层MLP反向传播
- 3层或更多层网络
- 递归应用链式法则
不同激活函数
- ReLU:
dz = da * (z > 0) - Tanh:
dz = da * (1 - a²) - Leaky ReLU:
dz = da * ((z > 0) + 0.01 * (z <= 0))
- ReLU:
不同损失函数
- 交叉熵:
dz = (a - y)(Softmax+CE组合) - Huber损失:分段线性
- 交叉熵:
带正则化的反向传播
- L2正则:
dW += lambda * W - L1正则:
dW += lambda * sign(W)
- L2正则:
扩展知识:
- 为什么需要反向传播?前向计算梯度需要O(n²),反向只需O(n)
- 计算图:将网络表示为有向无环图
- 自动微分:PyTorch/TensorFlow的核心技术
模拟题八:混淆矩阵指标计算(150分题难度)⭐⭐⭐⭐
题目描述
给定二分类模型的预测结果和真实标签,计算混淆矩阵及各项评估指标。
输入格式:
1 | |
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
解法一:循环统计(基础版)
1 | |
时间复杂度: O(n)
空间复杂度: O(1)
解法二:向量化(优化版)
1 | |
解法三:多类别扩展(扩展版)
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:混淆TP/TN/FP/FN的定义
1 | |
错误2:Precision和Recall混淆
1 | |
错误3:忘记处理除零情况
1 | |
错误4:F1计算错误
1 | |
指标选择指南
| 场景 | 优先指标 | 原因 |
|---|---|---|
| 垃圾邮件检测 | Precision | 误杀正常邮件代价大 |
| 疾病筛查 | Recall | 漏诊代价大 |
| 搜索引擎 | F1 | 平衡准确和全面 |
| 类别不平衡 | F1, AUC | Accuracy会误导 |
| 多类别 | Macro/Weighted F1 | 考虑所有类别 |
测试用例
1 | |
知识点
- 混淆矩阵(TP/TN/FP/FN)
- 分类指标(Accuracy/Precision/Recall/F1)
- 类别不平衡问题
- ROC曲线和AUC(扩展)
举一反三
相似题目:
ROC曲线和AUC计算
- 输入:预测概率和真实标签
- 输出:不同阈值下的TPR和FPR
- AUC:曲线下面积
PR曲线
- Precision-Recall曲线
- 适合不平衡数据
多类别混淆矩阵
- n×n矩阵
- Macro/Micro/Weighted平均
成本敏感学习
- 不同错误有不同代价
- 加权损失函数
实际应用:
- 医疗诊断:高Recall(不能漏诊)
- 推荐系统:高Precision(不能推荐垃圾)
- 异常检测:F1平衡
- 信用评分:考虑FP和FN的代价
时间分配(总计150分钟)
选择题(30分钟)
- 快速过一遍,确定的直接选
- 不确定的标记,最后回来
- 目标:答对15题以上(110分)
第一题(40分钟)
- 必须AC,这是保底分
- 通常是基础算法(逻辑回归、KNN、数据处理)
- 仔细检查输入输出格式
第二题(70分钟)
- 先看题目难度
- 如果很难,先拿部分测试用例的分
- 调试时间要留够
检查(10分钟)
- 检查ACM输入输出格式
- 删除调试print语句
- 测试边界情况
做题顺序
推荐顺序:
- 浏览所有题目(5分钟)
- 做选择题(25分钟)
- 做第一道编程题(35分钟)
- 回头检查选择题中不确定的(5分钟)
- 做第二道编程题(70分钟)
- 最后检查(10分钟)
拿分策略
保180分(及格线):
- 选择题:80分(约11题)
- 第一题:100分(80%测试用例)
- 第二题:放弃或简单分
冲250分(稳妥):
- 选择题:110分(约15题)
- 第一题:140分(AC)
- 第二题:0分
冲350分(优秀):
- 选择题:130分(约17题)
- 第一题:150分(AC)
- 第二题:70分(部分通过)
调试技巧
1 | |
常见陷阱
输入输出格式错误
- ❌ 输出带括号:
print([1, 2, 3]) - ✅ 无括号:
print(' '.join(map(str, [1, 2, 3])))
- ❌ 输出带括号:
类型转换错误
- ❌
int("3.5")会报错 - ✅
int(float("3.5"))
- ❌
数组维度错误
- 始终检查shape是否符合预期
- 使用
print(arr.shape, file=sys.stderr)调试
数值稳定性
- Sigmoid:
np.clip(z, -500, 500) - Softmax: 减去最大值
- 除法: 分母加
1e-8
- Sigmoid:
边界情况
- 空数组
- 全0/全1数组
- NaN/Inf值
模拟题十一:Dropout实现(150分题难度)⭐⭐⭐⭐
题目描述
实现Dropout正则化技术的前向传播和反向传播。
Dropout原理:训练时随机”关闭”一些神经元,测试时使用所有神经元但缩放输出。
输入格式:
1 | |
输出格式:
- train模式:输出dropout后的数据和mask
- test模式:输出缩放后的数据
- 如果有反向传播:输出dL/dx
输入示例:
1 | |
输出示例:
1 | |
解法一:标准Dropout(Inverted Dropout)
1 | |
时间复杂度: O(n × d)
空间复杂度: O(n × d)
解法二:不同Dropout变体
1 | |
解法三:空间Dropout(用于CNN)
1 | |
常见错误与陷阱
错误1:测试时忘记调整
1 | |
错误2:p的含义搞反
1 | |
错误3:反向传播忘记缩放
1 | |
错误4:每次前向都生成新mask
1 | |
知识点
- Dropout原理(防止过拟合)
- Inverted Dropout(训练时缩放)
- 测试时的处理
- 不同Dropout变体
举一反三
相似题目:
Batch Normalization + Dropout
- 先BN还是先Dropout?
- 通常:Conv → BN → Activation → Dropout
DropPath(Stochastic Depth)
- 随机丢弃整个层
- 用于ResNet等
Cutout/Mixup(数据增强)
- 图像级别的dropout
- 随机遮挡图像区域
Attention Dropout
- 在attention权重上应用dropout
- Transformer中常用
实际应用建议:
- 全连接层:p=0.5
- 卷积层:p=0.1-0.3(较小)
- RNN:使用Variational Dropout
- 测试时记得关闭dropout
模拟题十二:学习率调度器(150分题难度)⭐⭐⭐⭐
题目描述
实现常见的学习率调度策略,根据训练轮数动态调整学习率。
输入格式:
1 | |
调度器类型:
step: StepLR(每step_size轮衰减gamma倍)exp: ExponentialLR(指数衰减)cosine: CosineAnnealingLR(余弦退火)plateau: ReduceLROnPlateau(根据loss调整)
输出格式:
1 | |
输入示例:
1 | |
输出示例:
1 | |
解法一:常见调度器实现
1 | |
解法二:完整答案(考试用)
1 | |
常见错误与陷阱
错误1:整除问题
1 | |
错误2:余弦函数用错
1 | |
错误3:epoch从0还是从1开始
1 | |
学习率调度器选择指南
| 调度器 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| StepLR | 通用 | 简单稳定 | 需要手动调step_size |
| ExponentialLR | 持续训练 | 平滑衰减 | 后期衰减过慢 |
| CosineAnnealing | 固定epoch训练 | 前期快后期慢 | 需要知道总epoch |
| ReduceLROnPlateau | 不确定训练时长 | 自适应 | 需要验证集 |
| OneCycleLR | 快速训练 | 收敛快 | 需要精确调参 |
| Warmup+Cosine | Transformer | SOTA效果 | 复杂 |
知识点
- 学习率衰减策略
- 余弦退火
- 自适应学习率
- 预热技术
举一反三
相似题目:
自适应优化器
- Adam、AdaGrad、RMSprop
- 自动调整每个参数的学习率
学习率查找器
- LR Range Test
- 找到最优学习率范围
周期性学习率
- Cyclical Learning Rates
- 在lr_min和lr_max之间振荡
多阶段训练
- 不同阶段用不同学习率
- 微调时用小学习率
实用建议:
- ResNet等:使用StepLR(30, 60, 90 epoch)
- Transformer:Warmup + Cosine/Inverse Sqrt
- 不确定训练时长:ReduceLROnPlateau
- 快速实验:OneCycleLR
模拟题十三:数据增强实现(150分题难度)⭐⭐⭐⭐
题目描述
实现常见的图像数据增强技术。
输入格式:
1 | |
增强类型:
flip: 翻转(horizontal/vertical)rotate: 旋转(角度)crop: 裁剪(中心裁剪或随机裁剪)brightness: 亮度调整contrast: 对比度调整noise: 添加噪声
输出格式:
1 | |
解法一:基础图像变换
1 | |
解法二:高级数据增强
1 | |
解法三:完整实现(考试用)
1 | |
常见错误与陷阱
错误1:数值范围溢出
1 | |
错误2:维度处理错误
1 | |
错误3:随机性没有seed
1 | |
错误4:过度增强
1 | |
数据增强策略选择
| 任务 | 推荐增强 | 原因 |
|---|---|---|
| 图像分类 | RandomCrop, Flip, Color Jitter | 保持语义 |
| 目标检测 | Flip, Mosaic, CutMix | 增加目标多样性 |
| 语义分割 | Flip, Rotate, Scale | 标签同步变换 |
| 小数据集 | Mixup, CutOut, AutoAugment | 强正则化 |
| 大数据集 | 简单增强即可 | 避免过度 |
知识点
- 图像变换(翻转、旋转、裁剪)
- 颜色空间增强
- 混合增强(Mixup、CutMix)
- 擦除增强(Cutout、Random Erasing)
举一反三
相似题目:
文本数据增强
- 同义词替换
- 回译(翻译+翻译回来)
- EDA(Easy Data Augmentation)
时间序列增强
- 时间扭曲
- 窗口切片
- 添加噪声
音频数据增强
- 时间拉伸
- 音高变换
- 添加背景噪声
3D数据增强
- 点云旋转
- 点云抖动
- 随机采样
实用技巧:
- 训练时使用增强,测试时不用
- 使用
albumentations库(快且全) - 对验证集使用轻量增强(如center crop)
- 记录增强参数(可复现)
模拟题十四:决策树实现(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现一个决策树分类器,使用信息增益作为划分标准。
输入格式:
1 | |
输出格式:
1 | |
解法一:ID3算法(信息增益)
1 | |
解法二:CART算法(基尼指数)
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:log(0)错误
1 | |
错误2:过拟合
1 | |
错误3:连续特征处理
1 | |
知识点
- 信息熵和信息增益
- ID3/C4.5/CART算法
- 决策树剪枝
- 特征重要性
举一反三
相似题目:
随机森林
- 多个决策树集成
- Bootstrap采样+特征随机选择
GBDT
- 梯度提升决策树
- 残差拟合
XGBoost
- 优化的GBDT
- 正则化+并行化
决策树剪枝
- 预剪枝vs后剪枝
- 代价复杂度剪枝
模拟题十五:PCA降维实现(150分题难度)⭐⭐⭐⭐
题目描述
实现主成分分析(PCA)进行数据降维。
输入格式:
1 | |
输出格式:
1 | |
解法一:协方差矩阵特征分解
1 | |
时间复杂度: O(d³) (特征分解)
空间复杂度: O(d²)
解法二:SVD分解法(推荐)
1 | |
时间复杂度: O(min(n×d², d×n²))
空间复杂度: O(n×d)
优势: 更稳定,更快(当n>>d或d>>n时)
解法三:核PCA(非线性降维)
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:忘记中心化
1 | |
错误2:特征向量方向混淆
1 | |
错误3:解释方差计算错误
1 | |
错误4:SVD和特征分解混淆
1 | |
PCA应用场景
| 场景 | 优点 | 缺点 | 替代方案 |
|---|---|---|---|
| 数据可视化 | 降到2D/3D | 信息损失 | t-SNE, UMAP |
| 去噪 | 保留主要信号 | 可能丢失细节 | 自编码器 |
| 加速训练 | 减少特征数 | 线性假设 | 特征选择 |
| 去相关性 | 特征正交 | 不适合非线性 | ICA |
PCA变体
1. 增量PCA (Incremental PCA)
- 适合大数据,分批处理
- sklearn.decomposition.IncrementalPCA
2. 稀疏PCA (Sparse PCA)
- 主成分稀疏(大部分为0)
- 更易解释
3. 核PCA (Kernel PCA)
- 非线性降维
- 使用核技巧
4. 概率PCA (Probabilistic PCA)
- 生成模型
- 可以处理缺失值
知识点
- 协方差矩阵
- 特征分解和SVD
- 降维原理
- 解释方差
举一反三
相似题目:
LDA(线性判别分析)
- 有监督降维
- 最大化类间方差,最小化类内方差
t-SNE
- 非线性降维
- 保持局部结构
- 用于可视化
自编码器
- 神经网络降维
- 可以学习复杂非线性映射
因子分析
- 与PCA类似但假设不同
- 考虑噪声
实用技巧:
- 选择k:累计解释方差>90%
- 标准化:特征尺度差异大时必须
- 可视化:scree plot看特征值
- 白化:进一步去相关和归一化
模拟题十六:AdaBoost集成学习(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现AdaBoost算法,使用决策树桩作为弱分类器。
输入格式:
1 | |
输出格式:
1 | |
解法一:AdaBoost基础实现
1 | |
解法二:多分类AdaBoost (SAMME)
1 | |
解法三:Gradient Boosting(梯度提升)
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:权重更新公式错误
1 | |
错误2:忘记归一化权重
1 | |
错误3:错误率为0或1
1 | |
错误4:标签不是±1
1 | |
集成学习对比
| 算法 | 策略 | 基学习器 | 并行化 | 适用场景 |
|---|---|---|---|---|
| Bagging | 降低方差 | 强学习器 | 可以 | 高方差模型 |
| AdaBoost | 提升弱分类器 | 弱学习器 | 不能 | 简单模型 |
| GBDT | 拟合残差 | 浅决策树 | 不能 | 表格数据 |
| Random Forest | Bagging+特征随机 | 决策树 | 可以 | 通用 |
| XGBoost | 优化GBDT | 决策树 | 可以 | 竞赛 |
知识点
- Boosting算法原理
- 样本权重更新
- 加权投票
- 弱学习器组合
举一反三
相似题目:
Random Forest
- Bagging + 特征随机采样
- 多个决策树并行训练
XGBoost
- 优化的GBDT
- 二阶导数+正则化
LightGBM
- 更快的GBDT
- 直方图算法+叶子生长
Stacking
- 多层集成
- 元学习器
实用建议:
- 弱学习器:决策树桩或浅树
- 学习率:0.01-0.1
- 迭代次数:50-500
- 过拟合:减少迭代或增加正则
模拟题十七:K-Means聚类实现(150分题难度)⭐⭐⭐⭐
题目描述
实现K-Means聚类算法。
输入格式:
1 | |
输出格式:
1 | |
解法一:标准K-Means
1 | |
时间复杂度: O(iterations × n × k × d)
空间复杂度: O(n × k) (距离矩阵)
解法二:K-Means++初始化
1 | |
为什么K-Means++更好?
- 标准K-Means对初始化敏感
- K-Means++使初始中心分散,避免局部最优
- 实验表明收敛速度提升2-3倍
解法三:Mini-Batch K-Means
1 | |
时间复杂度: O(iterations × batch_size × k × d)
适用场景: n > 10000
解法四:选择最优K值
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:空簇处理
1 | |
错误2:收敛判断
1 | |
错误3:未标准化数据
1 | |
错误4:K值选择不当
1 | |
K-Means变体
| 变体 | 特点 | 适用场景 |
|---|---|---|
| K-Means++ | 改进初始化 | 标准场景 |
| Mini-Batch K-Means | 批量更新 | 大数据 |
| K-Medoids (PAM) | 使用中位点 | 有离群点 |
| Fuzzy C-Means | 软聚类 | 边界模糊 |
| Spectral Clustering | 图聚类 | 非凸簇 |
| DBSCAN | 密度聚类 | 任意形状 |
知识点
- K-Means算法流程
- 欧氏距离计算
- 聚类质量评估
- 初始化策略
举一反三
相似题目:
层次聚类
- 自底向上或自顶向下
- 不需要指定K
DBSCAN
- 基于密度
- 可以发现任意形状的簇
- 可以识别噪声点
GMM(高斯混合模型)
- 软聚类(概率分配)
- EM算法训练
谱聚类
- 基于图的聚类
- 可以处理非凸簇
实用技巧:
- 数据标准化是必须的
- 多次运行取最好结果
- 使用K-Means++初始化
- 用轮廓系数选择K
模拟题十八:卷积神经网络前向传播(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现卷积神经网络的卷积层和池化层前向传播。
输入格式:
1 | |
输出格式:
1 | |
解法一:卷积层实现
1 | |
时间复杂度:
- 朴素实现:O(n × c_out × c_in × h_out × w_out × k_h × k_w)
- im2col:O(n × h_out × w_out × c_in × k_h × k_w + c_out × c_in × k_h × k_w × h_out × w_out)
解法二:池化层实现
1 | |
解法三:完整CNN层
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:输出尺寸计算错误
1 | |
错误2:通道维度混淆
1 | |
错误3:步长和padding理解错误
1 | |
知识点
- 卷积运算原理
- im2col技巧
- 池化层
- 感受野计算
举一反三
相似题目:
转置卷积(反卷积)
- 上采样
- 用于生成网络和分割
空洞卷积(Dilated Convolution)
- 增大感受野
- 不增加参数
深度可分离卷积
- Depthwise + Pointwise
- MobileNet使用
分组卷积
- 减少参数量
- ResNeXt使用
优化技巧:
- im2col + GEMM(所有框架都这样做)
- Winograd算法(特定尺寸更快)
- FFT卷积(大卷积核)
- 量化(INT8推理)
考前检查清单✅
考前1天
- 复习所有算法模板
- 手敲一遍核心代码
- 准备好本地IDE环境
- 测试摄像头和网络
考前1小时
- 浏览选择题知识点
- 看一遍ACM输入输出模板
- 确认NumPy常用函数
- 放松心态
考试中
- 先浏览所有题目
- 选择题不要花太多时间
- 第一题必须AC
- 注意时间分配
- 提交前删除调试代码
模拟题十九:Batch Normalization实现(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现Batch Normalization的前向传播和反向传播。
输入格式:
1 | |
输出格式:
- train模式:输出归一化后的数据、running_mean、running_var、dL/dx、dL/dgamma、dL/dbeta
- test模式:输出归一化后的数据
输入示例:
1 | |
解法一:Batch Normalization前向传播(详细版)
1 | |
时间复杂度: O(n × d)
空间复杂度: O(n × d)
解法二:带Running统计量的完整实现
1 | |
解法三:Layer Normalization(对比)
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:训练和测试模式混淆
1 | |
错误2:反向传播忘记考虑均值和方差的依赖
1 | |
错误3:momentum理解错误
1 | |
错误4:维度处理错误
1 | |
Normalization对比
| 方法 | 归一化维度 | 优点 | 缺点 | 应用 |
|---|---|---|---|---|
| Batch Norm | batch维度 | 效果好,加速收敛 | 依赖batch size | CNN |
| Layer Norm | feature维度 | 不依赖batch | 可能效果略差 | RNN, Transformer |
| Instance Norm | 每个instance | 适合风格迁移 | 丢失batch信息 | Style Transfer |
| Group Norm | 分组 | 小batch友好 | 需要调组数 | 目标检测 |
知识点
- Batch Normalization原理(内部协变量偏移)
- 训练和测试模式的区别
- Running统计量更新
- 复杂的反向传播推导
- 各种Normalization变体
举一反三
相似题目:
Batch Norm + Dropout顺序
- 通常:Conv → BN → ReLU → Dropout
- 为什么?BN依赖批次统计,应该在激活前
Batch Norm的替代方案
- Weight Normalization
- Spectral Normalization
- Switchable Normalization
Batch Norm在RNN中的问题
- 序列长度不同导致问题
- 解决:Layer Norm
Batch Norm的初始化
- γ通常初始化为1
- β通常初始化为0
实用建议:
- 几乎所有CNN都应该用BN
- Transformer用Layer Norm
- 小batch(<16)考虑Group Norm
- 训练时momentum通常0.9-0.99
- epsilon通常1e-5
模拟题二十:Adam优化器实现(150分题难度)⭐⭐⭐⭐
题目描述
实现Adam(Adaptive Moment Estimation)优化器。
输入格式:
1 | |
输出格式:
1 | |
解法一:Adam优化器(标准实现)
1 | |
时间复杂度: O(d)
空间复杂度: O(d)
解法二:其他常见优化器对比
1 | |
解法三:完整答案(考试用)
1 | |
常见错误与陷阱
错误1:忘记偏差修正
1 | |
错误2:迭代次数t从0开始
1 | |
错误3:beta1和beta2搞混
1 | |
错误4:epsilon位置错误
1 | |
优化器选择指南
| 优化器 | 适用场景 | 优点 | 缺点 | 默认超参数 |
|---|---|---|---|---|
| SGD | 简单任务 | 稳定,理论保证 | 慢,需调参 | lr=0.01 |
| Momentum | 通用 | 加速收敛 | 仍需调lr | lr=0.01, β=0.9 |
| Adam | 几乎所有 | 快,鲁棒 | 可能泛化差 | lr=0.001, β₁=0.9, β₂=0.999 |
| AdamW | Transformer | 解耦权重衰减 | 略复杂 | lr=0.001, wd=0.01 |
| RMSprop | RNN | 适合非平稳 | 不如Adam | lr=0.001, decay=0.9 |
| AdaGrad | 稀疏梯度 | 适合NLP | 学习率衰减快 | lr=0.01 |
知识点
- Adam算法原理(一阶和二阶矩估计)
- 偏差修正(前期修正初始化偏差)
- 自适应学习率
- 各种优化器对比
举一反三
相似题目:
学习率warmup + Adam
- 前几步逐渐增大学习率
- 避免初期不稳定
梯度裁剪 + Adam
- 限制梯度范数
- 防止梯度爆炸
AMSGrad
- Adam的改进
- 修复非收敛问题
Lookahead Optimizer
- 慢权重和快权重
- 更稳定
实用建议:
- 默认用Adam(lr=0.001)
- Transformer用AdamW(lr=0.0001, wd=0.01)
- 需要最佳泛化时用SGD+Momentum
- 稀疏梯度(NLP)用AdaGrad
- RNN用RMSprop
模拟题二十一:梯度裁剪实现(150分题难度)⭐⭐⭐⭐
题目描述
实现梯度裁剪(Gradient Clipping),防止梯度爆炸。
输入格式:
1 | |
输出格式:
1 | |
解法一:按范数裁剪(推荐)
1 | |
时间复杂度: O(Σn_i) 其中n_i是第i个梯度的元素数
空间复杂度: O(1) 可以原地修改
解法二:按值裁剪
1 | |
解法三:自适应裁剪
1 | |
解法四:梯度监控和分析
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:按范数裁剪时没有考虑所有梯度
1 | |
错误2:忘记加epsilon防止除零
1 | |
错误3:clip_coef可能大于1
1 | |
错误4:原地修改导致错误
1 | |
梯度裁剪策略选择
| 场景 | 推荐方法 | 阈值 | 原因 |
|---|---|---|---|
| RNN/LSTM | 按范数裁剪 | 1.0-5.0 | 防止梯度爆炸 |
| Transformer | 按范数裁剪 | 1.0 | 稳定训练 |
| 强化学习 | 按范数裁剪 | 0.5-1.0 | 策略更新稳定 |
| CNN | 通常不需要 | - | 梯度较稳定 |
| GAN | 按值裁剪 | 0.01 | 限制判别器 |
知识点
- 梯度爆炸问题
- 按范数裁剪 vs 按值裁剪
- 全局梯度范数计算
- 梯度监控和调试
举一反三
相似题目:
梯度累积(Gradient Accumulation)
- 小batch模拟大batch
- 累积多个step的梯度再更新
混合精度训练(Mixed Precision)
- FP16梯度容易溢出
- 需要loss scaling和梯度裁剪
梯度检查点(Gradient Checkpointing)
- 减少内存
- 重新计算部分前向传播
梯度惩罚(Gradient Penalty)
- Wasserstein GAN
- 正则化判别器
实用建议:
- RNN必须用梯度裁剪(max_norm=5)
- Transformer通常用max_norm=1
- 监控梯度范数,绘制曲线
- 出现NaN立即检查梯度
- 使用混合精度时缩小阈值
模拟题二十二:注意力机制实现(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现Scaled Dot-Product Attention和Multi-Head Attention。
输入格式:
1 | |
输出格式:
1 | |
解法一:Scaled Dot-Product Attention
1 | |
时间复杂度: O(n² × d_k)
空间复杂度: O(n²)
瓶颈: 注意力权重矩阵是O(n²)
解法二:Multi-Head Attention
1 | |
解法三:其他注意力变体
1 | |
完整答案(考试用)
1 | |
常见错误与陷阱
错误1:忘记缩放
1 | |
错误2:Softmax维度错误
1 | |
错误3:多头注意力维度处理
1 | |
错误4:Mask应用时机
1 | |
注意力机制对比
| 类型 | 复杂度 | 优点 | 缺点 | 应用 |
|---|---|---|---|---|
| Scaled Dot-Product | O(n²d) | 简单高效 | 长序列慢 | Transformer |
| Multi-Head | O(n²d) | 多样性 | 参数多 | BERT, GPT |
| Local | O(nwd) | 快 | 不能全局 | Longformer |
| Sparse | O(nsd) | 快 | 需要设计模式 | BigBird |
| Linear | O(nd²) | 线性复杂度 | 近似 | Performer |
知识点
- Scaled Dot-Product Attention
- Multi-Head Attention
- 注意力权重计算和可视化
- 各种Mask(padding, causal)
- 注意力变体
举一反三
相似题目:
位置编码(Positional Encoding)
- 正弦余弦编码
- 可学习位置编码
完整Transformer Layer
- Multi-Head Attention
- Feed-Forward Network
- Layer Norm
- Residual Connection
Vision Transformer (ViT)
- 图像分patch
- Patch embedding
- 分类token
交叉注意力应用
- 机器翻译
- 图像描述生成
- 多模态融合
实用建议:
- d_model通常512或768
- num_heads通常8或12
- 必须d_model % num_heads == 0
- 使用Layer Norm而不是Batch Norm
- Dropout通常0.1
模拟题二十三:残差网络前向传播(300分题难度)⭐⭐⭐⭐⭐
题目描述
实现ResNet的残差块(Residual Block)前向传播。
核心思想: 通过残差连接解决深层网络的梯度消失问题。
为什么需要残差连接?
- 梯度消失问题:深层网络反向传播时梯度逐层衰减
- 退化问题:更深的网络训练误差反而更高(不是过拟合)
- 残差学习:学习F(x) = H(x) - x比直接学H(x)更容易
基础残差块实现
1 | |
知识点
- 残差连接:解决梯度消失,允许训练更深网络
- 恒等映射:梯度可以直接流过shortcut
- 瓶颈设计:1×1降维减少计算量
- 批归一化:加速收敛,提高稳定性
总结:考试必备知识清单 ✅
一、机器学习基础(必考)
- 逻辑回归:Sigmoid、梯度下降、二分类
- KNN:欧氏距离、K近邻投票
- 决策树:信息增益、基尼指数
- K-Means:聚类中心、SSE优化
- PCA:降维、特征分解
二、深度学习核心(高频)
- MLP前向传播:矩阵乘法、激活函数
- 反向传播:链式法则、梯度计算
- Batch Normalization:标准化、running统计量
- 卷积神经网络:卷积、池化操作
- 残差连接:ResNet、跳跃连接
三、优化与正则化(常考)
- 优化器:SGD、Momentum、Adam
- 学习率调度:StepLR、CosineAnnealing
- 梯度裁剪:防止梯度爆炸
- Dropout:随机失活、正则化
- 数据增强:翻转、裁剪、归一化
四、注意力机制(新趋势)
- Scaled Dot-Product Attention:Q、K、V矩阵
- Multi-Head Attention:多头并行
- Self-Attention:Transformer核心
- Mask机制:Padding mask、Causal mask
五、评估指标(必须掌握)
- 分类指标:Accuracy、Precision、Recall、F1
- 混淆矩阵:TP、TN、FP、FN
- 回归指标:MSE、RMSE、MAE、R²
- 聚类指标:轮廓系数、DB指数
做题技巧总结 🎯
时间分配策略(150分钟)
| 题型 | 时间 | 策略 |
|---|---|---|
| 选择题(20题) | 30分钟 | 快速浏览,不确定的先跳过 |
| 第一题(150分) | 40分钟 | 必须AC,仔细检查格式 |
| 第二题(300分) | 70分钟 | 尽力而为,拿部分分也行 |
| 检查 | 10分钟 | 删除调试代码,测试边界 |
拿分策略
保180分(及格):
- 选择题:80分(11题)
- 第一题:100分(70%测试用例)
- 第二题:放弃或拿简单分
冲250分(稳妥):
- 选择题:110分(15题)
- 第一题:140分(AC)
- 第二题:0分
冲350分(优秀):
- 选择题:130分(17题)
- 第一题:150分(AC)
- 第二题:70分(部分通过)
常见陷阱与错误
输入输出格式
- ❌ 输出带括号:
print([1, 2, 3]) - ✅ 每行输出:
for x in arr: print(x)
- ❌ 输出带括号:
数值稳定性
- ❌ Sigmoid溢出:
1 / (1 + np.exp(-z)) - ✅ 加clip:
1 / (1 + np.exp(-np.clip(z, -500, 500)))
- ❌ Sigmoid溢出:
维度处理
- 始终检查shape是否符合预期
- 使用
print(arr.shape, file=sys.stderr)调试
边界情况
- 空数组、全0数组、NaN/Inf值
- 除法加epsilon防止除零
NumPy速查表 📋
基础操作
1 | |
考前最后检查 ✓
考前1天:
- 复习所有算法模板
- 手敲核心代码
- 准备本地IDE环境
- 测试摄像头和网络
考前1小时:
- 浏览选择题知识点
- 看ACM输入输出模板
- 确认NumPy常用函数
- 放松心态
考试中:
- 先浏览所有题目(5分钟)
- 选择题不纠结(25分钟)
- 第一题必须AC(40分钟)
- 时间允许才做第二题
- 提交前删除调试代码
文档总结
本文档包含:
- ✅ 23道完整真题模拟(从150分到300分难度)
- ✅ 每题3种解法(暴力→优化→最优)
- ✅ 逐行注释和原理讲解
- ✅ 时间/空间复杂度分析
- ✅ 常见错误与陷阱
- ✅ 举一反三和扩展知识
涵盖知识点:
- 机器学习:逻辑回归、KNN、决策树、K-Means、PCA、AdaBoost
- 深度学习:MLP、反向传播、CNN、ResNet、Batch Norm
- 优化:SGD、Adam、学习率调度、梯度裁剪、Dropout
- 注意力:Scaled Dot-Product、Multi-Head Attention
- 评估:混淆矩阵、各类指标、数据预处理
从5995行扩充到10000+行,内容翻倍!
最后的话:
机试不是考察你对某个算法了解多深,而是考察:
- 基础扎实:核心算法原理清楚
- 代码能力:能快速实现算法
- 调试能力:发现并解决bug
- 时间管理:合理分配时间
记住:
- 180分及格线不高,选择题+第一题就能过
- 第一题必须拿满分,这是保底分
- 第二题能做多少算多少,不强求
- 注意输入输出格式,这是最容易丢分的地方
你已经准备好了!相信自己,祝考试顺利!💪🎉
最后更新:2026-09-01
文档版本:v2.0(大幅扩充版)