AI by Hand:用纸笔手算Transformer前向传播的练习手册
2026/9/16 12:00:50 网站建设 项目流程

AI by Hand 不是又一个大模型仓库,也不是一键部署工具。它是一套把 GPT、BERT、Transformer 这类模型的前向传播过程,拆成“可以用铅笔在纸上一步一步写完”的 AI 练习手册。作者之一就是做《The Illustrated Transformer》图解 AI 内容的那位。所以它的风格非常直接:不给你一行 Python,也不要求你装显卡驱动,而是把注意力公式、矩阵乘法、Softmax 这些概念铺在一张纸上,让你真算一遍。

这次我们来看 AI by Hand 能解决什么问题。很多同学学 Transformer 时都有一种困惑:代码能跑通,面试却说不清 Q、K、V 分别是什么;看了一堆架构图,自己推导时又总在“除以根号 d”这个位置卡住。AI by Hand 想解决的问题就是这个:不用 GPU、不用 CUDA、不用下载模型,用一支笔把计算过程走完。核心方法是一边画矩阵,一边通过手算完成一次完整的小规模前向传播。

如果你关心的是“如何跳过黑盒理解大模型”“如何用最小成本验证自己真的懂了”,这篇文章可以直接收藏。下面我会梳理 AI by Hand 的玩法、手算流程、环境要求,并给出一套“先手算、再用 Python 数值核对”的可执行验证方式。本文不会教你跑 70B 模型,而是帮你在一个 2×2 的小例子上,亲手推出注意力矩阵。

1. AI by Hand 核心能力速览

在开始之前,先把关键信息列出来,方便快速判断这个项目适不适合你。

能力项说明
项目类型AI 教育练习手册,不是推理引擎或模型仓库
主要学习内容Transformer、GPT、BERT、注意力机制、词嵌入、Softmax、KV Cache 等概念的前向手算
练习方式在教材或练习页上手工填写矩阵、画出每一步计算结果
硬件要求纸 + 笔即可;推荐显示器或平板看教程
GPU / 显存不需要 GPU,核心练习不占用显存
CPU / 内存零基础练习不需要电脑;若用 Python 数值验证,任意现代 CPU 足够
代码语言教材主体不是代码,需要验证时可配合 NumPy
是否支持 API项目本体不提供 API,可自行接大模型接口辅助批改(下面会讲)
是否支持批量任务支持“批量练习”,可用脚本批量出题、批量核对
适合场景从底层理解大模型、算法面试复习、课程教学、内部技术分享
不适合场景不想动手算、只想快速调库、需要实际推理生成内容

从资源门槛来看,AI by Hand 的下限比大多数 AI 工具都要低:不需要下载权重,不需要安装依赖,不需要联网跑推理。真正的门槛只有一个:你是否愿意坐下来,把矩阵乘法算一遍。

2. 适用场景与使用边界

AI by Hand 最适合三类人。

第一类是刚入门的大模型应用开发者。你已经在用 OpenAI API,也在跑 ComfyUI,但对注意力机制的理解还停留在“里面有个 QKV”。手推一次注意力,比你读十篇图解博客更有用。

第二类是准备面试的算法工程师。Transformer 相关的面试题非常容易问到底层推导:为什么除以根号 d?为什么 Softmax 前要对齐维度?手算过一次之后,这些问题基本不会丢分。

第三类是高校讲师、培训讲师。AI by Hand 里的手算练习很适合放进课件,作为课堂的动手环节。我实际带团队学习时,发现手算题比 PPT 讲解更能暴露“以为自己懂了,其实没懂”的误区。

需要特别说明使用边界。

第一,AI by Hand 不是软件,不能“安装后调用”。如果你把它当成本地模型来用,会非常失望。

第二,它是教学材料,版权归作者所有。个人学习、手抄练习通常没问题,但如果要复刻、分发、做成商业课件,需要先确认对应的授权许可。网上能找到的电子版本来源复杂,请优先使用正版渠道,不要传播扫描版或盗版资源。

第三,学习过程中你会手写大量结构示意。如果你要把推导过程发到公开博客、GitHub 或课程平台,最好重新绘制,并标注知识来源。这不只是礼貌问题,也是版权合规要求。

3. 原理拆解:AI by Hand 到底手算什么

AI by Hand 的练习内容,可以理解为把一个完整的 Transformer 前向传播“拆成几十个手写小步骤”。我们不需要从 GPT 的千亿参数开始推,而是从最小组件开始。

