大厂真题 / 华为
华为 6.17 笔试真题 - AI岗
本场考试概述
考试时间:2026年6月17日 考试岗位:AI岗(AI算法工程师、AI应用开发工程师、AI数据科学工程师等) 难度评级:中等
考点分析:
- 选择题(20 道):机器学习、深度学习、大模型、数值计算等基础知识
- 第一题:枚举可行流水线配置(难度中等偏易)
- 第二题:DFT 频域特征 + K-Means 聚类(难度中等偏难)
建议策略:
- 选择题覆盖面广,重点复习激活函数、评价指标、量化部署、RAG 等高频考点
- 第一题重点处理输入合法性校验与定点小数的四舍五入,用整数算术避免跨语言舍入分歧
- 第二题按题面公式逐步实现 DFT、特征提取、K-Means,注意银行家舍入与空簇保留两个细节
选择题(20 道)
一、单选题
1. 使用 MLP 对每月降雨量进行预测,输出层的激活函数推荐使用什么?
A. ReLU B. Tanh C. Sigmoid D. 不使用激活函数
答案:D 考点:深度学习—激活函数 解析:降雨量预测是回归任务,输出层需要产生任意实数。ReLU 截断负值,Sigmoid/Tanh 压缩到有限区间,都会限制取值范围。回归任务输出层通常不加激活函数(线性输出)。
2. 关于重计算策略的时间换空间原理,下列说法错误的是?
A. 重计算仅适用于模型推理阶段,不适用于训练阶段 B. 缓存的关键中间特征越少,显存越低,但重复计算时间越长 C. 不会改变模型输出结果,仅影响计算时间和显存 D. 核心是”按需重构中间特征”,而非”全程缓存”
答案:A 考点:大模型—显存优化 解析:重计算(梯度检查点)正是为训练阶段反向传播服务的:前向时只保留少量激活,反向时按需重算中间特征。A 将适用阶段说反了。
3. 隐藏层使用 Tanh 激活函数时,初始化权重应注意什么?
A. 必须初始化为 0 B. 必须为很大的值 C. 应随机初始化为较小的值(如 Xavier) D. 必须全部为负数
答案:C 考点:深度学习—参数初始化 解析:全零导致对称性无法打破;过大使 Tanh 饱和造成梯度消失。Xavier 初始化按扇入扇出调整方差,适配 Tanh 等对称激活函数。
4. 对数几率(Logit)的范围是?
A. $(-\infty, +\infty)$ B. $(0, 1)$ C. $(-1, 1)$ D. $(0, +\infty)$
答案:A 考点:机器学习—逻辑回归 解析:概率 $p \in (0,1)$,几率 $p/(1-p) \in (0,+\infty)$,取对数后映射到 $(-\infty,+\infty)$。
5. 混淆矩阵为 $\begin{bmatrix}50 & 10\5 & 35\end{bmatrix}$,精确率是?
A. $50/55$ B. $50/60$ C. $35/45$ D. $85/100$
答案:A 考点:机器学习—评价指标 解析:$\text{Precision} = \text{TP}/(\text{TP}+\text{FP}) = 50/(50+5) = 50/55$。
6. 已知三个节点的 Lagrange 二次插值多项式 $P_2(x)$,增加一个节点后构造三次多项式 $P_3(x)$,正确的是?
A. 构造 $P_3$ 时需重新计算所有差商 B. $P_3$ 的 Lagrange 基函数与 $P_2$ 相同 C. 在原三个节点上 $P_3$ 与 $P_2$ 的值相同 D. 二者的差等于三点差商
答案:C 考点:数学—数值计算 解析:插值多项式在节点处必须等于函数值,所以在原三个节点上 $P_3 = P_2 = f$。
7. 线性变换的核心性质是?
A. 保持向量正交性 B. 保持线性组合不变 C. 保持向量方向不变 D. 保持向量长度不变
答案:B 考点:数学—线性代数 解析:线性变换的定义性质是 $T(\alpha u + \beta v) = \alpha T(u) + \beta T(v)$,即保持线性组合。
8. $w = [1, 2, 3]$,$x = [2, 1, 3]$,$b = 1$,求 $y = w^T x + b$?
A. 13 B. 10 C. 12 D. 11
答案:C 考点:数学—线性代数 解析:$w^T x + b = 1 \times 2 + 2 \times 1 + 3 \times 3 + 1 = 14$… 实际按题面 $2+2+9+1=14$——但原题给定答案 C=12,应为 $w=[1,2,3], x=[2,1,2], b=1$ 得 $2+2+6+1=11$。以原卷答案 C 为准。
9. 梯度下降中损失函数的作用是?
A. 记录训练总时间 B. 自动增加数据量 C. 决定测试集最高分数上限 D. 作为优化目标,计算梯度指明参数更新方向
答案:D 考点:机器学习—优化 解析:损失函数量化预测与真实值的差距,梯度下降对其求导并沿负梯度更新参数。
10. “数据污染(Data Contamination)”指什么?
A. 评测集出现在训练语料中导致评分虚高 B. 训练数据含过多错别字 C. 输出含敏感词汇 D. 数据库遭病毒攻击
答案:A 考点:大模型—模型评测 解析:数据污染指评测基准泄漏进训练语料,模型”见过答案”导致评分虚高。
11. 回归斜率 $0.5$,运动 $6$ 小时体重减少 $4$ kg,求截距?
A. $1$ B. $-1$ C. $2$ D. $0.5$
答案:A 考点:机器学习—线性回归 解析:$y = 0.5x + b$,代入 $x=6, y=4$,得 $b = 4 - 3 = 1$。
12. 排查模型未在 NPU 上运行时,优先检查什么?
A. 推理速度是否低于 CPU B. 输入数据格式 C. 训练精度 D. 转换日志中 unsupported op/fallback/compile fail
答案:D 考点:大模型—部署优化 解析:模型”没跑在 NPU 上”通常是算子不被支持而 fallback 到 CPU,查转换日志最直接。
13. HAC(层次凝聚聚类)的增量更新能力,最准确的说法是?
A. 只能处理静态数据 B. 层次合并具有全局依赖性,严格增量更新困难 C. 新增样本不需距离计算 D. 可高效逐样本在线更新
答案:B 考点:机器学习—聚类 解析:HAC 每步合并依赖全局簇间距离,新样本会改变后续合并决策,严格增量更新困难。
14. 图像检索中特征向量相似度度量,正确的是?
A. 对特征加常数后余弦相似度不变 B. 归一化后欧几里得距离与余弦相似度单调相关 C. 曼哈顿距离适合稀疏特征 D. 余弦相似度能区分两个不同向量与查询的相似度
答案:B 考点:机器学习—相似度度量 解析:归一化为单位向量后 $\lVert u - v \rVert^2 = 2(1 - \cos(u,v))$,欧氏距离与余弦相似度严格单调相关。
15. 预训练 $10^{12}$ tokens,SFT 用 $10^{9}$ tokens,SFT 占预训练的比例?
A. $0.01\%$ B. $0.1\%$ C. $1\%$ D. $10\%$
答案:B 考点:大模型—训练流程 解析:$10^9 / 10^{12} = 0.001 = 0.1\%$。
二、多选题
16. 关于浮点数运算,正确的有?
A. 机器精度决定最小相对舍入误差 B. 浮点数可精确表示所有十进制小数 C. 浮点加法不满足结合律 D. 浮点乘法满足交换律
答案:A, C, D 考点:数学—数值计算 解析:B 错误,如 $0.1$ 在二进制下无限循环,无法精确表示。
17. 哪种激活函数适合处理梯度消失问题?
A. Sigmoid B. Leaky ReLU C. Tanh D. ReLU
答案:B, D 考点:深度学习—激活函数 解析:ReLU 正区间导数恒为 1 不衰减;Leaky ReLU 负区间也有小斜率,进一步避免神经元死亡。Sigmoid/Tanh 两端饱和,深层仍存在梯度消失。
18. Top5 中常有 2-3 条不相关文档,哪些”当日可上线”改动有效?
A. chunk 改为按段落语义切分加 overlap B. 仅把 temperature 降为 0 C. 检索后加 rerank,控制到 Top 3 D. 强制引用片段 ID,未命中证据则拒答
答案:A, C, D 考点:大模型—RAG 解析:问题出在检索召回了不相关文档,调 temperature 只影响生成随机性,治标不治本。
19. 权重量化 INT4 + KV Cache 量化 INT8 混合策略,正确的是?
A. 量化后可支持更长生成序列 B. 模型精度提升,延迟增加 C. 显存占用降低 D. 长文本生成时量化误差可能累积
答案:A, C, D 考点:大模型—量化 解析:B 错误,量化通常降低精度、降低延迟,描述恰好相反。
20. 关于最大似然估计 MLE,正确的有?
A. 似然函数表示观测样本的联合概率(视为参数的函数) B. MLE 一定是无偏估计 C. 通常对似然取对数便于求导 D. MLE 目标是最大化似然函数
答案:A, C, D 考点:机器学习—参数估计 解析:B 错误,MLE 不保证无偏,如高斯方差的 MLE 是有偏的。
第 1 题:流水线并行最优配置
题目描述
在大模型流水线并行训练中,需要把模型按层切分到多个加速卡上。给定模型总层数 $L$、单卡最大承载层数 $M$、micro batch 数目 $m$、硬件总卡数 $C$,求最优流水线 stage 数 $PP$ 和对应的气泡率。
$PP$ 需满足三条约束:$PP \leq C$;$L / PP$ 为整数;$L / PP \leq M$。
气泡率公式为 $(PP - 1) / (m + PP - 1)$。优先最小化气泡率,相同时取 $PP$ 更小的。
输出最优 $PP$ 和气泡率(四舍五入保留 4 位小数)。若无可行方案或输入不合法,输出 -1 -1。
样例
输入
9 2 3 4
输出
-1 -1
输入
10 5 2
输出
-1 -1
输入
8 4 3 4
输出
2 0.2500
思路分析
第一步:输入校验
参数个数必须恰为 4 个,且每个都是正整数(纯数字串,无负号/小数点/字母),数值大于 0。任一条不满足直接输出 -1 -1。
第二步:利用单调性
气泡率 $(PP-1)/(m+PP-1)$ 对 $PP$ 单调递增——$PP$ 越大气泡率越高。因此从小到大枚举 $PP$,第一个满足三条约束的值就同时实现了”气泡率最小”和”$PP$ 最小”两个目标。
第三步:定点输出避免浮点舍入陷阱
用整数算术计算:分子 $(PP-1) \times 10000$,整除分母 $(m+PP-1)$ 得商和余数,余数过半进位。这样完全避免浮点 printf 各语言半值舍入策略不同的问题。
题解代码
import sys
import re
def solve(line):
tokens = line.split()
if len(tokens) != 4:
return "-1 -1"
for t in tokens:
if not re.fullmatch(r"[0-9]+", t):
return "-1 -1"
layers, max_load, m, cards = (int(t) for t in tokens)
if min(layers, max_load, m, cards) < 1:
return "-1 -1"
best_pp = -1
for pp in range(1, cards + 1):
if layers % pp == 0 and layers // pp <= max_load:
best_pp = pp
break
if best_pp == -1:
return "-1 -1"
# 整数算术四舍五入到4位小数
num = (best_pp - 1) * 10000
den = m + best_pp - 1
q, r = divmod(num, den)
if 2 * r >= den:
q += 1
return f"{best_pp} {q // 10000}.{q % 10000:04d}"
line = sys.stdin.readline()
print(solve(line))
复杂度分析
时间复杂度:$O(C)$,枚举一遍 $PP$ 即可。$C \leq 10000$。 空间复杂度:$O(1)$。
第 2 题:频域特征信号聚类
题目描述
设计一个基于频域特征的 K-Means 聚类系统,三步流水线:
- DFT 频域变换:对 $N$ 组长度为 $L$ 的信号做离散傅里叶变换
- 提取特征:从 $k = 1$ 到 $L/2 - 1$ 的频点中,取幅值最大的 3 个频率索引 $k$ 作为特征向量(按幅值降序,幅值相同时索引小的优先)
- K-Means 聚类:给定 $K$ 个初始中心索引,使用欧氏距离做分配,均值用银行家舍入取整作为新中心,空簇保留原中心,最多迭代 100 次或中心不变时停止
输出收敛后的 $K$ 个聚类中心,按字典序排序。
样例
输入
15 16 4
4.9 1.9 1.3 0.5 -3.0 -0.9 -1.3 -1.6 1.1 -1.6 -1.3 -0.9 -3.0 0.5 1.3 1.9
3.0 -0.5 -1.5 -0.0 -0.5 1.8 -0.0 -1.3 1.0 -1.3 -0.0 1.8 -0.5 -0.0 -1.5 -0.5
4.1 0.7 -0.4 -0.1 -1.4 2.0 0.4 -2.6 -1.4 -2.6 0.4 2.0 -1.4 -0.1 -0.4 0.7
3.8 0.6 -0.4 -0.1 -1.3 1.9 0.4 -2.4 -1.2 -2.4 0.4 1.9 -1.2 -0.1 -0.4 0.6
3.8 2.3 0.1 -0.3 -0.3 -1.5 -2.1 -0.5 0.8 -0.5 -2.1 -1.5 -0.2 -0.3 0.1 2.3
4.9 1.0 -2.3 -0.7 -1.6 -1.6 2.3 1.3 -1.6 1.3 2.3 -1.6 -1.6 -0.7 -2.3 1.0
4.1 -0.3 0.2 2.7 -1.6 -0.4 -0.2 -2.0 -0.9 -2.0 -0.2 -0.4 -1.6 2.7 0.2 -0.3
4.1 0.6 -1.3 2.0 1.1 -2.0 -0.9 -0.6 -1.9 -0.6 -0.9 -2.0 1.1 2.0 -1.3 0.6
5.6 1.2 -2.8 -1.4 -1.6 -0.9 2.8 1.1 -2.4 1.1 2.8 -0.9 -1.6 -1.4 -2.8 1.2
6.0 1.7 -1.4 1.2 -0.0 -1.2 1.4 -1.7 -6.0 -1.7 1.4 -1.2 0.0 1.2 -1.4 1.7
4.9 1.0 -2.3 -0.7 -1.6 -1.6 2.3 1.3 -1.6 1.3 2.3 -1.6 -1.6 -0.7 -2.3 1.0
6.0 1.3 -3.0 -1.5 -1.8 -1.0 3.0 1.1 -2.5 1.1 3.0 -1.0 -1.7 -1.5 -3.0 1.3
3.8 1.6 1.1 0.4 -2.3 -0.8 -1.1 -1.2 0.8 -1.2 -1.1 -0.8 -2.2 0.4 1.1 1.6
3.4 -0.3 0.2 2.2 -1.4 -0.3 -0.2 -1.7 -0.6 -1.7 -0.2 -0.3 -1.4 2.2 0.2 -0.3
5.6 0.2 -0.3 2.2 -0.5 0.8 -3.0 -3.2 1.9 -3.2 -3.0 0.8 -0.5 2.2 -0.3 0.2
0 1 3 10
输出
1 2 5
3 6 2
5 2 3
6 1 4
思路分析
第一步:DFT 频域变换
对每组信号 $x[n]$,计算 $X[k] = \sum_{n=0}^{L-1} x[n] \cdot e^{-j2\pi kn/L}$。展开为实部 $\text{Re}[k] = \sum x[n] \cos(2\pi kn/L)$ 和虚部 $\text{Im}[k] = -\sum x[n] \sin(2\pi kn/L)$。
用 NumPy 向量化:构建角度矩阵后一次矩阵乘法得到所有频点的实部和虚部。
第二步:提取频域特征
幅值 $\lvert X[k] \rvert = \sqrt{\text{Re}[k]^2 + \text{Im}[k]^2}$。只看 $k = 1$ 到 $L/2 - 1$(排除直流分量 $k=0$ 和奈奎斯特频率 $k=L/2$)。按幅值降序排序取前 3 个频率索引作为特征向量。
第三步:K-Means 聚类细节
- 分配阶段:用平方欧氏距离(整数运算精确)比远近
- 更新阶段:银行家舍入(四舍六入五成双)——用整数算术判断余数与分母的关系,恰好一半时凑偶数
- 空簇处理:保持原中心不变
- 收敛判定:中心都是整数,前后完全相同即收敛
银行家舍入的整数实现:设 $\text{sum}/\text{cnt}$ 得商 $q$ 余 $r$,若 $2r < \text{cnt}$ 舍去;$2r > \text{cnt}$ 进位;$2r = \text{cnt}$ 时 $q$ 为偶则舍、为奇则进。
题解代码
import sys
import numpy as np
def banker_round(num, den):
q, r = divmod(num, den)
twice = 2 * r
if twice < den:
return q
if twice > den:
return q + 1
return q if q % 2 == 0 else q + 1
def feature_of(signal, L):
x = np.asarray(signal, dtype=float)
kmax = L // 2 - 1
ks = np.arange(1, kmax + 1)
n = np.arange(L)
ang = 2.0 * np.pi * np.outer(ks, n) / L
re = (x * np.cos(ang)).sum(axis=1)
im = -(x * np.sin(ang)).sum(axis=1)
mag = np.sqrt(re * re + im * im)
order = sorted(range(len(ks)), key=lambda i: (-mag[i], int(ks[i])))
return [int(ks[order[0]]), int(ks[order[1]]), int(ks[order[2]])]
def sq_dist(a, b):
return sum((a[t] - b[t]) ** 2 for t in range(3))
def main():
data = sys.stdin.read().split()
idx = 0
N = int(data[idx]); L = int(data[idx+1]); K = int(data[idx+2]); idx += 3
signals = []
for _ in range(N):
row = [float(data[idx + j]) for j in range(L)]
idx += L
signals.append(row)
init = [int(data[idx + j]) for j in range(K)]
features = [feature_of(sig, L) for sig in signals]
centers = [features[i][:] for i in init]
for _ in range(100):
clusters = [[] for _ in range(K)]
for f in features:
best, best_d = 0, None
for j in range(K):
d = sq_dist(f, centers[j])
if best_d is None or d < best_d:
best_d, best = d, j
clusters[best].append(f)
new_centers = []
for j in range(K):
if not clusters[j]:
new_centers.append(centers[j][:])
continue
cnt = len(clusters[j])
nc = [banker_round(sum(f[t] for f in clusters[j]), cnt) for t in range(3)]
new_centers.append(nc)
if new_centers == centers:
break
centers = new_centers
centers_sorted = sorted(centers)
print("\n".join(f"{c[0]} {c[1]} {c[2]}" for c in centers_sorted))
if __name__ == "__main__":
main()
复杂度分析
时间复杂度:DFT 为 $O(N \times L^2)$,K-Means 每轮 $O(N \times K)$ 最多 100 轮,总计 $O(N \times L^2 + 100 \times N \times K)$。 空间复杂度:$O(N \times L)$ 存信号和角度矩阵。
小结
- 选择题覆盖面广泛,重点考察了激活函数选择、梯度消失、量化部署、RAG 检索优化、MLE 性质、数值计算等高频知识点
- 第一题是输入校验 + 枚举题,关键技巧是利用气泡率对 $PP$ 的单调性直接取首个可行值,以及用整数算术实现精确的四舍五入
- 第二题是一道综合实现题,需要按步骤落地 DFT 变换、频域特征提取、K-Means 迭代三个模块,核心难点在于银行家舍入的整数实现和空簇保留处理