乐于分享
好东西不私藏

华为AI方向实习机考 | 6月24日最新笔试题与解析

华为AI方向实习机考 | 6月24日最新笔试题与解析

写在前面

本次给大家带来2026年6月24日华为AI方向笔试题的3道题,本套题目

本套题涉及到的岗位:AI算法工程师,AI应用开发工程师,AI数据科学工程师等以AI为开头的岗位,统一笔试,不区分部门。

我整理的考试题单+攻略可访问文章底部左侧:阅读原文

第二题:先根据当前序列长度计算动态缩放后的基频,再按相邻两维一组求旋转角度并应用二维旋转公式得到结果;

第三题:先用前缀和  求任意区间变成中位数的代价,再用分段动态规划,并利用决策单调性做分治优化,求出最多  段的最小总代价。

塔子哥的配套刷题网站:codefun2000.com

题号
题目
难度(对标leetcode)
核心做法
2
动态旋转位置编码
中等
模拟
3
最优分段常数量化
困难
动态规划

第1题-选择题(15*6分 + 5*12分)

1、在解码过程中,Beam Search 的主要作用是?

{{ select(1) }}

  • 搜索最优生成路径
  • 减少生成时间
  • 增加多样性
  • 随机采样
2、以下哪项不是 Embedding 在 RAG 中的核心作用?

{{ select(2) }}

  • 将查询与文档映射到同一语义空间,支持向量检索
  • 压缩文档存储空间,减少磁盘占用
  • 通过余弦相似度计算语义相关性
  • 支持跨语言检索(多语言 Embedding)
3、关于Sigmoid激活函数,下列说法错误的是( )

{{ select(3) }}

  • 具有平滑可导的特性,便于反向传播求导
  • 易出现梯度消失问题,不适合深层网络
  • 输出均值为,有利于加快网络收敛
  • 输出范围为,可用于二分类任务的输出层
4、多模态对齐训练中,对比损失(Contrastive Loss)和匹配损失(Matching Loss)的目标不同。以下哪项正确?

{{ select(4) }}

  • 对比损失只优化正样本对,负样本不参与梯度计算;匹配损失优化所有样本对
  • 两者完全相同,只是损失函数形式不同(InfoNCE vs BCE)
  • 对比损失拉近所有正样本对、推远所有负样本对;匹配损失仅优化二分类边界,不关注负样本相对距离
  • 对比损失需要大规模负采样,匹配损失只需要个负样本,因此计算效率更高
5、在自注意力机制中,三个矩阵通常是通过什么方式得到的?

{{ select(5) }}

  • 通过循环神经网络生成
  • 输入向量与三个不同的权重矩阵相乘
  • 随机初始化后保持不变
  • 直接从输入向量复制得到
6、逻辑回归中关于Softmax函数的输出特性,以下哪项是正确的

{{ select(6) }}

  • 所有输出之和等于
  • 输出值可能为负数
  • 对于相同的输入,每次计算输出可能不同
  • 输出值与输入值成线性关系
7、在Transformer模型中,自注意力机制的主要作用是什么?

{{ select(7) }}

  • 对输入序列进行降维处理
  • 生成词嵌入
  • 捕获序列中的长距离依赖关系
  • 将输入序列映射到固定长度向量
8、循环神经网络(RNN)的主要特点是

{{ select(8) }}

  • 处理序列数据
  • 以上都是
  • 权重共享
  • 具有记忆能力
9、已知随机变量的方差,则的值是?

{{ select(9) }}

10、在某自动驾驶传感器数据预处理任务中,系统提取了维的高频特征。为了降低下游神经网络的计算负担,工程师决定使用PCA进行降维。计算协方差矩阵后,提取出最大的前个特征值依次为:。已知所有特征值的总和为。如果业务要求降维后的数据必须保留至少的原始信息(即累计方差贡献率),系统最少需要保留多少个主成分?

{{ select(10) }}

11、在循环神经网络(RNN)中引入长短期记忆网络(LSTM)的主要目的是通过门控机制解决:

{{ select(11) }}

  • 计算过程无法并行的问题
  • 模型的过拟合问题
  • 长距离依赖下的梯度消失或爆炸问题
  • 输入特征的降维问题
12、设是独立同分布的随机变量,且都服从参数为的几何分布,则它们的和服从什么分布?

{{ select(12) }}

  • 几何分布
  • 正态分布
  • 泊松分布
  • 负二项分布
13、Flash Decoding 技术是针对 LLM 推理哪个阶段的优化?

{{ select(13) }}

  • Decode
  • Embedding
  • Tokenization
  • Prefill