3.1 词嵌入与矩阵乘法的直觉

Transformer 的输入是一段文本。文本不能直接做乘法,所以要先映射成向量。这部分非常适合作手写练习:给定一个小词表,查表拿到每个 token 的向量,再乘一个权重矩阵,得到新的表示向量。

假设输入一句话只有两个单词,每个单词用一个 2 维向量表示,那么输入就是一个 2×2 矩阵。

手算时要明确这件事:矩阵乘法中,行是 token,列是特征;权重矩阵的行列变化决定了输出的维度。绝大多数手算错误,都发生在“维度对不上”这一步。

3.2 注意力机制中的 QKV

Self-Attention 是 AI by Hand 的核心练习对象,也是整个项目最有价值的章节。它想让你亲手验证一件事:

Q、K、V 并不是凭空出现的三个向量,而是由同一个输入矩阵分别乘上三个权重矩阵得到的。

  • Q:我要查什么
  • K:我有哪些内容可以被查
  • V:我实际想取出的信息

从一个非常小的例子出发,假设输入矩阵 X 是两个 token 的向量,分别记为 x1 和 x2。先把 X 和 Wq 相乘得到 q1、q2,和 Wk 相乘得到 k1、k2,和 Wv 相乘得到 v1、v2。

接下来,用 q1 分别和 k1、k2 做点积,就得到“第一个 token 对第一个 token 的注意力分数”和“第一个 token 对第二个 token 的注意力分数”。

手算时通常会写成四步:

  1. 计算 q1 与 k1 的点积,记作 score11
  2. 计算 q1 与 k2 的点积,记作 score12
  3. 对 score11、score12 除以根号 d
  4. 做一次 Softmax,得到权重

最后把 v1、v2 按权重相加,得到第一个 token 对应的注意力输出。

如果你手动走完这两行的计算,就会发现 QKV 的直觉并不复杂:它做的是“加权求和”,权重来自 token 之间的相关性。手算的过程虽然慢,但能让你真正看到矩阵的形状变化和数值流动。

3.3 从单头注意力到完整 Block

单头注意力算完,AI by Hand 通常会引导你继续补全 Transformer Block 的剩余部分:残差连接、LayerNorm、前馈网络 FFN,以及 GPT 这种自回归模型在生成下一个 token 时如何利用 KV Cache。

这部分的练习价值在于:代码层面的model.forward()可能只有一行,但手算会把这一行展开成十几个公式。当你把这一整套流程在纸上走过一遍,再回去看开源代码里的 tensor shape,就会顺畅很多。

4. 手算练习环境准备

AI by Hand 是少有的“几乎不需要环境准备”的 AI 学习项目。核心准备物如下:

物品数量和用途
A4 纸或练习册建议不少于 20 页,用于推导和重复训练
铅笔或中性笔记录矩阵数值
橡皮算错时方便修改
计算器可选项,用于验证小数计算
Python 环境可选项,用于生成题目和核对答案

如果要配合 Python 验证,环境准备也很轻量:

# 可选:创建独立虚拟环境 python -m venv ai-by-hand-venv # 激活环境,Windows 和 Linux/macOS 命令不同 # Windows: ai-by-hand-venv\Scripts\activate # Linux/macOS: source ai-by-hand-venv/bin/activate # 安装 numpy 即可,不需要 torch,不需要 CUDA pip install numpy jupyter

版本方面,NumPy 1.24 以上都可以。如果你已有 Python 3.9 以上环境,直接安装 NumPy 即可。这个项目本身不依赖深度学习框架,甚至不装 Python 也能学习。

如果你的练习册是电子版或需要跟着屏幕画网格,可以准备一块平板和一个支持手写的笔记 App。不过传统纸笔反而更容易专注。

5. AI by Hand 手写练习流程

下面给出一套可执行的“纸笔练习 + 代码验证”流程。你不需要一次做完,小步走会更稳。

5.1 建议按章节顺序推进

AI by Hand 的练习设计是由浅入深。建议不要跳着读,按下面顺序推进:

  1. 词嵌入与 Token 向量化
  2. 矩阵乘法与为什么形状匹配很重要
  3. 单头注意力的手算前向
  4. 缩放点积与 Softmax 计算
  5. 多头注意力的合并逻辑
  6. 残差连接与 LayerNorm
  7. FFN 和完整 Transformer Block
  8. GPT 自回归生成过程中的 KV Cache

