华为 · 模拟 · 算法编程题
华为 模拟 时限 1 秒 / 256 MB

题目描述

给定批量序列表示 X(形状:[batch, seq, d_model])与权重矩阵 W_Q、W_K、W_V、W_O(均为 d_model×d_model),实现 Masked Multi-Head Self-Attention。
将最后一维按头数 num_heads 均分,每头维度 d_k = d_model / num_heads。
计算步骤:
1) Q = X @ W_Q,K = X @ W_K,V = X @ W_V。
2) 将 Q、K、V reshape 为 [batch, num_heads, seq, d_k]。
3) 计算注意力分数 scores = (Q @ K^T) / sqrt(d_k),其中 K^T 表示每头在最后两维做转置得到 [batch, num_heads, seq, seq]。
4) 使用下三角因果掩码(只能看见当前及更早位置):掩掉上三角元素(置为一个很小的负数)。
5) 在最后一维做 softmax 得到权重,注意数值稳定性(减去每行最大值再做 exp)。
6) attention = softmax @ V(形状 [batch, num_heads, seq, d_k])。
7) 拼回 [batch, seq, d_model] 后,再右乘 W_O。
输出保留两位小数,结果需转换为 Python List。

输入输出

输入描述
以分号分隔的 6 个参数:num_heads; X; W_Q; W_K; W_V; W_O
其中 X、W_Q、W_K、W_V、W_O 用 Python 风格的嵌套列表表示。
输出描述
最终输出张量(形状 [batch, seq, d_model]),四舍五入到小数点后两位,类型为 List。

样例共 1 组

样例 1 · 权重为单位矩阵,Q=K=V=X。因果掩码使第 i 个位置只看见前 i+1 个位置;由于各位置完全相同,softmax 权重在可见范围内均匀分布,输出与输入一致;乘 W_O(单位)后不变。
输入
2; [[[1, 1], [1, 1], [1, 1]]]; [[1, 0], [0, 1]]; [[1, 0], [0, 1]]; [[1, 0], [0, 1]]; [[1, 0], [0, 1]]
输出
[[[1.00, 1.00], [1.00, 1.00], [1.00, 1.00]]]

算法解析依据充分

考点:模拟

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:模拟

本题切入点

按公式实现:Q/K/V 投影 → 按头 reshape → 缩放点积 → 下三角因果掩码(置极小负数)→ 减行最大值后 exp 做数值稳定 softmax → 拼回再右乘 W_O,结果保留两位。

不涉及复杂算法,把题目描述的流程原样翻译成代码逐步执行即可。

思路框架(模拟 通法 · 非本题专属)

  1. 用变量记录题目要求的「状态」(当前值、剩余数量、当前位置等)。
  2. 按题面给出的顺序,把每一步操作写成一段代码,逐条执行。
  3. 每一步执行后更新状态,并在题目要求的位置输出或累计答案。
  4. 注意循环的边界:执行多少次、何时终止、是否能终止。

实现要点:结构上通常是一个外层循环包住若干 if/else 分支;只要状态定义清楚,正确率很高。

复杂度:时间 O(操作次数) | 空间 O(状态数)

该范式的通法易错点

  • 终止条件写错导致死循环或漏做最后一次操作。
  • 状态更新顺序颠倒(先改了下标又用旧下标)。
  • 题目里「最多 / 恰好 / 至少」的语义差别没区分。

样例解读

样例 1:输入 2; [[[1, 1], [1, 1], [1, 1]]]; [[1, 0], [0, 1]]; [[1, 0], [0, 1]]; [[1, 0], [0, 1]]; [[1, 0], [0, 1] → 输出 [[[1.00, 1.00], [1.00, 1.00], [1.00, 1.00]]]

权重为单位矩阵,Q=K=V=X。因果掩码使第 i 个位置只看见前 i+1 个位置;由于各位置完全相同,softmax 权重在可见范围内均匀分布,输出与输入一致;乘 W_O(单位)后不变。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-9月28号AI岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解