大厂真题 / 华为
华为 5.27 笔试真题 - AI岗
本场考试概述
考试时间:2026年5月27日 考试岗位:华为暑期实习 AI 岗(AI算法、AI应用开发、AI数据科学等) 难度评级:中等偏上
考点分析:
- 选择题(20道):大模型工程(ZeRO 通信算子、SmoothQuant 量化、FP8 梯度缩放、TP/PP/DP 拓扑映射、ReAct Agent、混合检索 RAG)、深度学习(Swish 激活、空洞卷积、RNN、分类损失)、数学(3σ 法则、协方差与独立性、相关系数、对称矩阵特征值、Runge 现象)、机器学习(特征工程、DBSCAN、偏差方差)
- 第一题:大模型流水线并行训练优化(难度中等偏上,二分答案 + 贪心 check)
- 第二题:流式日志 Top-K 高频统计(难度困难,滑动窗口 + 哈希计数 + 惰性堆)
建议策略:
- AI 岗选择题分数权重大(单选 15×6 + 多选 5×12 = 150 分),先把选择题刷透再啃编程题;本场多选集中在 SmoothQuant、DBSCAN、ReAct、混合检索 RAG、分类损失
- 第一题识别”最小化最大值”立刻上二分答案,check 函数做贪心拼段;注意提前判三种结构性无解
- 第二题朴素做法(每次 get 全量排序)极易 TLE,必须惰性堆 + 时间戳:词频每变化一次给该词的 stamp +1,堆里残留的旧条目靠 stamp 比对鉴别为过期直接丢弃
选择题(20道)
第1题
Swish 激活函数定义为 $f(x) = x \cdot \sigma(x)$。相比于 ReLU,Swish 的主要特点是?
A. 它是非单调的 B. 它是完全非负的 C. 它的计算成本比 ReLU 低得多 D. 它在负区间有平滑的曲线,可能保留更多信息
答案:D
考点:深度学习——激活函数
ReLU 在 $x < 0$ 时硬截断为 0,会导致 Dead ReLU 问题并丢失负区间梯度;Swish 在 $x < 0$ 时输出一个平滑的小负值,梯度全程连续,有助于保留信息和缓解神经元死亡。A 也属于 Swish 的特性但不是与 ReLU 对比时最被强调的实用优势;B 错,Swish 在负区间可取负值;C 错,Swish 需多算一次 sigmoid,计算更贵。
第2题
在使用 ZeRO1 优化的数据并行中,每个 GPU 计算完局部梯度后,通过哪两个基础通信算子实现梯度的聚合和分片?
A. All-Gather 和 Broadcast B. Broadcast 和 Reduce C. Scatter 和 All-Reduce D. Reduce-Scatter 和 All-Gather
答案:D
考点:大模型——分布式训练
ZeRO1 把优化器状态切片到各 GPU。反向后用 Reduce-Scatter 把全局梯度求和并按分片切给对应卡,更新完参数后再用 All-Gather 把各分片的最新参数收集到所有 GPU。All-Reduce = Reduce-Scatter + All-Gather,ZeRO 正是把这一对算子拆开搭配显存切片。
第3题
在表格数据处理中,若某列包含连续数值,另一列包含类别标签(如”男/女”),为了输入神经网络,通常的做法是?
A. 全部归一化为 0 到 1 之间 B. 连续数值归一化,类别标签 One-Hot 编码 C. 全部转换为字符串 D. 连续数值 One-Hot 编码,类别标签归一化
答案:B
考点:机器学习——特征工程
连续特征做归一化让量纲统一;类别标签是离散的,直接归一化会引入伪序关系,必须 One-Hot 展开成独立的指示位。
第4题
对大模型权重或激活值进行 INT8/FP8 量化时,通常假设数据近似正态分布。若设截断阈值 $\alpha = 3\sigma$,这种”3σ 截断法则”会导致大约多少比例的原始数据产生截断失真?
A. 约 5% B. 约 1% C. 约 0.1% D. 约 0.3%
答案:D
考点:数学——概率论
正态分布 3σ 法则:$P(\lvert X - \mu \rvert \leq 3\sigma) \approx 99.73\%$,所以落在区间外的比例约为 0.27%,最接近 0.3%。
第5题
构建线性回归模型时,发现训练误差很小但测试误差很大,最可能的原因是?
A. 欠拟合 B. 过拟合 C. 数据量不足 D. 特征太少
答案:B
考点:机器学习——偏差方差
训练集表现好、测试集表现差是过拟合的标准定义——模型记住了训练数据的噪声而非泛化规律。
第6题
对于任意两个随机变量 $X$ 和 $Y$,下列关于协方差与独立性的命题中,正确的一项是:
A. 若 $D(X+Y) = D(X) + D(Y)$,则 $X$ 和 $Y$ 一定不相关 B. 若协方差为 0(不相关),则一定相互独立 C. 若相互独立,则协方差可能不为 0 D. 若服从二维正态分布且不相关,则不一定相互独立
答案:A
考点:数学——概率论
$D(X+Y) = D(X) + D(Y) + 2\text{Cov}(X,Y)$,方差等式成立等价于 $\text{Cov}(X,Y)=0$,即不相关,A 正确。B 反例:$X$ 均匀分布,$Y=X^2$,协方差为 0 但显然不独立。C 错,独立必不相关。D 错,二维正态下不相关与独立等价。
第7题
已知 $\vec{a}=(1,2)$,$\vec{b}=(3,1)$,$\vec{c}=(2,3)$,计算 $\vec{d}=\vec{a}-\vec{b}+\vec{c}$,则 $\vec{d}$ 的值为:
A. $(0, 4)$ B. $(2, 0)$ C. $(4, 2)$ D. $(0, 2)$
答案:A
考点:数学——线性代数
分量运算:第一维 $1-3+2=0$,第二维 $2-1+3=4$,所以 $\vec{d}=(0,4)$。
第8题
已知对称矩阵 $A = \begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix}$,求解特征值和特征向量。
A. $\lambda_1=1$,$v_1=(1,-1)$;$\lambda_2=3$,$v_2=(1,1)$ B. $\lambda_1=3$,$v_1=(1,-1)$;$\lambda_2=1$,$v_2=(1,1)$ C. $\lambda_1=1$,$v_1=(1,-1)$;$\lambda_2=3$,$v_2=(1,1)$ D. $\lambda_1=2$,$v_1=(1,0)$;$\lambda_2=2$,$v_2=(0,1)$
答案:C
考点:数学——线性代数
特征多项式 $(2-\lambda)^2-1=0$,解得 $\lambda=1$ 或 $\lambda=3$。代入 $\lambda=1$ 得 $v=(1,-1)$;代入 $\lambda=3$ 得 $v=(1,1)$。
第9题
循环神经网络(RNN)适合处理哪种类型的数据?
A. 图数据 B. 图像 C. 表格数据 D. 序列数据
答案:D
考点:深度学习——RNN
RNN 的隐状态按时间步递推,天然适配有顺序依赖的序列数据(文本、语音、时间序列)。图数据用 GNN,图像用 CNN,表格用 MLP/GBDT。
第10题
处理包含较多异常值的数据集,且准备使用对距离敏感的算法(如 SVM/KNN),下列哪种特征缩放方法最具鲁棒性?
A. Standardization(标准化) B. RobustScaler(中位数 + IQR 缩放) C. Min-Max Scaling(归一化) D. Log Transformation(对数变换)
答案:B
考点:机器学习——特征工程
RobustScaler 用中位数代替均值、用 IQR 代替标准差,这两个统计量都是顺序统计量,不会被极端离群值拉偏。Standardization 的均值和方差对异常值极其敏感;Min-Max 受极值定义直接被异常值主导。
第11题
模型用 FP8 训练,工程上常见的数值稳定化操作是:
A. 梯度缩放 B. 去掉 dropout C. 使用更小的 batch size D. 增大学习率并减少权重衰减
答案:A
考点:大模型——混合精度
FP8 动态范围远小于 FP32,小梯度容易下溢为零。Loss/梯度缩放把梯度推到 FP8 可表示范围内,反传后再缩回,是 FP16/FP8 混合精度训练的标配。
第12题
空洞卷积(Dilated Convolution)的作用是:
A. 增加感受野而不增加参数 B. 提高特征图分辨率 C. 以上都不对 D. 减少计算量
答案:A
考点:深度学习——CNN
空洞卷积在卷积核相邻采样点之间插入空洞(dilation rate $d$),$k \times k$ 核的等效感受野变成 $(k + (k-1)(d-1))^2$,但权重数仍是 $k^2$。
第13题
单机 8 卡 NVLink 高带宽互联,跨节点 IB 延迟较高。为最小化通信瓶颈,最合理的物理拓扑映射策略是?
A. 所有并行策略随机分配,依赖 NCCL 自动路由 B. PP 放单机内,TP 跨节点 C. DP 放单机内,TP 和 PP 跨节点 D. TP 放单机内,PP 和 DP 跨节点
答案:D
考点:大模型——分布式训练
通信量从大到小:TP > DP > PP。TP 每层都要 All-Reduce 激活/梯度,频次最高且数据量大,必须放最快的 NVLink;PP 只在层边界传递激活,通信稀疏,跨节点 IB 即可。B/C 把 TP 放到 IB 上会直接拖垮训练吞吐。
第14题
如果 $D(X)=1$,$D(Y)=4$,$\text{Cov}(X,Y)=2$,则 $X$ 和 $Y$ 的相关系数是?
A. 0.5 B. 0.25 C. 1 D. 2
答案:C
考点:数学——概率论
相关系数 $\rho = \frac{\text{Cov}(X,Y)}{\sqrt{D(X)}\sqrt{D(Y)}} = \frac{2}{1 \times 2} = 1$,说明完全正线性相关。
第15题
对于函数 $f(x)=\frac{1}{1+25x^2}$,在区间 $[-1,1]$ 上取等距节点进行高次插值,当节点数增大时会出现什么现象?
A. 插值多项式趋于直线 B. 收敛到 $f(x)$ C. 振荡加剧,误差变大 D. 插值多项式趋于零
答案:C
考点:数学——数值分析
经典的 Runge 现象:等距节点高次插值在区间端点附近出现剧烈振荡,节点数越多振幅越大。规避方法是改用 Chebyshev 节点或分段低次插值。
第16题(多选)
SmoothQuant 引入逐通道缩放 $\text{diag}(s)$ 做变换 $Y = (X \cdot \text{diag}(s)^{-1}) \cdot (\text{diag}(s) \cdot W)$,下列哪些说法正确:
A. 若原始 $X$ 的某通道存在离群值,选择 $s$ 为该通道的范数可将其压缩至 1 附近,降低激活量化难度 B. 变换后权重行范数会随 $s$ 同比增大,需在”激活易量化”与”权重量化”之间寻找平衡 C. 该变换只能用于全连接层,无法应用于注意力投影 D. 该变换在浮点精度下与原始计算完全一致,不存在任何近似误差
答案:A, B
考点:大模型——量化
A 正确,SmoothQuant 核心思路是把激活的离群值”借”到权重上。B 正确,权重被放大后量化误差上升,需要 $\alpha$ 因子平衡。C 错,注意力投影本身就是线性层,完全满足条件。D 错,虽然代数等价,但实际浮点乘除有舍入误差,且 SmoothQuant 目的就是为后续量化服务。
第17题(多选)
某电商平台用 DBSCAN 对高维用户行为聚类以识别异常用户,使用 DBSCAN 的原因包括:
A. 能够自动将异常用户标记为噪声点 B. 不需要预先指定簇的数量 C. 在高维数据中表现优异,不受维度灾难影响 D. 能够发现任意形状的簇
答案:A, B, D
考点:机器学习——聚类
A 正确,DBSCAN 把密度不足的样本标为噪声,天然适合异常检测。B 正确,相对 K-Means 无需预设 $K$。D 正确,基于密度连通性可识别非凸簇。C 错,高维空间下点间距离趋于均匀(维度灾难),密度概念退化。
第18题(多选)
ReAct 架构在现代 AI Agent 系统中被广泛应用,以下正确的有:
A. ReAct 循环可能陷入死循环,需要设计终止条件 B. 通过显式的 Thought 步骤增强了模型的可解释性 C. Observation 可以来自外部工具调用结果、搜索引擎返回、API 响应等多种来源 D. Agent 的行动选择完全依赖预训练的模式,不需要工具调用
答案:A, B, C
考点:大模型——Agent
A 正确,工程实现里必须设 max_steps、超时等熔断机制。B 正确,Thought 明文输出了推理链。C 正确,Observation 可承接任意外部信号。D 错,ReAct 的核心定义就是 Thought → Action → Observation 循环,其中 Action 一般就是工具调用。
第19题(多选)
在混合检索(BM25 + 向量相似度)的 RAG 系统中,下列说法正确的有:
A. Embedding 归一化会影响余弦相似度与点积的等价性,混合检索需统一 B. Tokenizer 若兼容向量模型与 BM25 的分词规则,可以减少词频统计错位 C. 对专业术语,若 BM25 权重过高,会压制向量的语义匹配能力 D. 重排模型若与 Embedding 模型共享参数,更有利于端到端优化 E. 文档切分策略只影响向量检索,不影响 BM25 效果
答案:A, B, C
考点:大模型——RAG
A 正确,向量 L2 归一化后余弦与点积等价,混合检索的分数融合依赖度量一致。B 正确,对齐分词能减少两侧统计口径错位。C 正确,高 IDF 术语权重过高会让 BM25 主导排序。D 错,cross-encoder 和 bi-encoder 架构不同,共享参数会损失各自优势。E 错,BM25 同样依赖文档长度归一化。
第20题(多选)
下列哪些损失函数常用于分类问题?
A. 交叉熵损失 B. 均方误差 C. 平均绝对误差 D. 焦点损失
答案:A, D
考点:深度学习——损失函数
交叉熵是分类标配。Focal Loss 是 RetinaNet 提出的分类损失,专门解决类别不平衡。MSE 和 MAE 是回归损失。
第一题:大模型流水线并行训练优化
题目描述
将一个包含 $N$ 层的神经网络按顺序切分并部署到 $K$ 个 NPU 上(每个 NPU 至少分配 1 层)。第 $i$ 层的计算耗时为 $C_i$,显存需求为 $W_i$,每个 NPU 的显存上限为 $M$。
同一个 NPU 上的层必须在原始顺序中连续。一个阶段的计算耗时等于其所有层耗时之和,所需显存等于其所有层显存之和。
在保证不发生 OOM(任意阶段显存总和不超过 $M$)的前提下,找到一种切分方案使所有 NPU 中最大的计算耗时尽可能小。输出这个最小的”最大计算耗时”。若无解输出 $-1$。
输入描述
第一行三个正整数 $N, K, M$。第二行 $N$ 个正整数为 $C$ 数组。第三行 $N$ 个正整数为 $W$ 数组。
输出描述
一个整数。
样例
输入
5 3 20
5 1 2 3 4
10 5 5 5 10
输出
6
最佳切分:[层1, 层2] → NPU1(耗时 6,显存 15);[层3, 层4] → NPU2(耗时 5,显存 10);[层5] → NPU3(耗时 4,显存 10)。最大耗时为 6。
思路分析
第一步:识别”最小化最大值”模式
“使得所有 NPU 中最大的计算耗时尽可能小”是经典的二分答案信号。假设答案为 $T$,即每段耗时不超过 $T$,检验在 $T$ 和显存双约束下能否把 $N$ 层切成不超过 $K$ 段。$T$ 越大越容易切,具有单调性。
第二步:二分的上下界
- 下界:单层最大耗时 $\max(C_i)$,再小连最重的那层都放不下
- 上界:所有层串行 $\sum C_i$,全塞一段虽浪费 NPU 但必然合法
第三步:check 函数——贪心拼段
从左往右贪心拼段:当前段累加耗时 $\text{cur_c}$、累加显存 $\text{cur_w}$。第 $i$ 层加入后若超时($\text{cur_c} + C_i > T$)或超显存($\text{cur_w} + W_i > M$),就在第 $i$ 层处开新段。新段数超过 $K$ 则返回 false。
为什么”段数 $\leq K$ 就够”?贪心拼出的段数若小于 $K$,可以把任意一段中间再切一刀变成更多段,每段的耗时和显存只会更小,不会破坏约束。
第四步:结构性无解的判定
进入二分前先排除三种无解:
- $K > N$:每张卡分不到一层
- $\max(W_i) > M$:最重的单层就已 OOM
- 仅看显存贪心切段就超过 $K$ 段:无论耗时放多宽都拼不下
题解代码
import sys
input = sys.stdin.readline
def solve():
data = sys.stdin.buffer.read().split()
p = 0
N = int(data[p]); p += 1
K = int(data[p]); p += 1
M = int(data[p]); p += 1
C = list(map(int, data[p:p + N])); p += N
W = list(map(int, data[p:p + N])); p += N
if K > N:
print(-1); return
if max(W) > M:
print(-1); return
mem_groups = 1
mem_cur = 0
for w in W:
if mem_cur + w > M:
mem_groups += 1
mem_cur = w
else:
mem_cur += w
if mem_groups > K:
print(-1); return
def can_split(limit):
groups = 1
cur_c = 0
cur_w = 0
for i in range(N):
if C[i] > limit:
return False
nc = cur_c + C[i]
nw = cur_w + W[i]
if nc > limit or nw > M:
groups += 1
cur_c = C[i]
cur_w = W[i]
if groups > K:
return False
else:
cur_c = nc
cur_w = nw
return True
lo = max(C)
hi = sum(C)
while lo < hi:
mid = (lo + hi) // 2
if can_split(mid):
hi = mid
else:
lo = mid + 1
print(lo)
solve()
复杂度分析
时间复杂度:$O(N \log S)$,其中 $S = \sum C_i$。二分 $O(\log S)$ 轮,每轮 check 扫一遍数组 $O(N)$。
空间复杂度:$O(N)$,存放 $C$ 和 $W$ 数组。
第二题:流式日志 Top-K 高频统计
题目描述
实现一个滑动窗口内的流式 Top-K 高频词统计组件,支持两种操作:
add word:向窗口中添加一个关键词。窗口大小为 $W$,超过 $W$ 时自动淘汰最早进入的元素(FIFO),被淘汰元素的频率相应减少get k:返回当前窗口内频率最高的 $k$ 个词,按频率降序排列,频率相同按字典序升序。有效词不足 $k$ 个时返回所有有效词
输入描述
第一行两个整数 $W, Q$(窗口大小和操作总数)。接下来 $Q$ 行,每行一个操作。
输出描述
对每个 get k 操作,输出结果词用空格分隔。
样例
输入
5 10
add banana
add apple
add cherry
add banana
add apple
get 3
add durian
add apple
add pipeapple
get 5
输出
apple banana cherry
apple banana durian pipeapple
思路分析
第一步:明确暴力做法的瓶颈
每次 get 操作如果扫描所有词并排序,单次 $O(W \log W)$,当 get 操作密集时整体退化到 $O(QW \log W)$。需要更高效的方案。
第二步:数据结构选择
用 deque 维护窗口内词的进入顺序(FIFO 淘汰),用 HashMap 维护每个词的当前频率。这两部分保证 add 操作是 $O(1)$ 的。
关键在于 get 操作如何快速取 Top-K。自然想到用堆维护 $(-\text{freq}, \text{word})$ 的三元组,这样最小堆的堆顶就是频率最高(或字典序最小)的词。
第三步:惰性删除 + 时间戳
问题是词的频率会随 add/淘汰不断变化,但从堆中间删元素是 $O(W)$ 的。解决方案是引入时间戳机制:
- 每个词维护一个单调递增的版本号
stamp[word] - 词频每次变化就
stamp[word] += 1 - 入堆时把当下的 stamp 值钉进条目 $(-\text{cnt}, \text{word}, s)$
- get 时从堆中 pop 出条目,检查
stamp[word] == s:匹配则有效,不匹配则该条目已过期,直接丢弃
这样所有过期条目都能在 pop 时被一次性清除,无需主动从堆中删除。
第四步:get 操作的实现细节
取够 $k$ 个有效条目后,这些条目仍然是最新状态,需要原样 push 回堆以供下次 get 复用。这一步保证了正确性——有效条目不会丢失。
题解代码
import sys
import heapq
from collections import deque
def solve():
data = sys.stdin.buffer.read().decode().split('\n')
first = data[0].split()
W = int(first[0])
Q = int(first[1])
queue = deque()
freq = {}
stamp = {}
heap = []
out_lines = []
def push_entry(word):
stamp[word] = stamp.get(word, 0) + 1
heapq.heappush(heap, (-freq[word], word, stamp[word]))
for i in range(1, Q + 1):
line = data[i]
if line[0] == 'a':
word = line[4:]
queue.append(word)
freq[word] = freq.get(word, 0) + 1
push_entry(word)
if len(queue) > W:
drop = queue.popleft()
freq[drop] -= 1
if freq[drop] == 0:
del freq[drop]
stamp[drop] = stamp.get(drop, 0) + 1
else:
push_entry(drop)
else:
k = int(line[4:])
kept = []
picked = []
while heap and len(picked) < k:
neg_cnt, word, s = heapq.heappop(heap)
if word in freq and stamp[word] == s:
picked.append(word)
kept.append((neg_cnt, word, s))
for item in kept:
heapq.heappush(heap, item)
out_lines.append(' '.join(picked))
sys.stdout.write('\n'.join(out_lines))
solve()
复杂度分析
时间复杂度:每次 add 最多入堆 2 次(新词 + 被淘汰词),单次 $O(\log H)$($H$ 为堆大小)。get 摊销 $O(k \log H)$,过期条目全程 pop 总数与 push 总数同阶。总复杂度 $O(Q \log Q)$。
空间复杂度:$O(Q)$,堆里历史快照随入堆次数线性增长。
小结
- 选择题覆盖面广,大模型工程(ZeRO、SmoothQuant、FP8、TP/PP/DP 拓扑、ReAct、RAG)占比最高,建议按”原理 + 典型失败案例”的方式复习
- 第一题是”最小化最大值”的经典二分答案模板,加上显存约束的贪心 check。注意提前判无解避免二分输出错误答案
- 第二题是工程向算法题,惰性堆 + 时间戳是流式 Top-K 的标准做法,关键在于理解”为什么不直接删堆元素”以及”有效条目要 push 回堆”