每节花 30 分钟到 1 小时,比一次性刷完整本效果好得多。

5.2 手算输出格式

建议在 A4 纸上画一个统一的推导模板:

  • 输入矩阵写在左上角
  • 中间步骤写权重矩阵的 shape 变化
  • 所有中间矩阵都标注行名和列名
  • 最后留一块区域写结论,和代码输出对比

这个习惯能避免一个常见问题:只算对数值,不知道位置对应哪个 token。

5.3 判断一次手算是否成功的标准

我认为有两个验收标准。

第一个是数值自洽:把每一步除法后的结果保留两位小数,下一轮继续用这个结果计算,答案不应出现明显跑偏。

第二个是形状自洽:从输入 X 的 shape,能够口头说清每一步变换后的 shape。如果每次都要回头看公式,说明还没形成直觉。

建议先选一个两行两列的小例子,把注意力输出算出来,再和 6.1 节的 Python 结果比较。误差控制在 1e-2 以内,基本可以认为手算过程没有问题。

5.4 手算中经常被忽略的“除以根号 d”和 Softmax 稳定性

很多初学者在练习时会忽略两个细节。

第一,注意力分数要除以根号 d,其中 d 是单个头的维度。如果 d=2,那么除数就是根号 2。如果不除,数值会偏大,Softmax 之后概率分布会更尖锐,这会影响梯度的稳定性。

第二,手算 Softmax 时要留意 exp 增长速度。比如输入分数是 [0.7, 0.0],需要先计算出 exp(0.7)≈2.0138 和 exp(0.0)=1,总和约 3.0138,因此两个概率分别约为 0.668 和 0.332。如果输入分数很大,比如 [5.0, 4.0],手算会比较吃力。这时可以把每个分数先减去当前行的最大值再做 exp,数值不变,但计算量更小。

写完这几个步骤,你已经完成了手算前向传播的主要流程。接下来,用代码进行一次数值核对。

6. Python 数值验证:不装 GPU 也能核对结果

AI by Hand 本身不需要代码,但我强烈建议用一段非常小的 NumPy 代码做“自动判分”。先手算,再把结果和 Python 输出对比,这是最快暴露理解漏洞的方式。

6.1 最小 Self-Attention 验证脚本

下面代码直接用单位权重矩阵做简化,方便你在纸上复现每一步。为了让计算最简单,输入两个独立的 one-hot 向量。

import numpy as np def softmax(z): # 按行做减最大值操作,数值更稳定 e = np.exp(z - z.max(axis=-1, keepdims=True)) return e / e.sum(axis=-1, keepdims=True) # 两个 token,每个 token 用 2 维向量表示 X = np.array([ [1.0, 0.0], # token1 [0.0, 1.0] # token2 ]) # 为了便于手算,这里把三个权重矩阵都设为单位阵 Wq = np.eye(2) Wk = np.eye(2) Wv = np.eye(2) q = X @ Wq k = X @ Wk v = X @ Wv d_k = q.shape[-1] # 这里等于 2 scale = np.sqrt(d_k) # 根号 2 ≈ 1.4142 scores = q @ k.T / scale attention = softmax(scores) output = attention @ v print("scores:") print(scores) print("attention weights:") print(attention) print("final output:") print(output)

按这个脚本运行,你会得到 attention weights 大约为:

[[0.6697, 0.3303], [0.3303, 0.6697]]

因为这里 v 是单位矩阵,所以 final output 和 attention weights 相同。手算时可以用这个结果作为参考答案。这个例子看起来非常小,但它完整覆盖了注意力机制中的所有关键步骤。手算一遍后再看代码,你会发现代码里的每个矩阵运算都能在草稿纸上找到对应位置。

6.2 手算结果和代码对不上的排查技巧

如果你手算的结果和 Python 输出不一致,优先排查四点:

检查项说明
是否少乘了权重矩阵有些入门推导会直接让 q=k=v,但那只是特例
点积方向是否正确q @ k.Tk @ q.T会导致结果行方向不同
是否漏掉除以根号 d漏掉后概率分布会偏尖锐
Softmax 是按行还是整列注意力分数矩阵中同一行对应同一个 query,必须按行做 Softmax

如果代码里数字对不上,不要急着怀疑算力,先回到公式重新推导。多数情况下是维度或行方向搞错了。

6.3 批量练习题生成器

