华为27届-AI岗 2026.7.24秋招笔试真题
- 2026-10-12 04:08:17
今天练习的是华为AI岗最新机考笔试题3题。
各大厂真题都整理了近两年的机考题,题库里面有详细思路和答案~
肥猫学长也提供机考辅导助攻和面试辅导欢迎咨询。
微信号:jackwwang8
目前已经整理的题库有如下:如果有需要可以加我微信获取哦~
华为AI岗-27届秋招题目7.24
1.单选题
(多选题部分整理在题库里,加学长微信可获取:jackwwang8)
单选题
1、题目:独立随机变量X服从均值1方差2的正态分布,Y服从均值2方差3的正态分布。则Z=2X-Y的方差是?
A、1
B、11
C、7
D、5
答案:B
解析:独立变量方差可线性计算,方差=2²×2 + (-1)²×3=11
2、题目:在训练大模型时使用activation checkpointing(激活检查点)主要是为了?
A、减少模型参数数量
B、自动提高数值精度
C、降低显存峰值
D、尽可能保存中间激活以加速反向传播
答案:C
解析:激活检查点牺牲计算速度,只保存部分激活值,反向时重算其余激活,以此降低显存占用峰值
3、题目:设某连续型随机变量X的概率密度函数为f(x)=c(1-x²),x范围[-1,1],其余区间为0,则常数c的值为?
A、1
B、-1/2
C、3/4
D、3/2
答案:C
解析:概率密度全区间积分等于1,积分区间-1到1,计算得c×4/3=1,解得c=3/4
4、题目:为什么在深度学习优化中常用L2正则化来提升稳定性?
A、它能限制权重大小,降低模型对输入微小扰动的敏感度
B、它能保证全局最优解
C、它可以消除所有零特征值
D、它可以缩短训练时间
答案:A
解析:L2正则惩罚大权重,抑制过拟合,让模型不会因输入微小变化产生剧烈输出波动
5、题目:当使用交叉损失函数时,若真实标签为one-hot编码[0,1,0],模型输出概率为[0.1,0.8,0.1],其损失值为多少?
A、log(0.8)
B、-log(0.8)
C、-(log(0.1)+log(0.8)+log(0.1))
D、0.8
答案:B
解析:交叉熵仅计算真实类别对应的预测概率损失,这里真实类别对应概率0.8,损失为-log(0.8)
6、题目:在进行PCA之前,为什么通常建议先对特征做标准化处理?
A、因为标准化可以直接得到主成分
B、因为PCA只能处理服从正态分布的数据
C、因为标准化可以让不同量纲的特征在方差计算中更公平
D、因为标准化后特征一定会线性无关
答案:C
解析:PCA依靠方差筛选主成分,不同单位、量级的特征会干扰方差权重,标准化消除量纲影响
7、题目:在复杂多模态预测任务(如VQA)中,后融合(Late Fusion)是指?
A、仅使用图像特征
B、使用独立的编码器后,仅在决策层融合特征
C、在输入层将图文拼接
D、使用单一Transformer处理所有模态
答案:B
解析:后融合先分开编码图像、文本等不同模态,到模型后端/输出决策阶段再融合信息
8、题目:在深度神经网络的典型结构中,隐藏层的主要作用是?
A、负责显示模型的最终预测结果(如分类标签或回归数值)
B、接收外部输入的原始数据,并将其直接传递给输出层
C、通过多层次的非线性变换,从原始特征中自动提取和构造更高阶的特征表示
D、存储训练过程中的损失函数值,以便计算梯度的方向
答案:C
解析:隐藏层依靠权重、激活函数做多层非线性转换,提取原始数据里复杂高阶特征
9、题目:某电商的智能客服平台为了挖掘用户痛点,以便进行产品改进,通过分析大量未标注的用户问题,对用户常见问题进行自动分类,针对该任务下面说法正确的是?
A、为了提升产品质量进行问题分析,属于强化学习
B、对用户问题生成了分类,属于生成式学习
C、对未标注的用户问题进行分类,属于无监督学习
D、对已有的用户问题进行分类,属于监督学习
答案:C
解析:数据无人工标签,模型依靠样本相似度自动聚类分组,属于无监督学习
10、题目:当用户评分数据存在明显的评分尺度差异时(如用户A评分范围为1~5,用户B评分范围为3~5),更适合使用?
A、汉明距离
B、欧几里得距离
C、皮尔逊相关系数
D、曼哈顿距离
答案:C
解析:皮尔逊只关注评分变化趋势,能抵消不同用户打分区间、尺度带来的偏差
11、题目:在VLLM中,PagedAttention使用固定大小的Block来管理KV Cache,如果将Block Size设为1,会产生什么主要问题?
A、模型无法加载
B、显存利用率达到100%
C、计算吞吐量大幅提升
D、Mapping Table元数据开销过大且访问不连续
答案:D
解析:每个token单独占用一个块,映射表规模暴增,内存访问碎片化,推理性能大幅下降
12、题目:在评估预训练数据质量时,困惑度(Perplexity)常被用作指标。对一份高质量、符合目标分布的文本,模型对其计算的困惑度通常表现为?
A、困惑度越高,表示数据越符合模型分布
B、困惑度仅用于评估生成多样性
C、困惑度越低,表示模型对数据的预测越准确
D、困惑度与数据质量无关
答案:C
解析:困惑度越低,模型对文本样本的预测概率越高,代表文本分布贴合模型训练目标
13、题目:某模型推理时,KV Cache采用"滑动窗口"机制(窗口大小为20),Prefill阶段处理30个token的prompt,Decode阶段已生成15个token,此时KV Cache中保留的token数量及自注意力计算的上下文长度分别为?
A、20个,20个
B、15个,20个
C、30+15=45个,45个
D、20个,15个
答案:A
解析:滑动窗口机制仅留存最近20个token,注意力计算仅使用窗口内20个token
14、题目:关于奇异值分解(SVD,Singular Value Decomposition),下列哪项说法正确?
A、U 和 V 可以取为正交矩阵
B、做SVD必须要求矩阵可逆
C、只有方阵才能做SVD
D、奇异值可以为任意负数
答案:A
解析:标准SVD分解式A=UΣV转置,U、V均为正交矩阵,任意矩阵都可做SVD,奇异值恒非负
15、题目:关于余弦相似度(Cosine Similarity)与欧几里得距离(Euclidean Distance)的特性,以下说法最准确的是?
A、余弦相似度仅反映向量的方向相对关系;欧几里得距离同时反映方向差异和绝对长度差异
B、将两个向量单位化(归一化到单位长度)后,余弦相似度与欧几里得距离可以相互转换,结果等价
C、两者都只反映向量的方向差异,与向量长度无关
D、余弦相似度考虑向量的绝对长度,欧几里得距离不考虑
答案:A
解析:余弦相似度只对比向量夹角,和向量模长无关;欧氏距离同时受向量方向、长度共同影响
第一题:混合专家大模型的动态路由与容量掩码
题目描述
在混合专家大模型(MoE)中,为了节省算力,并不是所有的神经网络层都会处理所有的 Token。
当系统包含 E 个专家时,对于输入的每一个 Token,路由器会给各个专家打分,并只将该 Token 分配给得分排名前 K 的专家。同时,为了防止某个专家被分配了过多的 Token 导致显存溢出,系统为每个专家设置了最大处理容量 C。如果某个专家达到了容量上限,后续被路由到该专家的 Token 将被强制"掩蔽"并丢弃。
给定 N 个 Token 对 E 个专家的原始打分矩阵 S(维度 N * E),具体流程如下:
1. Top-K 路由掩码生成:
对于打分矩阵的每一行(代表第 i 个 Token),找出得分排名前 K 的专家索引,生成一个初始的 N * E 二进制路由掩码矩阵 M。
如果专家 j 在 Token i 的前 K 名中,则 M[i][j] = 1,否则为 0。 如果出现得分相同的情况,优先选择索引较小的专家。
2. 动态容量掩码调度:
按顺序(从 Token 0 到 Token N-1)依次处理每个 Token。维护一个长度为 E 的计数器数组 load,初始全为 0。遍历初始掩码 M,生成最终的生效掩码 M':
如果 M[i][j] = 1,且此时 load[j] < C,则该分配生效,M'[i][j] = 1,load[j] 加一。 如果 M[i][j] = 1,且此时 load[j] 已经等于 C,则触发容量掩码,强制丢弃,M'[i][j] = 0。 对于同一个 Token,被选中的 K 个专家的容量判断是相互独立的,均与当前 Token 处理开始时刻的 load 数组进行比较。
3. 路由惩罚聚合:
根据最终的每个专家的实际负载数组 load,计算当前批次的路由不平衡惩罚值。公式为各专家实际负载的平方和:penalty = sum(load[j]^2)。
输入描述
第 1 行:四个整数,以空格分隔,分别为 Token 数量 N、专家数量 E、每个 Token 激活的专家数 K、单个专家最大容量 C。
接下来 N 行:每行包含 E 个整数,以空格分隔,代表原始打分矩阵 S。
约束条件:1 <= N <= 1000, 1 <= E <= 100, 1 <= K <= E, 1 <= C <= N。
输出描述
第 1 行:一个整数,代表最终的路由惩罚值 penalty。
第 2 行:E 个整数,以空格分隔,代表每个专家最终处理的 Token 数量。
样例 1
输入
4 3 2 21 5 48 1 23 6 52 7 9输出
91 2 2说明
Top-K 路由:
Token 0:得分 [1,5,4],前 2 名是专家 1(5 分)和专家 2(4 分) Token 1:得分 [8,1,2],前 2 名是专家 0(8 分)和专家 2(2 分) Token 2:得分 [3,6,5],前 2 名是专家 1(6 分)和专家 2(5 分) Token 3:得分 [2,7,9],前 2 名是专家 1(7 分)和专家 2(9 分)
容量掩码调度(C = 2):
Token 0:专家 1、2 容量均充足 → load = [0, 1, 1] Token 1:专家 0、2 容量均充足 → load = [1, 1, 2] Token 2:专家 1 充足,专家 2 超载(已达 2)→ load = [1, 2, 2] Token 3:专家 1 超载(已达 2),专家 2 超载(已达 2)→ load = [1, 2, 2]
惩罚聚合:12 + 22 + 2^2 = 1 + 4 + 4 = 9。
样例 2
输入
4 4 2 25 5 5 12 8 8 91 2 9 97 7 1 1输出
132 2 1 2说明
Top-K 路由:
Token 0:前三名得分同为 5,根据"优先选择索引较小"规则,选专家 0、1 Token 1:最高分专家 3(9 分),第二高分专家 1 和 2 同为 8 分,优先选索引较小的专家 1 Token 2:选专家 2、3 Token 3:选专家 0、1
容量掩码调度(C = 2):
Token 0:专家 0、1 容量均充足 → load = [1, 1, 0, 0] Token 1:专家 1、3 容量均充足 → load = [1, 2, 0, 1] Token 2:专家 2、3 容量均充足 → load = [1, 2, 1, 2] Token 3:专家 0 充足,专家 1 超载 → load = [2, 2, 1, 2]
惩罚聚合:22 + 22 + 12 + 22 = 4 + 4 + 1 + 4 = 13。
解题思路
按照 Token 的输入顺序逐行处理打分矩阵。对于每个 Token,将所有专家按以下规则排序:
得分更高的专家排在前面。 得分相同时,索引更小的专家排在前面。
排序后的前 K 个专家就是该 Token 的 Top-K 路由结果。随后依次检查这 K 个专家:
如果专家 j 当前的负载 load[j] < C,则本次路由生效,load[j] 加一。 否则该路由被容量掩码丢弃,负载保持不变。
一个 Token 的 Top-K 结果中不会重复出现同一个专家。每个专家的容量判断只会修改自己的负载,不会影响该 Token 对其他专家的判断。
不需要显式构造 N * E 的掩码矩阵。对于每个 Token 找到 Top-K 专家后,立即完成容量判断即可。所有 Token 处理完成后,计算 penalty = sum(load[j]^2)。
时间复杂度: O(N * E log E),每个 Token 需要对 E 个专家排序。
空间复杂度: O(N * E),用于存储打分矩阵。排序和负载数组使用 O(E) 额外空间。
更加详细解题思路和CPP、Java代码加我微信获取)
import sys
def compute_routing_penalty(scores, expert_count, top_k, capacity):
"""模拟 MoE 动态路由与容量掩码,计算路由惩罚值"""
# load[j] 表示专家 j 当前已经接收的 Token 数量
load = [0] * expert_count
for token_scores in scores:
# 按得分降序排列,得分相同时按专家索引升序排列
# 排序键为 (-score, index)
ranking = sorted(
range(expert_count),
key=lambda j: (-token_scores[j], j)
)
# 只检查当前 Token 得分排名前 K 的专家
for t in range(top_k):
expert_idx = ranking[t]
# 专家未达到容量上限时,本次路由生效
if load[expert_idx] < capacity:
load[expert_idx] += 1
# 否则触发容量掩码,该 Token 被丢弃(负载不变)
# 计算所有专家实际负载的平方和作为惩罚值
penalty = sum(x * x for x in load)
return penalty, load
def main():
n, expert_count, top_k, capacity = map(
int, sys.stdin.buffer.readline().split()
)
# 读取 N 行专家打分矩阵
scores = []
for _ in range(n):
row = list(map(int, sys.stdin.buffer.readline().split()))
scores.append(row)
penalty, load = compute_routing_penalty(
scores, expert_count, top_k, capacity
)
print(penalty)
print(*load)
if __name__ == "__main__":
main()
第二题:流水线并行阶段划分优化
题目描述
在大规模深度学习训练中,常采用流水线并行(Pipeline Parallelism)来提升训练效率。模型被划分为多个连续阶段(Stage),每个阶段在不同设备上执行。合理的阶段划分需要兼顾计算负载均衡和通信开销最小。
给定一个包含 n 层的模型,需要按顺序划分为 p 个连续阶段。每层有计算时间 time[i],相邻层之间存在通信开销 comm[i]。
如果在层 k 与层 k+1 之间划分阶段,需要产生通信开销 comm[k]。每个阶段的计算时间为该阶段所有层计算时间之和。
所有阶段必须满足:每个阶段的计算时间 <= T(T 为给定的最大阶段计算时间)。
在满足上述约束的情况下,需要选择划分方式,使总通信开销最小。若不存在合法划分方案,输出 -1。
输入描述
一行空格分隔的整数,依次为:
n:模型层数,1 <= n <= 1000 p:阶段数量,1 <= p <= n T:单个阶段允许的最大计算时间,1 <= T <= 100000 time[1], time[2], ..., time[n]:每层的计算时间,1 <= time[i] <= 100 comm[1], comm[2], ..., comm[n-1]:相邻层之间的通信开销,1 <= comm[i] <= 10
输出描述
输出一个整数:最小总通信开销。若不存在满足条件的划分方案,输出 -1。
样例 1
输入
5 3 10 2 4 6 3 7 1 1 1 1输出
2说明
n=5, p=3, T=10。计算时间:[2, 4, 6, 3, 7],通信开销:[1, 1, 1, 1]。
一种合法划分方式为:[2, 4] | [6, 3] | [7]。
阶段 1 计算时间:2 + 4 = 6 阶段 2 计算时间:6 + 3 = 9 阶段 3 计算时间:7
三个阶段计算时间均不超过 T = 10。
划分点在层 2 后和层 4 后,通信开销 = comm[2] + comm[4] = 1 + 1 = 2。
样例 2
输入
4 2 7 3 5 4 2 1 2 3输出
-1说明
n=4, p=2, T=7。计算时间:[3, 5, 4, 2],通信开销:[1, 2, 3]。
任意划分都会导致某个阶段计算时间大于 7,因此不存在合法方案。
解题思路
设前缀和 prefix[i] 表示前 i 层的计算时间之和,则层 (k+1) 到层 i 组成一个阶段时,该阶段的计算时间为 prefix[i] - prefix[k]。
定义 dp[s][i] 表示将前 i 层恰好划分为 s 个非空阶段时,所需的最小通信开销。
状态转移:假设最后一个阶段包含第 (k+1) 层到第 i 层,那么前 k 层需要被划分为 s-1 个阶段,并且需要在第 k 层后进行一次阶段划分,产生通信开销 comm[k]。转移方程为:
dp[s][i] = min{ dp[s-1][k] + comm[k] },其中 k 需满足 s-1 <= k < i 且 prefix[i] - prefix[k] <= T。
对于固定的 i,由于每层计算时间均为正数,满足 prefix[i] - prefix[k] <= T 的 k 构成一个连续区间 [left[i], i-1]。
在固定阶段数 s 时,随着 i 增大,合法的 k 区间左右端点均单调右移。因此可以使用单调队列维护滑动区间内 dp[s-1][k] + comm[k] 的最小值,将每层状态转移优化为均摊 O(1)。
实现步骤:
计算计算时间数组的前缀和。 使用双指针计算每个 i 的最小合法前置层数 left[i]。 初始化只有 1 个阶段的情况(不产生通信开销)。 从 2 到 p 枚举阶段数量,使用单调队列维护合法切分点对应的最小通信开销。 最终检查 dp[p][n] 是否可达。
时间复杂度: O(p * n),每个阶段内每层最多入队出队一次。
空间复杂度: O(n),使用滚动数组 + 前缀和 + 单调队列。
更加详细解题思路和CPP、Java代码加我微信获取:)
# 第2题:流水线并行阶段划分优化
import sys
from collections import deque
def min_communication_cost(layer_count, stage_count, max_time,
compute_times, comm_costs):
"""计算满足各阶段计算时间约束下的最小总通信开销"""
INF = 10 ** 18
# 计算前缀和,用于快速计算任意连续层的总计算时间
prefix = [0] * (layer_count + 1)
for i in range(1, layer_count + 1):
prefix[i] = prefix[i - 1] + compute_times[i]
# left_bound[i] 表示满足 prefix[i] - prefix[k] <= max_time 的最小 k
# 由于所有计算时间均为正数,k 只会单调右移
left_bound = [0] * (layer_count + 1)
k = 0
for i in range(1, layer_count + 1):
while k < i and prefix[i] - prefix[k] > max_time:
k += 1
left_bound[i] = k
# dp[i] 表示将前 i 层恰好划分为当前阶段数时的最小通信开销
# 只有一个阶段时不能产生阶段间通信开销,代价为 0
dp = [INF] * (layer_count + 1)
for i in range(1, layer_count + 1):
if prefix[i] <= max_time:
dp[i] = 0
if stage_count 1:
return -1 if dp[layer_count] INF else dp[layer_count]
# 依次计算划分为 2 到 p 个阶段的结果
for s in range(2, stage_count + 1):
next_dp = [INF] * (layer_count + 1)
# 单调队列:存储 (切分位置 k, dp[k] + comm_costs[k])
# 保持队列中候选值单调递增
mono_queue = deque()
# 至少需要 s 层才能划分为 s 个非空阶段
for i in range(s, layer_count + 1):
# 当最后一个阶段以 i 结尾时,新增的最大切分位置为 i-1
cut_pos = i - 1
# 只有前 cut_pos 层能够被划分为 s-1 个阶段时才可转移
if dp[cut_pos] < INF:
candidate = dp[cut_pos] + comm_costs[cut_pos]
# 保持队列单调递增:弹出队尾所有 >= 当前候选值的元素
# 相同值保留位置更靠后的切分点,使其更晚失效
while mono_queue and mono_queue[-1][1] >= candidate:
mono_queue.pop()
mono_queue.append((cut_pos, candidate))
# 最后一个阶段需要满足计算时间不超过 max_time
min_valid_k = max(s - 1, left_bound[i])
# 删除已经不在合法切分范围内的位置
while mono_queue and mono_queue[0][0] < min_valid_k:
mono_queue.popleft()
# 队首即当前合法范围内的最小通信开销
if mono_queue:
next_dp[i] = mono_queue[0][1]
dp = next_dp
return -1 if dp[layer_count] == INF else dp[layer_count]
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
if not data:
return
layer_count = data[0]
stage_count = data[1]
max_time = data[2]
# 读取每层计算时间(1-indexed 方便与前缀和对齐)
compute_times = [0] * (layer_count + 1)
pos = 3
for i in range(1, layer_count + 1):
compute_times[i] = data[pos]
pos += 1
# 读取相邻层之间的通信开销(1-indexed,comm[k] 表示层 k 与 k+1 之间)
comm_costs = [0] * layer_count
for i in range(1, layer_count):
comm_costs[i] = data[pos]
pos += 1
result = min_communication_cost(
layer_count, stage_count, max_time, compute_times, comm_costs
)
print(result)
if __name__ == "__main__":
main()

扫描它,然后带走我:

微信号| jackwwang8
bilibili| 养只猫一米哒
小红书| 2878931801