大厂真题 / 华为

华为 8.5 笔试真题 - AI 岗

本场考试概述

考试时间:2026 年 8 月 5 日 考试岗位:AI 岗 难度评级:中等

考点分析

  1. 选择题(20 道):线性代数、概率统计、数值计算、机器学习、深度学习、多模态、大模型训练与推理
  2. 第 1 题:基站空间重叠区域识别——DBSCAN 点分类规则模拟 + 曼哈顿距离(简单偏中等)
  3. 第 2 题:多 Agent 协作任务调度——带相邻不同约束的动态规划 + 每层最小值与次小值(中等偏难)

建议策略

  1. 选择题中线性代数占比较高,重点复习向量范数、余弦相似度、矩阵分解、秩与零空间、SVD。
  2. 第 1 题要注意邻域包含点自身,并且必须先确定所有核心点,再判断边界点。
  3. 第 2 题将进度视为 DP 层;若完整枚举“上一个 Agent”和“当前 Agent”会超时,需要用每层最小值、次小值消掉一重枚举。

选择题(20 道)

一、单选题

1、Softmax 定义为 $\operatorname{softmax}(x)_i=\dfrac{e^{x_i}}{\sum_j e^{x_j}}$。当部分 $x_i$ 很大时,正确的数值稳定化实现是?

A. 先对 $x$ 做 L2 归一化 B. 将所有 $x_i$ 除以 $\max(x)$ C. 只把中间变量改为 FP64 D. 将所有 $x_i$ 减去 $\max(x)$ 后再计算 Softmax

答案:D 难度:入门 考点:深度学习—Softmax/数值稳定性 解析:分子、分母同乘 $e^{-\max(x)}$ 不改变结果,而所有指数自变量都变为非正数:

\[\operatorname{softmax}(x)_i =\frac{e^{x_i-\max(x)}}{\sum_j e^{x_j-\max(x)}}.\]

这样指数值落在 $(0,1]$ 内,可避免上溢。归一化或除以最大值都会改变分量间差值。


2、视觉问答(Visual Question Answering,VQA)的典型输入和输出分别是?

A. 输入为图像和文本问题,输出为文本答案 B. 输入为文本,输出为图像 C. 输入为文本答案,输出为图像和问题 D. 输入为图像,输出仍为图像

答案:A 难度:入门 考点:多模态—VQA 解析:VQA 同时理解图像内容与自然语言问题,并生成或选择文本答案。B 更接近文生图任务,D 更接近图像变换任务。


3、某分层强化学习任务依次执行 $A\to B\to C\to D$。$A$ 成功奖励为 $5$;$B$ 成功奖励为 $8$,失败惩罚为 $-8/4$。若 $B$ 失败,还要追加被跳过任务 $C,D$ 的成功奖励 $12,16$ 的平均值作为负惩罚。已知 $A$ 成功、$B$ 失败,总奖励为?

A. $-4$ B. $-11$ C. $-25$ D. $3$

答案:B 难度:中等 考点:强化学习—分层任务/奖励计算 解析:$A$ 的奖励为 $5$,$B$ 的基础惩罚为 $-2$,级联惩罚为

\[-\frac{12+16}{2}=-14.\]

因此总奖励为 $5-2-14=-11$。被跳过的任务不再单独计分。


4、向量 $v_x=[2,3]^T$ 与 $v_y=[4,1]^T$ 的欧氏距离为?

A. $\sqrt{5}$ B. $\sqrt{13}$ C. $\sqrt{10}$ D. $\sqrt{8}$

答案:D 难度:入门 考点:数学—向量范数 解析:差向量为 $[-2,2]^T$,故

\[\lVert v_x-v_y\rVert_2=\sqrt{(-2)^2+2^2}=\sqrt{8}.\]

5、单个人工神经元满足 $x=2,w=1,b=0$,$y=wx+b$,损失 $L=\dfrac12(y-t)^2$,标签 $t=5$。$\dfrac{\partial L}{\partial w}$ 为?

A. $-3$ B. $3$ C. $-6$ D. $6$

答案:C 难度:入门 考点:深度学习—反向传播/链式法则 解析:$y=2$,因此

\[\frac{\partial L}{\partial w} =\frac{\partial L}{\partial y}\frac{\partial y}{\partial w} =(y-t)x=(2-5)\times2=-6.\]

6、一个 $1000\times800$ 的评分矩阵使用截断 SVD,保留秩 $r=50$。若存储 $U\in\mathbb{R}^{1000\times50}$、50 个奇异值和 $V^T\in\mathbb{R}^{50\times800}$,存储空间约减少多少?