AI by Hand 这类项目很适合“反复练习”。与其在书上只算一个例子,不如用脚本批量生成带答案的练习。下面是一个练习集生成器,它会生成若干个随机权重矩阵,并把参考答案写入 JSON 文件,方便之后核对。

import json import numpy as np def softmax(z): e = np.exp(z - z.max(axis=-1, keepdims=True)) return e / e.sum(axis=-1, keepdims=True) def make_case(seed, seq_len=2, dim=2): rng = np.random.default_rng(seed) X = rng.normal(size=(seq_len, dim)) Wq = rng.normal(size=(dim, dim)) Wk = rng.normal(size=(dim, dim)) Wv = rng.normal(size=(dim, dim)) q = X @ Wq k = X @ Wk v = X @ Wv scores = q @ k.T / np.sqrt(dim) attention = softmax(scores) output = attention @ v return { "seed": int(seed), "X": X.tolist(), "Wq": Wq.tolist(), "Wk": Wk.tolist(), "Wv": Wv.tolist(), "attention": attention.tolist(), "output": output.tolist() } if __name__ == "__main__": exercises = [] for i in range(5): exercises.append(make_case(seed=100 + i)) with open("ai_by_hand_exercises.json", "w", encoding="utf-8") as f: json.dump(exercises, f, ensure_ascii=False, indent=2) print("生成 5 道练习题,答案已保存到 ai_by_hand_exercises.json")

使用这套脚本,你可以把“手算练习”做成可批量执行的任务:每拿到一道题,先只看XWqWkWv手算,再打开 JSON 文件的第九个字段核对attentionoutput。整个过程和传统“试卷 + 答案”很像,但答案完全可复现,不会因为教材印刷错误产生纠纷。

7. 为什么这个项目不依赖 API,但可以用 AI 做配套批改

AI by Hand 项目本身不提供接口 API,也没有服务端可以调用。它的价值在于“离线手算”,和“在线 API 调用”是两条路线。

但这不意味着你不能用 AI 工具帮助学习。我提供一个通用思路:把手写推导的中间步骤拍照或转录成文本,然后请大模型接口做逻辑检查。

常见的做法是写一个本地校验脚本,把结构化结果发送给大模型。下面是一个极简请求模板,实际使用时需根据你当前使用的服务商 API 调整地址、鉴权方式和参数:

import requests import json prompt = """ 请检查下面这组手算 Self-Attention 步骤是否正确: 1. q1=[1.0, 0.0] 2. k1=[1.0, 0.0], k2=[0.0, 1.0] 3. score11 = 1.0, score12 = 0.0 4. 除以根号2后,score11≈0.7071, score12≈0.0 5. softmax后权重约为[0.6697, 0.3303] 请指出步骤中可能存在的问题。 """ # 这里只是模板,接口地址和参数请按实际使用的服务文档修改 url = "https://your-llm-api.example.com/chat/completions" headers = { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json" } payload = { "model": "your-model-name", "messages": [ {"role": "user", "content": prompt} ] } response = requests.post(url, headers=headers, json=payload, timeout=60) print(response.json())

需要注意三点:

  • 不要把未授权私密内容或整本版权教材上传到第三方服务。
  • 大模型回答只能作为“提示”,不能代替你从公式层面验证数字。
  • 如果服务返回超时,请先降低请求频率,再检查网络和接口鉴权配置,不要直接提高并发测试。

8. 资源占用与性能观察

这一节对 AI by Hand 来说比较特殊,因为它不是一个推理程序。

纸笔练习的资源占用是零:不需要显存,不需要 CPU。如果配合 Python 练习,也基本属于“瞬间执行”的范畴,因为示例矩阵都非常小。

我用了一个比较小的示例来演示,代码在普通笔记本上运行的时间基本可以忽略。如果你打开任务管理器,会看到 Python 进程短暂出现,然后很快结束。这不是项目性能差,而是矩阵规模太小,不足以产生可观测压力。

如果你把矩阵规模扩大,比如让seq_len=512dim=64,NumPy 仍可以处理,但你会看到 CPU 占用上升。想要降低压力,可以按批处理,每次只算一个 mini-batch,中间结果及时写入磁盘。这种观察方式比盯着模型大小更符合学习项目的特点。

显卡方面,nvidia-smi 基本用不上。你不需要检查显存占用,也不需要验证 CUDA 是否可用。正因为 AI by Hand 不接触 GPU,它才可以成为你“降噪”学习的最佳工具。

