写在前面
本次给大家带来2026年6月24日华为AI方向笔试题的3道题,本套题目
本套题涉及到的岗位:AI算法工程师,AI应用开发工程师,AI数据科学工程师等以AI为开头的岗位,统一笔试,不区分部门。
我整理的考试题单+攻略可访问文章底部左侧:阅读原文
第二题:先根据当前序列长度计算动态缩放后的基频,再按相邻两维一组求旋转角度并应用二维旋转公式得到结果;
第三题:先用前缀和 求任意区间变成中位数的代价,再用分段动态规划,并利用决策单调性做分治优化,求出最多 段的最小总代价。
塔子哥的配套刷题网站:codefun2000.com
第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
输入
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
输入
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()
夜雨聆风