A. $88.74\%$ B. $87.74\%$ C. $85.74\%$ D. $86.74\%$

答案:A 难度:中等 考点:数学—SVD/低秩压缩 解析:原矩阵存储 $800000$ 个数,截断 SVD 存储

\[1000\times50+50+50\times800=90050\]

个数,减少比例为 $1-90050/800000\approx88.74\%$。


7、公司 A、B 分别供应 $70\%$、$30\%$ 的芯片,次品率分别为 $2\%$、$4\%$。随机抽到一个次品,它来自 B 的概率约为?

A. $63.2\%$ B. $53.8\%$ C. $46.2\%$ D. $30\%$

答案:C 难度:简单 考点:数学—贝叶斯公式 解析:设 $D$ 表示次品,则

\[P(D)=0.7\times0.02+0.3\times0.04=0.026,\] \[P(B\mid D)=\frac{0.3\times0.04}{0.026}\approx46.2\%.\]

8、设 $x=(1,0,1)$、$y=(1,1,0)$,二者的余弦相似度为?

A. $0.5$ B. $1$ C. $0.707$ D. $0.25$

答案:A 难度:入门 考点:数学—余弦相似度 解析:$x^Ty=1$,且 $\lVert x\rVert_2=\lVert y\rVert_2=\sqrt2$,所以

\[\cos\theta=\frac{x^Ty}{\lVert x\rVert_2\lVert y\rVert_2}=\frac12.\]

9、给定三个点 $(0,1),(1,2),(2,5)$,其二次插值多项式在 $x=1.5$ 处的值为?

A. $3.125$ B. $3.5$ C. $3.75$ D. $3.25$

答案:D 难度:简单 考点:数学—多项式插值 解析:设 $p(x)=ax^2+bx+c$,代入三点可得 $a=1,b=0,c=1$,即 $p(x)=x^2+1$。因此 $p(1.5)=3.25$。


10、RAG 语义检索中,查询向量 $q=[0.8,1.2,1.6,2.0]$,案例向量 $c=[1.0,0.8,1.4,1.8]$。余弦相似度保留三位小数,并按“$\ge0.95$ 为极高匹配,$[0.85,0.95)$ 为高匹配”判断,正确的是?

A. $0.842$,中等匹配 B. $0.989$,极高匹配 C. $0.948$,高匹配 D. $0.896$,高匹配

答案:B 难度:中等 考点:大模型—RAG/语义检索 解析:$q^Tc=7.6$,$\lVert q\rVert_2=\sqrt{8.64}$,$\lVert c\rVert_2=\sqrt{6.84}$,所以

\[\cos(q,c)=\frac{7.6}{\sqrt{8.64}\sqrt{6.84}}\approx0.989.\]

11、最大似然估计(MLE)的核心操作是?

A. 直接把样本均值和方差作为任意分布的参数 B. 先为参数指定先验分布,再计算后验分布 C. 只通过增加样本量得到真实参数 D. 寻找使观测数据出现的似然最大的参数

答案:D 难度:入门 考点:机器学习—最大似然估计 解析:MLE 求解

\[\hat\theta=\arg\max_\theta L(\theta) =\arg\max_\theta P(X\mid\theta).\]

B 描述的是贝叶斯估计,C 是估计量可能具有的相合性,不是 MLE 的定义。


12、评价逻辑回归分类性能的常用指标不包括?

A. 对数损失 B. AUC C. 准确率 D. 均方误差

答案:D 难度:入门 考点:机器学习—分类指标 解析:逻辑回归用于分类,常用对数损失、AUC、准确率等指标。均方误差主要用于回归任务,并非逻辑回归的典型评价指标。


13、端侧推理时,哪项因素最可能使峰值内存显著超过模型文件大小?

A. 中间激活、临时缓冲区与多分支并发执行 B. 输出类别数固定 C. 训练集规模大 D. 标签类别少

答案:A 难度:简单 考点:深度学习—推理部署/内存占用 解析:模型文件主要保存权重,推理运行时还需要中间激活、算子工作区和并发分支的中间结果。训练集通常不会在推理阶段载入。


14、描述一组数据集中趋势最合适的统计量是?

A. 偏度 B. 均值 C. 标准差 D. 方差

答案:B 难度:入门 考点:数学—描述统计 解析:均值、中位数和众数描述数据的中心位置;方差、标准差描述离散程度;偏度描述分布的不对称程度。


15、GSPO 引入序列级重要性采样比率的主要原因是?