9. 常见问题与排查方法

问题现象可能原因排查方式解决方案
手算数字和答案差很多矩阵乘法顺序或转置搞错检查q @ k.T是否写成k @ q.T统一先用小例子逐个核对 shape
Softmax 结果不合理没有按行做 Softmax,或数值溢出打印中间scores矩阵并人工判断使用减最大值的稳定 Softmax
注意力分数偏大漏掉“除以根号 d”对比公式中的缩放系数检查 d 是单头维度还是总维度
Python 报维度不匹配矩阵 shape 设计错误打印所有中间矩阵的.shape在纸上先标注每个步骤的 shape
计算占用感觉高矩阵规模设置过大打开系统任务管理器观察缩小 seq_len 和 dim
想用 API 批改但没有密钥当前没有可用的模型服务先不接 API,直接用 NumPy 核对离线脚本已经足够做基本判定
练习题生成后无法复现随机种子不一致检查所有seed参数使用固定seed或直接保存矩阵数据
手抄练习册内容并公开忽略版权许可查阅授权说明改为个人整理 + 自制图示

经常看到有人问:是否需要一张好显卡才能理解 Transformer 底层原理。答案是不需要。AI by Hand 最推荐的环境恰恰是“远离显卡”的环境。

10. 最佳实践与使用建议

如果你准备用 AI by Hand 做系统学习,我有几条比较务实的建议。

第一,第一次练习务必使用 2 维或 3 维向量。不要一上来就复现 512 维的注意力。向量维度过大时,手算会陷入大量无意义的算术,偏离学习主线。先在 2 维上把流程走通,再扩大到 4 维观察模式,性价比最高。

第二,把“手算答案”和“代码答案”放进同一个表格。每步留一列写中间结果,例如 scores、除以根号 d 后的结果、Softmax 输出。这样一旦出错,你能定位到具体是哪一步,而不是笼统地知道结果不对。

第三,不要忽略计算过程,只看结论。手算的意义在于体验数值流动。尤其在 Softmax 和矩阵乘法这里,看 100 遍公式不如自己写 10 个数字。

第四,批量练习时加日志。如果你按 6.3 节生成几十道题,不要把答案直接写在题纸上。可以使用logs目录保存每道题的 seed 和手算结果,遇到失败题目再回头排查。

第五,手算要控制时间。理想的半成品状态是:单个 2×2 注意力例子的完整手算能在 15 到 20 分钟内完成。如果超过 1 小时,说明你对矩阵乘法或概念还不够熟,停下来重新看公式比较好,不建议硬刷题。

第六,尊重版权和隐私。使用 AI 辅助批改时,不要把没有授权的内部文档、私人笔记或完整教材内容发给第三方服务。个人推导过程通常没有问题,但公开展示时要重新组织内容并注明来源。

第七,把这个练习纳入团队分享。让团队里每个人手推一个不同的小例子,再互相检查,效果往往比一个人闷头苦学好很多。

11. 总结与下一步

AI by Hand 最值得尝试的地方,是它用极低的硬件门槛补足了大多数开发者在大模型学习中的短板:不是不知道注意力公式长什么样,而是没有亲手走过一次完整的数值计算。

建议你拿到项目后的第一件事,不是翻完整本教材,而是先找一个两行两列的小例子,手推一次 Self-Attention:写清 X、Wq、Wk、Wv,再算 q 与 k 的点积、除以根号 d、Softmax、最后乘 v。这个完整流程大概需要 15 到 20 分钟。完成之后,用文章里的 Python 脚本核对一次。如果结果停留在 0.001 级别,说明你已经建立起了最基本的数值直觉。

最容易踩的坑有两个:一个是矩阵转置方向搞错,导致注意力行顺序颠倒;另一个是忘记除以根号 d,导致 Softmax 后的分布太尖锐。这两个坑适合写进自己的错题本。

后续要继续扩展的方向,可以考虑把同样的“手算 + 代码验证”思路迁移到多头注意力、KV Cache,以及一个小型 GPT 的完整前向过程。等你能够不看公式,只凭代码 tensor shape 说出每步的矩阵形状,再回头阅读大模型源码时,障碍会小很多。

建议收藏备用。学完 AI by Hand 之后,再去看其他本地部署、模型微调或者 API 开发内容,你会更清楚底层究竟在发生什么。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询