news 2026/9/5 2:13:15

手撕代码题(一):Transformer 与注意力(10 题)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手撕代码题(一):Transformer 与注意力(10 题)

本篇把 Transformer 手撕题按出现频率排了 10 道,每道给考点定位、解题思路、逐行注释的伪代码,以及面试官看你写完后的下一问。伪代码用 Python 风格,面试时用 numpy 或纯 Python 写都行,关键是维度变换每一步说得出口。

题目结构说明:每题四部分。考点定位讲面试官到底在筛什么;解题思路是白板上先写什么后写什么的框架;伪代码逐行注释,# [b, s, d]这种标注就是面试时口述维度的话术,照着说;追问链是写完代码后 80% 会跟上的问题,附一句话答法。标记:⭐ 高频(出现率过半)、🔥 近两年新增。


Q1 手撕 Self-Attention(含缩放与因果掩码)⭐

考点定位:全场出现率最高的一道手撕。面试官在筛三件事:缩放因子写不写、mask 的方向对不对、softmax 沿哪个维度。前两件筛掉背题的,第三件筛掉没跑过代码的。

解题思路:先写签名和维度注释,再按「线性投影 → 缩放点积 → 掩码 → softmax → 加权求和」四步落笔。掩码方向记一句话:上三角是未来,要屏蔽

伪代码

def self_attention(x, W_q, W_k, W_v, d_k):    # x: [batch, seq_len, d_model]    Q = x @ W_q          # [b, s, d_k]    K = x @ W_k          # [b, s, d_k]    V = x @ W_v          # [b, s, d_k] ​    scores = Q @ K.transpose(-2, -1)   # [b, s, s] 每行是 q 对所有 k 的相似度    scores = scores / sqrt(d_k)        # 缩放:点积方差约 d_k,不除会导致 softmax 饱和 ​    # 因果掩码:位置 i 只允许看 j <= i    mask = triangular_ones(seq_len, upper=True) * (-1e9)   # 上三角(未来)填负无穷    scores = scores + mask             # 加负无穷后 softmax 权重趋近 0 ​    attn = softmax(scores, dim=-1)     # 沿最后一维(key 维)归一化,务必说出口    return attn @ V                    # [b, s, d_k]

追问链

  • 「为什么除以 √d_k?」→ d_k 大时点积方差 ≈ d_k,softmax 退化成 one-hot,梯度消失;√d_k 把方差拉回 1。

  • 「mask 为什么加负数而不是置 0?」→ 置 0 仍是合法 score,softmax 后照样分到权重;负无穷才让权重趋近 0。

  • 「softmax 之前还有哪步可以做?」→ 加 QK 偏置或 ALiBi 的距离偏置,都在 score 上动手。


Q2 手撕 Multi-Head Attention ⭐

考点定位:单头注意力几乎人人会,多头的分头与合头 reshape是真正的分水岭。维度变换说不出「先拆最后一维再交换轴」的,基本没自己实现过。

解题思路:核心口诀「先投影、再拆头、算完拼回去」。拆头不引入任何新矩阵,纯 reshape 操作。

伪代码

def multi_head_attention(x, W_q, W_k, W_v, W_o, n_heads):    b, s, d_model = x.shape    d_head = d_model // n_heads          # 一定要整除,面试官可能追问 ​    Q = x @ W_q                          # [b, s, d_model]    # 拆头:最后一维切成 n_heads 段,head 维提到 batch 后面    Q = Q.reshape(b, s, n_heads, d_head) # [b, s, h, d]    Q = Q.transpose(1, 2)                # [b, h, s, d] 变成独立 batch,各自算注意力    K, V = 同样流程(x, W_k, W_v) ​    out = scaled_dot_product_attention(Q, K, V)   # [b, h, s, d],复用 Q1 ​    out = out.transpose(1, 2)            # [b, s, h, d] 拼头第一步:head 维挪回去    out = out.reshape(b, s, d_model)   &nb
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 2:12:10

技术决策中的修复判断:何时优化,何时保持现状

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 2:10:33

STM32麦克纳姆轮全向小车运动控制实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/5 2:08:43

为什么美国律师一开口,就要你的销售数据?

知产纠纷数据应对指南 Guide to Handling Data Requests in US IP Disputes “ 跨境卖家收美国知产律师函&#xff0c;别轻易交销售数据&#xff01;这是对方在评估案件价值、谈判空间。不同阶段披露策略不同&#xff0c;要先辨风险&#xff0c;有边界沟通&#xff0c;避免误判…

作者头像 李华
网站建设 2026/9/5 2:07:37

Flutter OHOS 内存泄漏、稳定性排查相关文档

卡顿丢帧分析文档 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-frame-case ArkTs 内存泄露分析文档 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/guides/ide-arkts-memory-leak-analysis Native 内存泄漏分析 https://developer.h…

作者头像 李华
网站建设 2026/9/5 2:07:35

Agent Skills从入门到工程化(十二):Skill 如何做日志、监控和评估?

Agent Demo 通常只关心“能不能跑通”&#xff0c;但工程系统必须关心“为什么失败、哪里慢、哪个 Skill 常出错、任务是否完成”。没有日志、监控和评估&#xff0c;Agent 系统就是黑盒。 一次调用要记录什么 推荐记录&#xff1a; request_id session_id user_id skill_name …

作者头像 李华
网站建设 2026/9/5 2:06:58

Flutter OHOS 解析flutter相关的cppcrash堆栈

本文介绍如何解析Flutter OpenHarmony化版本 libflutter.so 相关的崩溃堆栈。 1. 介绍 llvm-addr2line 工具是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。一般适用于带有 symbol 信息的so库。 2. 工具位置 在 DevEco Studio 和 Command Lin…

作者头像 李华