A. 缓解长序列中 token 级比率带来的高方差与训练不稳定 B. 消除奖励模型的一切偏差 C. 保证探索能力无限增加 D. 将算法强制变为离线策略

答案:A 难度:困难 考点:大模型—RLHF/策略优化 解析:序列级比率与序列级奖励更一致,可减少长序列逐 token 比率波动和裁剪所引入的不稳定。它并不能消除奖励模型偏差,也不决定算法是否为离线策略。

二、多选题

16、关于单位向量 $v$ 定义的 Householder 矩阵 $H=I-2vv^T$,正确的有?

A. $H$ 是正交矩阵 B. $\det(H)=+1$ C. Householder QR 通常比经典 Gram-Schmidt 数值稳定 D. $H$ 是对称矩阵

答案:A、C、D 难度:中等 考点:数学—Householder 变换/QR 分解 解析:$H^T=H$,且

\[H^TH=H^2=(I-2vv^T)^2=I.\]

因此 H 对称且正交。它在 $v$ 方向上的特征值为 $-1$,其余方向为 $1$,故行列式为 $-1$。Householder 变换也具有较好的数值稳定性。


17、关于早期停止(Early Stopping),正确的有?

A. 可以设置 patience,允许验证指标若干轮没有改善 B. 可依据验证集表现选择合适的训练轮数 C. 验证集最优的模型一定也是测试集最优 D. 它通过减少每轮使用的数据量来实现正则化

答案:A、B 难度:简单 考点:机器学习—正则化/早停 解析:patience 可容忍验证指标的短期波动;早停相当于把训练轮数作为超参数。验证集最优不保证测试集一定最优,且早停限制的是训练进程,而不是每轮的数据量。


18、梯度矩阵 $A\in\mathbb{R}^{1000\times2000}$ 的秩为 $r(A)=500$。下列说法正确的有?

A. 高维零空间意味着存在许多一阶变化为零的参数方向,可能对应平坦区域 B. 零空间维度越高,梯度覆盖的有效方向越少 C. $\dim\mathcal{N}(A)=1500$ D. 增大批次大小必然直接降低零空间维度

答案:A、B、C 难度:中等 考点:数学—秩与零空间 解析:由秩—零化度定理,

\[\dim\mathcal{N}(A)=2000-r(A)=1500.\]

若 $Ad=0$,方向 $d$ 不被当前梯度矩阵覆盖。增大批次可能增加行数,但若新样本梯度没有带来新的独立方向,矩阵秩不会增加,因此 D 的“必然”错误。


19、关于在线逻辑回归,正确的有?

A. 逐样本更新可视为 batch size 为 $1$ 的随机梯度下降 B. AdaGrad 等自适应学习率方法适合稀疏特征场景 C. 面对概念漂移,在线更新通常比一次性批量训练更易适应分布变化 D. 固定学习率一定保证参数严格收敛到全局最优点

答案:A、B、C 难度:中等 考点:机器学习—逻辑回归/在线学习 解析:在线学习持续吸收新样本,适合数据分布变化;AdaGrad 能按维度调节稀疏特征的有效步长。固定学习率的随机梯度通常会在最优点附近波动,不能保证严格收敛。


20、训练大模型时常见的工程实践或稳定性手段有?

A. 学习率预热(warmup) B. 从头到尾固定学习率且不做任何调度 C. 梯度裁剪 D. FP16/BF16 混合精度训练

答案:A、C、D 难度:简单 考点:大模型—训练工程/稳定性 解析:warmup 可降低训练初期发散风险;梯度裁剪抑制梯度尖峰;混合精度降低显存和带宽开销。工程中通常会在 warmup 后继续采用线性或余弦衰减,而非全程固定学习率。


第 1 题:基站空间重叠区域识别

题目描述

无线网络运维需要根据基站的密集程度识别信号重叠区域。给定 $N$ 个平面基站 $P_i(x_i,y_i)$、距离门限 $\varepsilon$ 和邻域数量门限 $MinPts$,定义:

  • 空间邻域:若
\[d(P_i,P_j)=|x_i-x_j|+|y_i-y_j|\le\varepsilon,\]

则 $P_j$ 位于 $P_i$ 的邻域内。邻域包含基站自身。

  • 核心点(Core):邻域内基站总数不少于 $MinPts$。
  • 边界点(Border):自身不是核心点,但邻域内至少存在一个核心点。
  • 噪声点(Noise):既不是核心点,也不是边界点。

请按输入顺序输出每个基站的类别:0 表示 Core,1 表示 Border,2 表示 Noise。

输入格式

