大厂真题 / 华为

华为 6.17 笔试真题 - AI岗

本场考试概述

考试时间:2026年6月17日 考试岗位:AI岗(AI算法工程师、AI应用开发工程师、AI数据科学工程师等) 难度评级:中等

考点分析

  1. 选择题(20 道):机器学习、深度学习、大模型、数值计算等基础知识
  2. 第一题:枚举可行流水线配置(难度中等偏易)
  3. 第二题:DFT 频域特征 + K-Means 聚类(难度中等偏难)

建议策略

  1. 选择题覆盖面广,重点复习激活函数、评价指标、量化部署、RAG 等高频考点
  2. 第一题重点处理输入合法性校验与定点小数的四舍五入,用整数算术避免跨语言舍入分歧
  3. 第二题按题面公式逐步实现 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 聚类系统,三步流水线:

  1. DFT 频域变换:对 $N$ 组长度为 $L$ 的信号做离散傅里叶变换
  2. 提取特征:从 $k = 1$ 到 $L/2 - 1$ 的频点中,取幅值最大的 3 个频率索引 $k$ 作为特征向量(按幅值降序,幅值相同时索引小的优先)
  3. 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 迭代三个模块,核心难点在于银行家舍入的整数实现和空簇保留处理