14、相比于Sigmoid函数,ReLU(Rectified Linear Unit)的主要优势不包括?

{{ select(14) }}

  • 缓解了梯度消失问题
  • 计算速度更快(只需判断阈值)
  • 神经元的稀疏激活(很多神经元输出为
  • 输出具有以零为中心的特性
15、在标准的 Multi-Head Attention 中,设输入序列长度为,模型隐藏维度为,注意力头数为,每个头的维度为。以下关于其参数量和计算量(FLOPs)的说法,哪一项是正确的?

{{ select(15) }}

  • 参数量为(忽略bias),FLOPs 主要项为,与序列长度呈线性关系。
  • 参数量与序列长度相关,为;FLOPs 主要项为
  • 参数量为;FLOPs 主要项为
  • 参数量为(忽略bias),FLOPs 中与序列长度相关的主要项为,来自矩阵乘法和 attention 加权求和。
16、为什么深层网络中更倾向于使用ReLU而不是Sigmoid?

{{ multiselect(16) }}

  • Sigmoid在两端饱和区域梯度趋近于,容易导致梯度消失
  • Sigmoid的输出不是零中心的,会导致梯度更新呈锯齿状
  • ReLU的计算涉及指数运算,比Sigmoid的简单阈值更高效
  • ReLU的导数在正区间恒为,利于梯度回传
17、在基于近邻关系进行样本归组时,以下哪些问题是常见的挑战?

{{ multiselect(17) }}

  • 对异常点和局部噪声较敏感
  • 大规模数据下近邻搜索开销较高
  • 高维空间中近邻关系可能变得不稳定
  • 不同取值可能导致分组结果差异较大
18、反向传播算法的优势包括

{{ multiselect(18) }}

  • 高效计算梯度
  • 实现简单
  • 适用于深度学习网络
  • 计算复杂度低
19、矩阵的可逆性是线性代数中的重要概念。下列哪些类型的矩阵一定是可逆的(非奇异的)?

{{ multiselect(19) }}

  • 单位矩阵
  • 满秩方阵
  • 零矩阵
  • 行列式不为的方阵
20、关于模型对齐(Alignment)失效场景,以下哪些情况可能导致模型输出有害内容?

{{ multiselect(20) }}

  • 安全微调(RLHF)阶段的数据质量不足
  • 模型推理时的温度参数(Temperature)设置过高
  • 训练数据中包含大量有害言论
  • 攻击者使用了特定的越狱提示词

题解

答案与解析

T1

  • 答案:A.搜索最优生成路径
  • 解析:Beam Search 会保留多个候选路径,尽可能搜索概率较高的生成序列。

T2

  • 答案:B.压缩文档存储空间,减少磁盘占用
  • 解析:Embedding 的核心作用是语义表示与向量检索,不是为了压缩存储空间。

T3

  • 答案:C.输出均值为0,有利于加快网络收敛
  • 解析:Sigmoid 输出范围是,不是零中心化,输出均值不为

T4

  • 答案:C.对比损失拉近所有正样本对、推远所有负样本对;匹配损失仅优化二分类边界,不关注负样本相对距离
  • 解析:对比损失关注样本间相对距离,匹配损失更关注样本对是否匹配的分类边界。

T5

  • 答案:B.输入向量与三个不同的权重矩阵相乘
  • 解析:Q、K、V通常由输入分别乘以不同的线性变换矩阵得到。

T6

  • 答案:A.所有输出之和等于1
  • 解析:Softmax 会将输出转换为概率分布,因此所有类别概率之和为

T7

  • 答案:C.捕获序列中的长距离依赖关系
  • 解析:自注意力可以直接建模序列中任意位置之间的关系。

T8

  • 答案:B.以上都是
  • 解析:RNN 可处理序列数据,具有权重共享和一定的记忆能力。

T9

  • 答案:A.
  • 解析,所以

T10

  • 答案:D.
  • 解析:累计方差贡献率为,达到,因此保留个主成分。

T11

  • 答案:C.长距离依赖下的梯度消失或爆炸问题
  • 解析:LSTM 通过门控结构缓解普通 RNN 难以建模长距离依赖的问题。

T12

  • 答案:D.负二项分布
  • 解析:多个独立几何分布随机变量之和服从负二项分布。

T13

  • 答案:A.Decode
  • 解析:Flash Decoding 主要优化逐 token 生成的 Decode 阶段。

T14

  • 答案:D.输出具有以零为中心的特性
  • 解析:ReLU 输出范围为,并不是零中心化的。

T15

  • 答案:D.参数量为(忽略bias),FLOPs 中与序列长度相关的主要项为,来自矩阵乘法和 attention 加权求和。
  • 解析:标准多头注意力包含Q,K,V和输出投影,参数量约为,注意力计算主要有项。

T16(多选)

  • 答案:A.Sigmoid在两端饱和区域梯度趋近于0,容易导致梯度消失、B.Sigmoid的输出不是零中心的,会导致梯度更新呈锯齿状、D.ReLU的导数在正区间恒为1,利于梯度回传
  • 解析:ReLU 计算简单且正区间梯度稳定;C 中说 ReLU 涉及指数运算是错误的。

T17(多选)

  • 答案:A.对异常点和局部噪声较敏感、B.大规模数据下近邻搜索开销较高、C.高维空间中近邻关系可能变得不稳定、D.不同K取值可能导致分组结果差异较大
  • 解析:K近邻方法受噪声、数据规模、高维空间和K值选择影响较大。

T18(多选)

  • 答案:A.高效计算梯度、B.实现简单、C.适用于深度学习网络、D.计算复杂度低
  • 解析:反向传播能利用链式法则高效计算梯度,是训练深度网络的核心方法。

T19(多选)

  • 答案:A.单位矩阵、B.满秩方阵、D.行列式不为0的方阵
  • 解析:单位矩阵、满秩方阵和行列式不为0的方阵都一定可逆;零矩阵不可逆。

T20(多选)

  • 答案:A.安全微调(RLHF)阶段的数据质量不足、B.模型推理时的温度参数(Temperature)设置过高、C.训练数据中包含大量有害言论、D.攻击者使用了特定的越狱提示词
  • 解析:数据质量、推理参数、训练语料和越狱攻击都可能导致对齐失效。

第2题-动态旋转位置编码(150分)

题目内容

DynamicNTK-awareScaledRoPE 根据当前输入的实际序列长度  调整旋转位置编码()的基频,实现动态位置内插。

  1. 动态缩放因子:,其中  为当前序列长度, 为模型原始预训练长度。

  2. 基频()变换:将原始基频  变换为 ,其中  为编码维度。

  3. 旋转频率计算:位置  在第  对维度索引上的旋转角频率 

  4.  计算:对每对维度  做旋转变换 

实现时请使用  位精度。

输入描述

第  行:,其中  为当前序列长度, 为模型原始预训练长度, 为编码维度, 为原始基频, 为当前位置

第  行:当前序列在位置  处的向量 ,长度为 

输出描述

应用旋转位置编码后的结果,输出保留  位小数,不足  位小数的补 

样例1

输入

368 276 16 1450.9560044215173 209-1.8728 1.3494 1.2030 -0.5053 -1.0223 -0.4466 1.5474 0.0967 0.0820 -2.1588 0.9543 0.0011 -0.0810 0.4860 -0.0258 0.2101

输出

-1.1873 -1.9795 0.3002 -1.2698 -1.0961 -0.2079 1.3933 -0.6801 -2.1600 0.0418 -0.2163 0.9295 -0.3734 0.3215 -0.0806 0.1957

样例2

输入

20 10 16 100.0 121.0 0.0 -1.0 0.5 0.3 -0.2 1.0 0.0 -1.0 0.5 0.3 -0.2 1.0 0.0 -1.0 0.5

输出

0.8439 -0.5366 -0.9001 0.6631 -0.2941 0.2085 -0.0147 0.9999 -1.0526 -0.3769 0.3549 -0.0634 0.9781 0.2080 -1.0476 0.3907

说明

根据输入的信息,当前输入序列长度为 ,超出了模型的原始预训练长度 ,因此需要进行动态位置内插。

已知输入中第  位的向量为 ,长度为 ,现对其做基频变换  后应用  算法,即可得到旋转后的最终结果 

题解

解题思路

本题使用动态  缩放算法调整  的基频,再对向量中每组相邻维度进行二维旋转。

首先根据当前序列长度  和原始预训练长度  计算缩放因子:

然后计算新的基频:

向量按照相邻两个元素分组。对于第  组,其中 ,对应的维度下标为:

该组使用的旋转角度为:

对  应用二维旋转:

依次处理全部  组元素即可。计算过程中使用  精度,最后将每个结果输出为四位小数。

复杂度分析

需要遍历长度为  的向量一次,因此时间复杂度为:

使用一个长度为  的数组保存结果,因此空间复杂度为:

除去返回结果所需空间,额外空间复杂度为 

代码实现

python代码(C++和JAVA代码见在线OJ网址)

import sysimport mathdefdynamic_rope(T, L, D, base, position, x):# 计算动态缩放因子    scale = max(1.0, T / L)# 根据动态 NTK 缩放公式更新基频    new_base = base * math.pow(scale, D / (D - 2))    result = [0.0] * D# 每两个相邻维度进行一次二维旋转for i in range(D // 2):        d = 2 * i        angle = position * math.pow(new_base, -2.0 * i / D)        cos_value = math.cos(angle)        sin_value = math.sin(angle)        result[d] = x[d] * cos_value - x[d + 1] * sin_value        result[d + 1] = x[d] * sin_value + x[d + 1] * cos_valuereturn resultdefmain():    data = sys.stdin.read().split()    T = int(data[0])    L = int(data[1])    D = int(data[2])    base = float(data[3])    position = int(data[4])    x = []for i in range(D):        x.append(float(data[5 + i]))    answer = dynamic_rope(T, L, D, base, position, x)    print(" ".join(f"{value:.4f}"for value in answer))if __name__ == "__main__":    main()

第3题-最优分段常数量化(300分)

题目内容

在模型量化中,当数据分布极度不均匀时,全局统一缩放会造成大量精度损失。一种优化策略是将数据划分为若干连续区间(分段),每段内部使用独立的常数值(代表值)进行近似,从而在保证压缩率的同时最小化总体误差。

本题要求实现一种最优分段算法:给定已排序的数据序列,将其划分为至多  个连续区间,每个区间的所有数据被替换为该区间内的某个代表值(该值不必是输入中的数,但为简化本题,代表值必须是区间中位数取整后的值)。目标是使得所有数与对应代表值的绝对误差之和最小。

输入描述

第  行:

第  行: 个已按非降序排列的整数

  • 量化规则:
  1. 将序列划分为至多  个连续区间

  2. 对每个区间 ,计算其中位数 (若长度为偶数,取下中位数,即第  个数)

  3. 区间误差代价

  • 目标:

在满足区间数量  的前提下,最小化总代价 

输出描述

一个整数,表示最小总代价

样例1

输入

3 11 2 3

输出

2

样例2

输入

5 21 2 10 11 12

输出

3

说明

  • 不分段():中位数是 ,代价 

  • 最优分段():划分为  和 

    第一段中位数 ,代价 

    第二段中位数 ,代价 

  • 总代价 

题解

解题思路

序列已经按非降序排列。对于一个区间 ,把所有数替换成该区间的中位数时,绝对误差和最小。

设中位数位置为:

用前缀和  可以在  时间计算区间代价:

设  表示前  个数恰好分成  段的最小代价,则:

其中t-1<=p<i

由于该区间代价满足  性质,最优决策点具有单调性,可以使用动态规划分治优化,把每一层  的计算优化到 

因为继续拆分区间不会让总代价变大,所以“最多  段”的最优答案可以用“恰好  段”的  表示。

复杂度分析

计算每个区间代价为 

动态规划共有  层,每层使用分治优化计算,时间复杂度为:

只保留上一层和当前层 ,空间复杂度为:

该复杂度适合  的数据范围。

代码实现

python代码(C++和JAVA代码见在线OJ网址)

import sysdefmin_total_cost(n, k, nums):    a = [0] + nums# 前缀和,方便 O(1) 计算区间代价    pre = [0] * (n + 1)for i in range(1, n + 1):        pre[i] = pre[i - 1] + a[i]defcost(l, r):# 区间 [l, r] 的中位数位置        mid = (l + r) // 2# 左侧到中位数的代价        left = a[mid] * (mid - l + 1) - (pre[mid] - pre[l - 1])# 右侧到中位数的代价        right = (pre[r] - pre[mid]) - a[mid] * (r - mid)return left + right    INF = 10 ** 30    prev = [INF] * (n + 1)    prev[0] = 0defcompute(cur, prev, l, r, opt_l, opt_r, t):if l > r:return        mid = (l + r) // 2        best_val = INF        best_pos = opt_l# 枚举上一段结束位置 p        start = max(opt_l, t - 1)        end = min(opt_r, mid - 1)for p in range(start, end + 1):            val = prev[p] + cost(p + 1, mid)if val < best_val:                best_val = val                best_pos = p        cur[mid] = best_val# 利用最优决策点单调性进行分治        compute(cur, prev, l, mid - 1, opt_l, best_pos, t)        compute(cur, prev, mid + 1, r, best_pos, opt_r, t)    k = min(k, n)for t in range(1, k + 1):        cur = [INF] * (n + 1)        compute(cur, prev, t, n, t - 1, n - 1, t)        prev = curreturn prev[n]defmain():    data = list(map(int, sys.stdin.read().split()))    n, k = data[0], data[1]    nums = data[2:2 + n]    print(min_total_cost(n, k, nums))if __name__ == "__main__":    main()