第一行包含三个整数 $N,\varepsilon,MinPts$:

  • $1\le N\le2000$;
  • $0\le\varepsilon\le10000$;
  • $1\le MinPts\le N$。

接下来 $N$ 行,每行包含两个整数 $x_i,y_i$,满足 $-10000\le x_i,y_i\le10000$。

输出格式

输出 $N$ 行,第 $i$ 行为第 $i$ 个基站的类别编号。

样例 1

输入

5 1 2
0 0
1 0
-1 0
0 1
0 -1

输出

0
0
0
0
0

每个外围点的邻域都包含自身与原点,邻域规模至少为 $2$,因此五个点都是核心点。

样例 2

输入

5 1 3
0 0
1 0
0 1
5 5
9 9

输出

0
1
1
2
2

原点的邻域规模为 $3$,是核心点;$(1,0)$ 与 $(0,1)$ 不是核心点,但与原点相邻,因此是边界点;其余两个点为噪声点。

思路分析

第一步:统计邻域规模

初始化 count[i] = 1,因为每个基站与自身的距离为 $0$。只枚举 $i<j$ 的点对;若曼哈顿距离不超过 $\varepsilon$,同时增加两端的计数。

第二步:一次性确定所有核心点

\[P_i\in Core\iff count_i\ge MinPts.\]

边界点的定义依赖最终核心点集合,因此不能边统计边判断,否则结果可能受遍历顺序影响。

第三步:标记非核心点

核心点直接输出 0。对每个非核心点扫描核心点集合,只要找到一个距离不超过 $\varepsilon$ 的核心点,就标为 1;否则标为 2

复杂度分析

时间复杂度:$O(N^2)$。邻域计数需要枚举点对;边界点判断最坏也为平方级。 空间复杂度:$O(N)$,用于保存坐标、邻域计数、核心点标记和答案。

Python 代码

import sys


def solve():
    input = sys.stdin.readline
    n, eps, min_pts = map(int, input().split())
    points = [tuple(map(int, input().split())) for _ in range(n)]

    # 邻域包含自身。
    count = [1] * n

    for i in range(n):
        xi, yi = points[i]
        for j in range(i + 1, n):
            xj, yj = points[j]
            if abs(xi - xj) + abs(yi - yj) <= eps:
                count[i] += 1
                count[j] += 1

    # 必须先完整确定核心点集合。
    is_core = [value >= min_pts for value in count]
    core_indices = [i for i in range(n) if is_core[i]]

    answer = [2] * n
    for i in range(n):
        if is_core[i]:
            answer[i] = 0
            continue

        xi, yi = points[i]
        for j in core_indices:
            xj, yj = points[j]
            if abs(xi - xj) + abs(yi - yj) <= eps:
                answer[i] = 1
                break

    sys.stdout.write("\n".join(map(str, answer)))


if __name__ == "__main__":
    solve()

易错点

  1. 漏算自身:邻域包含 $d=0$ 的自身,计数初值应为 1
  2. 距离类型写错:题目使用曼哈顿距离,不是欧氏距离,无需开平方。
  3. 边统计边标边界点:应先确定全部核心点,再判断 Border。
  4. 重复坐标:即使两个基站坐标相同,它们仍是两个不同输入点,彼此都应计入邻域。
  5. 边界为闭区间:距离恰好等于 $\varepsilon$ 时也属于邻域。

第 2 题:多 Agent 协作任务调度

题目描述

一个多 Agent 系统包含 $N$ 个 Agent。每调用一次第 $i$ 个 Agent,任务进度增加 $p_i$ 个百分点,并产生代价 $c_i$。每个 Agent 可以调用任意多次,但不能连续两次调用同一个 Agent。

当累计进度达到或超过 $100$ 时任务完成,允许最终进度超过 $100$。请计算完成任务的最小总代价;若无法完成,输出 -1

输入格式

第一行输入整数 $N$,满足 $1\le N\le10^5$。

接下来 $N$ 行,每行包含两个整数 $p_i,c_i$:

  • $1\le p_i\le100$;
  • $1\le c_i\le10^4$。

输出格式

输出完成任务所需的最小总代价;若无解,输出 -1

样例 1

输入

1
60 5

输出

-1

只有一个 Agent,调用一次后进度为 $60$,第二次调用会违反相邻不同约束,因此无解。

样例 2

输入

3
30 1
40 2
100 50

输出

4

依次调用 Agent 1、Agent 2、Agent 1,进度为 $30+40+30=100$,代价为 $1+2+1=4$。

思路分析

