大厂真题 / 华为
华为 5.13 笔试真题 - AI岗
本场考试概述
考试时间:2026年5月13日 考试岗位:华为暑期实习 AI 岗 难度评级:中等偏上
考点分析:
- 选择题(20道):涵盖向量检索、Agent 安全、多模态架构、对比学习、ZeRO/混合精度训练、Krylov 子空间、DPO 等大模型与数值计算的核心知识点
- 第一题:BPE 分词模拟(难度中等,模拟+频率统计+字典序破平局)
- 第二题:2D 空洞卷积底层实现(难度中等偏难,NumPy 张量索引)
建议策略:
- AI 岗笔试的选择题占比大、覆盖广,复习时要兼顾大模型工程实践(KVCache/ZeRO/混合精度)和经典数学(数值计算/概率论)
- 两道编程题都属于”理解定义+严格按公式实现”类,重点是把题面的索引/坐标公式翻译成代码,别急着写优化
- 第二题虽然是 ML/DL 主题,但本质是数组索引题,建议先写朴素四重循环跑通样例,再考虑 NumPy 向量化
选择题(20道)
第1题
在通信故障诊断 RAG 系统中,使用领域微调 Embedding 模型将用户查询与历史故障案例转换为 768 维向量。为提升检索精度,系统对所有向量执行 L2 归一化(向量模长为 1)。下列关于相似度计算的工程实践选择,最优的是?
A. 采用欧氏距离计算相似度,距离越小表示故障案例与查询匹配度越高 B. 采用点积相似度计算,其结果与余弦相似度等价,且计算效率更高 C. 采用曼哈顿距离计算,更适合高维稀疏的故障文本向量场景 D. 采用余弦相似度计算,需额外对向量模长进行归一化处理
答案:B
考点:大模型——向量检索/相似度
向量已经 L2 归一化时,余弦相似度与点积完全等价,且点积只需一次乘加。A 欧氏距离与点积单调对应但计算更慢;C 曼哈顿不适合稠密语义向量;D 向量已归一化,再做归一化是重复操作。
第2题
在分析”工具调用风险”时,发现 Agent 具有写文件权限(Write)和执行脚本权限(Exec)。若攻击者利用间接注入让 Agent 执行以下操作序列:1. 将 Base64 负载写入 temp.sh;2. 运行 chmod +x;3. 执行该脚本。这种攻击组合在权限风险矩阵中属于?
A. 权限提权(Privilege Escalation) B. 权限收敛(Privilege Convergence) C. 职责分离缺失(Lack of Segregation of Duties) D. 跨站脚本(XSS)
答案:C
考点:大模型——AI Agent 安全
Agent 同时持有”写文件”与”执行脚本”两类敏感权限,单一主体集齐了完成攻击链的全部能力,违反职责分离原则。
第3题
当前主流多模态模型(如 LLaVA、Qwen-VL)与原生多模态模型(如 Gemini、GPT-4o)的核心架构差异是?
A. 当前模型使用 Transformer,原生多模态使用 CNN+RNN 混合架构 B. 当前模型冻结视觉编码器+训练投影层,原生多模态端到端联合训练视觉和语言组件 C. 当前模型参数量小,原生多模态参数量大,这是唯一区别 D. 当前模型只支持文本输出,原生多模态支持图像生成
答案:B
考点:大模型——多模态模型
LLaVA/Qwen-VL 把视觉编码器冻结、只训练投影 MLP;Gemini/GPT-4o 从预训练阶段就把图文混合做端到端联合训练。
第4题
在随机梯度下降中,使用小批量梯度代替全梯度,关于噪声对数值稳定性的影响,正确的是?
A. 噪声可通过增大学习率来完全消除 B. 噪声方差与批量大小成正比,增大批量可增加噪声 C. 噪声在接近最优解时帮助逃离鞍点,但可能导致在最优解附近波动 D. 噪声导致目标函数值单调下降,但收敛点随机波动
答案:C
考点:深度学习——优化器
mini-batch 梯度方差与批量大小成反比(不是正比),噪声在鞍点附近能提供随机扰动帮助逃离,但在最优解附近会导致解的抖动。
第5题
电影院放映厅可以容纳 $n$ 名观众,第一位观众进入放映厅前丢了票,不知道自己的座位号,就随机选择一个位置坐下。剩余观众均没有丢票,首选自己的位置坐,但是如果发现自己的位置已经被占了,就从剩下的空位中随机选一个位置坐。则最后一位进入的观众恰好坐在自己座位上的概率是多少?
A. $1/n$ B. $(n-1)/n$ C. $1/(n-1)$ D. $1/2$
答案:D
考点:数学——概率论
经典”丢票问题”,与人数无关,答案恒为 $1/2$。归纳证明:第一位的随机选择决定后续状态,若选了自己或选了最后一位的座位则结局已定,选其他人座位则递归到更小规模,由对称性最终概率收敛到 $1/2$。
第6题
关于贪婪搜索(Greedy Search)的描述,正确的是?
A. 它在每一步都选择当前概率最高的 Token,容易陷入局部最优或重复循环 B. 它通过引入随机性来提高文本的创造力 C. 它会考虑所有可能的序列路径,寻找全局最优解 D. 它的计算量远大于束搜索(Beam Search)
答案:A
考点:大模型——生成策略
贪婪搜索每步取 argmax,无回溯,容易卡在局部最优甚至出现重复循环。B 是采样策略的特性;C 全局最优需要穷举;D 贪婪是 beam search 在 $k=1$ 的退化版本,计算量最小。
第7题
在 CLIP 的对比学习中,假设 batch size 为 $N$,对于某个正样本对 $(I_i, T_i)$,其梯度对图像特征 $f_i$ 的贡献包含哪些部分?(不考虑温度参数)
A. 仅来自对角线位置的梯度,非对角线位置梯度为 0 B. 仅来自图像→文本方向的正样本梯度 C. 来自图像→文本的正样本梯度,以及作为其他样本负样本时的梯度 D. 来自两个方向:图像→文本的正样本梯度 + 文本→图像的正样本梯度
答案:D
考点:大模型——多模态/对比学习
CLIP 损失对称 $L = L_{I \to T} + L_{T \to I}$。图像特征在第一项作为 query、在第二项作为被检索对象,两条路径都贡献梯度。
第8题
与 K-Means 不同,DBSCAN 算法的一个显著优点是能够识别并处理哪种类型的数据点?
A. 噪声点(离群点) B. 核心点 C. 中心点 D. 边界点
答案:A
考点:机器学习——聚类
DBSCAN 通过 $\epsilon$-邻域密度判定,把密度不足的点直接标记为噪声而不强行归簇,这是它相对 K-Means 的核心优势。
第9题
自适应数值积分(adaptive quadrature)的基本策略是?
A. 在整个区间上均匀加密节点 B. 在估计误差较大的子区间上局部加密,误差较小的子区间保持不变 C. 随机选择加密位置 D. 先用高阶公式再用低阶公式
答案:B
考点:数学——数值计算
自适应积分根据局部误差估计动态决定加密策略,误差大的子区间继续二分,误差小的子区间直接接受当前估计。
第10题
在评估一个二分类模型的性能时,如果关注的是模型预测为正类的样本中真正为正的比例,应该使用以下哪个指标?
A. 精确率 B. F1 分数 C. 准确率 D. 召回率
答案:A
考点:机器学习——评价指标
精确率 $P = TP/(TP+FP)$,刚好是”预测为正中真正为正的比例”。召回率是”真实为正中被预测为正的比例”。
第11题
激活函数的主要作用是?
A. 加快训练 B. 提高模型精度 C. 增加模型参数 D. 引入非线性
答案:D
考点:深度学习——基础
没有激活函数时,多层网络等价于单层线性变换。激活函数提供非线性,让网络能拟合任意复杂函数。
第12题
在目标检测或极度不平衡的分类任务中,研究人员提出了 Focal Loss。请问 Focal Loss 主要是通过引入下列哪种机制来调节不同样本对总损失的贡献?
A. 动态权重衰减(Dynamic Weight Decay) B. 调制因子(Modulating Factor):引入参数 $\gamma$,对已经预测准确的”简单样本”进行降权 C. 硬采样(Hard Example Mining):直接丢弃简单样本 D. 标签平滑(Label Smoothing)
答案:B
考点:深度学习——损失函数
$FL(p_t) = -(1-p_t)^\gamma \log(p_t)$,调制因子让已经预测得很好的样本权重接近 0,把学习信号集中到难样本上。
第13题
某模型推理时,Decode 阶段逐 token 生成,已知 Prefill 阶段缓存的 KVCache 为 $P$ 个 token 的 K/V 向量,当前已生成 $D$ 个 token,若采用 KVCache 复用策略,则第 $D+1$ 个 token 生成时,自注意力计算需新增计算的 K/V 向量数量为?
A. 1 个 B. $D$ 个 C. $P+D$ 个 D. $P$ 个
答案:A
考点:大模型——推理优化
KVCache 的核心是把过去 token 的 K/V 缓存下来,Decode 阶段每步只为新输入的 1 个 token 算 K/V 再追加。
第14题
ZeRO(Zero Redundancy Optimizer)技术通过对显存状态进行切片来打破数据并行的显存墙。关于 ZeRO 的不同阶段,ZeRO-2 具体对哪些状态进行了分片(Partition)来降低显存占用?
A. 优化器状态、模型参数做切片 B. 对梯度、模型参数做切片 C. 对优化器状态、梯度做切片 D. 对优化器状态、模型参数、梯度做切片
答案:C
考点:大模型——分布式训练
ZeRO-1 只分优化器状态,ZeRO-2 在此基础上加上分梯度,ZeRO-3 才把模型参数也分片。
第15题
在基于 n-gram 的语言模型中,我们将句子看作是词的序列,假设当前词出现的概率只依赖于前一个词。这种假设对应的数学模型是?
A. 泊松过程 B. 独立同分布序列 C. 隐马尔可夫模型 D. 一阶马尔可夫链
答案:D
考点:大模型——语言模型基础
| 当前状态只依赖前一个状态是一阶马尔可夫性。bigram 模型 $P(w_i | w_{i-1})$ 就是一阶马尔可夫链。 |
第16题(多选)
以下关于 Krylov 子空间方法的说法,正确的有?
A. Krylov 方法要求显式存储完整的系数矩阵 $A$ B. Krylov 方法总在 $n$ 步就收敛 C. 共轭梯度法(CG)是对称正定情况下的 Krylov 方法 D. GMRES(广义最小残差法)适用于一般非对称方程组
答案:C, D
考点:数学——数值计算/线性代数
A 错(只需 matvec 接口,无需显式存储 $A$,这正是处理大型稀疏问题的优势);B 错(理论上至多 $n$ 步内收敛,实际需多步);C 正确(CG 是 $A$ 对称正定时的 Krylov 方法);D 正确(GMRES 通过最小化残差范数适用于非对称问题)。
第17题(多选)
你看到 profile:forward/backward 40%,allreduce 50%,dataloader 10%。哪些优化方向合理?
A. 考虑 ZeRO/FSDP 分片策略重配 B. 增加通信与计算重叠 C. 把 tokenizer 换成更大词表 D. 调整梯度 bucket 大小
答案:A, B, D
考点:大模型——分布式训练优化
allreduce 占 50% 是瓶颈,所有优化都应对准通信。A 改变通信模式,B 隐藏通信延迟,D 影响 allreduce 合并效率,C 加大词表反而增大计算与通信瓶颈无关。
第18题(多选)
在描述数据分布特征时,均值、中位数和众数在什么情况下会完全重合?
A. 数据呈偏态分布 B. 数据呈连续型均匀分布 C. 数据呈标准正态分布 D. 数据呈对称的单峰分布
答案:C, D
考点:数学——概率论/统计
A 偏态必不重合;B 均匀分布没有唯一众数;C 标准正态是对称单峰,三者都在 0;D 对称单峰是更一般条件,三者必重合于对称中心。
第19题(多选)
关于混合精度训练,以下哪些描述是正确的?
A. 使用 FP16 存储参数和梯度可以减少显存占用,且有精度保障,常被设置为默认模型训练精度 B. BP 梯度回传与模型推理过程类似,一般具有相同的精度要求 C. 训练过程中主权重通常保存为 FP32 以保证数值稳定性 D. 损失缩放用于防止梯度下溢
答案:C, D
考点:大模型——训练技巧
A 错(纯 FP16 训练会丢精度导致 NaN);B 错(BP 对精度要求高于推理);C 正确(FP32 主权重保证稳定);D 正确(损失缩放避免 FP16 下溢)。
第20题(多选)
多模态 DPO 用于优化视觉-语言模型,使其学会区分”优选的回复”和”非优选的回复”。基于 DPO 的损失函数,关于多模态 DPO 的梯度行为和训练机制,以下哪些说法是正确的?
A. 当模型严重错误排序(给非优选的评分远高于优选)时,sigmoid 接近 1,此时梯度幅度较大,模型获得强烈的修正信号 B. 增大温度系数 $\beta$ 会增强模型对偏好数据的学习强度,使策略模型更快偏离参考模型;但过大的 $\beta$ 可能导致训练不稳定 C. 视觉投影层的梯度仅来自生成序列的第一个 token,因为视觉特征只在初始位置注入 D. 若优选的回复比非优选长很多,长序列累积对数概率绝对值更大,可能导致梯度被长序列主导,使模型倾向生成更长回复
答案:A, B, D
考点:大模型——RLHF/DPO
DPO 梯度幅度正比于 $1 - \sigma(\beta \Delta)$。A 严重错误排序时 $\Delta \ll 0$,$\sigma \to 0$,梯度大;B $\beta$ 直接放大梯度;C 错,视觉特征会通过自注意力影响整个序列,所有 token 损失都回传到投影层;D 正确,DPO 不归一化序列长度,长回复会主导梯度。
第一题:BPE 分词模拟
题目描述
某大型语言模型需要将文本切分为一个个 Token。BPE(Byte Pair Encoding)的核心思想是迭代合并最高频的相邻字符对。
给定初始字符串 $S$(由小写英文字母组成)和整数 $K$(最大合并次数),请模拟 BPE 算法的 $K$ 次迭代过程,输出最终的 Token 序列。
迭代规则:
- 每轮统计当前序列中所有相邻 Token 对的频率
- 找出频率最高的相邻对,若存在多个并列最高频,选择字典序最小的那一对
- 若最高频率为 1 或没有相邻对,则提前终止
- 合并采用从左到右贪心原则(遇到匹配就合并,跳过下一个,继续向右扫描)
输入描述
第一行包含一个整数 $K$。
第二行包含字符串 $S$,由小写英文字母组成。
输出描述
输出经过最多 $K$ 次合并后的 Token 序列,Token 之间用一个空格分隔。
样例
输入
5
aaabdaaabac
输出
aaab d aaab a c
思路分析
第一步:确定算法框架
每轮重新统计相邻对频率,挑最高频且字典序最小的对做合并,迭代最多 $K$ 轮。规模小,不需要维护增量数据结构。
第二步:字典序破平局
把”相邻对”看作字符串二元组,按元组字典序比较——先比第一个 Token,再比第二个,短串作为同前缀的更小者。Python 的 tuple 比较天然满足这一规则。
第三步:提前终止条件
所有相邻对的最高频都只有 1 时,继续合并失去意义,立即停止;序列长度退化为 1 也没有相邻对可合并。
第四步:从左到右贪心合并
维护一个新数组从左到右扫描,遇到当前位置与下一位置恰好等于最佳对就拼接成新 Token 并把指针前进 2,否则原样保留并前进 1。指针每次最少前进 1,扫描一次内不会”重叠合并”同一个位置。
题解代码
from collections import Counter
K = int(input())
S = input().strip()
tokens = list(S)
for _ in range(K):
cnt = Counter()
for i in range(len(tokens) - 1):
cnt[(tokens[i], tokens[i + 1])] += 1
if not cnt:
break
best_freq = max(cnt.values())
if best_freq <= 1:
break
best_pair = min(p for p, c in cnt.items() if c == best_freq)
new_tokens = []
i = 0
while i < len(tokens):
if i + 1 < len(tokens) and (tokens[i], tokens[i + 1]) == best_pair:
new_tokens.append(tokens[i] + tokens[i + 1])
i += 2
else:
new_tokens.append(tokens[i])
i += 1
tokens = new_tokens
print(' '.join(tokens))
复杂度分析
时间复杂度:$O(K \cdot n)$,每轮扫描序列统计和合并,最多 $K$ 轮。 空间复杂度:$O(n)$。
第二题:2D 空洞卷积
题目描述
空洞卷积(膨胀卷积)通过在卷积核内拉开取值间隔来扩大感受野,且不增加参数。本题要求基于原生语法手动实现单通道 2D 空洞卷积,禁止调用任何卷积相关高级库函数。
对输入的 $H \times W$ 特征图先做常数填充(填充值为 0),得到填充后的图。有效核尺寸 $K_{eff} = K + (K-1) \times (dilation - 1)$,输出尺寸 $H_{out} = (H + 2 \times padding - K_{eff}) / stride + 1$,$W_{out}$ 同理。每个输出位置对应的窗口起点为 $(i \times stride,\ j \times stride)$,核内位置由膨胀率跳到 $(ki \times dilation,\ kj \times dilation)$,把各个取值与核元素相乘累加。
输入描述
第一行:$H, W$。
第二行:$H \times W$ 个整数,按行优先给出输入特征图。
接下来一行:奇数 $K$(卷积核边长)。
接下来一行:$K \times K$ 个整数,按行优先给出卷积核。
接下来三行依次给出 stride、padding、dilation。
输出描述
输出 $H_{out}$ 行,每行 $W_{out}$ 个整数,整数间用一个空格分隔。
样例
输入
4 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
3
1 0 -1 1 0 -1 1 0 -1
1
1
2
输出
-32 -8 -8 30
-20 -8 -8 18
思路分析
第一步:扩边
在原图四周补 padding 圈 0,得到形状 $(H + 2p) \times (W + 2p)$ 的填充图。
第二步:有效核尺寸
膨胀率 $d$ 让核内相邻两点的距离变成 $d$,覆盖宽度变成 $K + (K-1)(d-1)$。当 $K=3, d=2$ 时,有效核尺寸为 5,相当于一个稀疏的 $5 \times 5$ 核。
第三步:核内取值坐标
核的第 $(ki, kj)$ 位置由于膨胀率 $d$,在填充图上跳到 $(ki \times d,\ kj \times d)$。
第四步:NumPy 向量化
构造行/列索引矩阵,用高级索引一次性取出所有窗口的 $(H_{out}, W_{out}, K, K)$ 张量,再用 einsum('ijkl,kl->ij', windows, kernel) 在后两维做逐元素乘并求和。
题解代码
import sys
import numpy as np
data = sys.stdin.buffer.read().split()
idx = 0
H = int(data[idx]); W = int(data[idx + 1]); idx += 2
fmap = np.array(data[idx:idx + H * W], dtype=np.int64).reshape(H, W)
idx += H * W
K = int(data[idx]); idx += 1
kernel = np.array(data[idx:idx + K * K], dtype=np.int64).reshape(K, K)
idx += K * K
stride = int(data[idx]); padding = int(data[idx + 1]); dilation = int(data[idx + 2])
padded = np.pad(fmap, padding, mode='constant', constant_values=0)
K_eff = K + (K - 1) * (dilation - 1)
H_out = (padded.shape[0] - K_eff) // stride + 1
W_out = (padded.shape[1] - K_eff) // stride + 1
row_base = np.arange(H_out) * stride
col_base = np.arange(W_out) * stride
row_off = np.arange(K) * dilation
col_off = np.arange(K) * dilation
i_idx = row_base[:, None] + row_off[None, :]
j_idx = col_base[:, None] + col_off[None, :]
windows = padded[i_idx[:, None, :, None], j_idx[None, :, None, :]]
result = np.einsum('ijkl,kl->ij', windows, kernel)
lines = [' '.join(str(x) for x in row) for row in result]
sys.stdout.write('\n'.join(lines))
复杂度分析
时间复杂度:$O(H_{out} \times W_{out} \times K^2)$。 空间复杂度:$O(H_{out} \times W_{out} \times K^2)$,windows 张量的存储。
小结
- 选择题:本场 20 道选择题覆盖面广,重点考察大模型工程(向量检索、KVCache、ZeRO、混合精度、DPO)、AI Agent 安全、经典机器学习(DBSCAN、精确率/召回率、Focal Loss)以及数学基础(概率论、数值计算、Krylov 子空间)。多选题需要对每个选项逐一验证,不能只看”对”的选项。
- 第一题(BPE 分词模拟):按定义模拟即可。每轮统计相邻对频率,挑最高频且字典序最小的合并。关键细节是从左到右贪心合并(匹配就合并并跳 2)以及频率为 1 时提前终止。
- 第二题(2D 空洞卷积):本质是把膨胀卷积的数学定义翻译为代码。核心公式是有效核尺寸 $K_{eff} = K + (K-1)(d-1)$,核内坐标按 dilation 跳步取值。NumPy 高级索引 + einsum 可以避免写 Python 四重循环。