进度只需保留 $0$ 到 $99$:一旦达到 $100$,直接更新答案。由于 $p_i\ge1$,进度严格增加,可以按进度从小到大转移。

朴素状态可定义为:

\[dp[j][i]=\text{累计进度恰为 }j\text{,且最后调用 Agent }i\text{ 的最小代价}.\]

若下一次调用 Agent $k$,需要求

\[\min_{i\ne k}dp[j][i]+c_k.\]

完整枚举 $i,k$ 的复杂度为 $O(100N^2)$,无法通过。注意:从一层状态中排除某个 Agent 后的最小值,只可能是该层的最小值或“属于另一个 Agent 的次小值”。

对每个进度 $j$ 维护:

  • best[j]:这一层的最小代价;
  • best_last[j]:取得最小代价时最后调用的 Agent;
  • second[j]:最后一个 Agent 与 best_last[j] 不同的最小代价。

转移到 Agent $k$ 时:

\[base= \begin{cases} second[j],&k=best\_last[j],\\ best[j],&k\ne best\_last[j]. \end{cases}\]

然后令 new_cost = base + c[k]。若 $j+p_k\ge100$,用它更新答案;否则把 (new_cost, k) 合并到目标进度层的最小值/次小值中。

进度 $0$ 是虚拟起点,没有“上一个 Agent”。令 best[0] = second[0] = 0best_last[0] = -1,即可让第一次调用任意 Agent。

复杂度分析

时间复杂度:$O(100N)$。最多处理 100 个进度层,每层扫描全部 Agent。 空间复杂度:$O(N)$,用于保存所有 $p_i,c_i$;DP 数组长度固定为 100。

Python 代码

import sys


def solve():
    input = sys.stdin.readline
    n = int(input())
    progress = [0] * n
    cost = [0] * n

    for i in range(n):
        progress[i], cost[i] = map(int, input().split())

    inf = 10**30

    # best[j]:进度恰为 j 时的最小代价。
    # second[j]:排除 best_last[j] 后,由另一个 Agent 结尾的最小代价。
    best = [inf] * 100
    second = [inf] * 100
    best_last = [-1] * 100

    # 虚拟起点:第一次调用不受“相邻不同”限制。
    best[0] = 0
    second[0] = 0

    answer = inf

    for current in range(100):
        if best[current] == inf:
            continue

        for agent in range(n):
            if agent == best_last[current]:
                base = second[current]
            else:
                base = best[current]

            if base == inf:
                continue

            new_cost = base + cost[agent]
            next_progress = current + progress[agent]

            if next_progress >= 100:
                answer = min(answer, new_cost)
                continue

            # 将“代价 new_cost、末尾 agent”合并到目标层。
            if new_cost < best[next_progress]:
                if best_last[next_progress] == agent:
                    # 同一 Agent 的状态变优,不影响异 Agent 次小值。
                    best[next_progress] = new_cost
                else:
                    # 原最小值来自另一个 Agent,可成为新的次小值。
                    second[next_progress] = best[next_progress]
                    best[next_progress] = new_cost
                    best_last[next_progress] = agent
            elif (
                best_last[next_progress] != agent
                and new_cost < second[next_progress]
            ):
                second[next_progress] = new_cost

    print(-1 if answer == inf else answer)


if __name__ == "__main__":
    solve()

易错点

  1. 把问题写成普通完全背包:状态必须体现“上一个 Agent”,否则无法检查相邻不同约束。
  2. 次小值定义错误second[j] 必须来自与 best_last[j] 不同的 Agent,而不是简单的第二个数值。
  3. 同一 Agent 刷新最小值时误改次小值:若最小值持有者不变,只更新 best,不能覆盖 second
  4. 达到 100 后仍继续转移:题目在进度达到或超过 $100$ 时即完成,直接更新答案即可。
  5. 单 Agent 特例:若仅有一个 Agent 且 $p_1<100$,最多合法调用一次,答案为 -1;上述 DP 会自然得到该结果。
  6. 初始化不当:进度 $0$ 尚无上一个 Agent,必须允许任意 Agent 作为第一次调用。

小结

  • 选择题覆盖线性代数、概率统计、经典机器学习、多模态与大模型训练推理,既要记住公式,也要理解工程机制的适用阶段。
  • 基站分类题是 DBSCAN 三类点定义的直接模拟,关键是邻域包含自身,以及先确定 Core、再标记 Border。
  • 多 Agent 调度的进度上限只有 100,但 Agent 数可达 $10^5$;每层维护最小值和异 Agent 次小值,可将 $O(100N^2)$ 优化为 $O(100N)$。