解剖层 · 第 11 / 25 课 · 收官
组装:完整跑一遍真模型
学完这课你能
- 把 7 个零件拼成完整 transformer,能脱稿复述一个 token 从文本到 logits 的全流程。
- 建立「14M 参数模型 = 一摞带形状的小张量的有序运算」的体感;知道参数大头在 untied embedding 两份。
- 会用单步执行 + 张量检查器自查任何中间量(为三期后的自修路)。
拼模型,像看一只透明钟:齿轮咬着齿轮,一眼看到底。前 10 课你已集齐全部零件——这课合上表盖,让整机走一圈。
01全家福
六个零件加一条公路,全部到齐了,可以拼整机。pythia-14m 的完整流程用真实张量名写出来:wte(词表查询)→ 6 × [ln → 注意力 / FFN 并行残差] → ln_f(最后一道归一化)→ lm_head(输出矩阵)。和 GPT-2 的「标准件」比,差异有三处:并行残差(第 10 课)、RoPE(第 9 课)、输出矩阵 lm_head 与 wte 不共享(untied,下面算参数账时会再见到它);归一化都是输入侧 pre-LN(第 8 课)。全流程画出来是这样:
对照图放在实验台里:左边是本站真跑的 pythia 流水线,右边是 GPT-2 标准结构——只标架构差异,不跑权重。这套流程也像一支乐队:各声部各奏各的谱,合起来才成曲——少任何一个声部,整段都得哑。
02一次前向的流水账
以单词 hello 为例,你跟着走一遍,每步形状全列出:文本切成 id,形状 int[1×1];查 wte,变成 float[1×1×128];进入第 1 层——LN 后注意力搬信息、LN 后 FFN 加工,两份输出同时加回主干,形状始终 [1×1×128];这样重复 6 层;过 ln_f 再乘 lm_head,瞬间铺开成 [1×1×50304] 的分数行;softmax 一压,概率出炉。看到了吗?上面那张图,你现在能逐格读下来了。
从头到尾只有矩阵乘、加法、归一化和一个激活,没有任何魔法。实验台的单步执行模式把这十几步拆开,让你一步一步按。
03参数盘点
14M 参数都躺在哪?算总账:wte 是 50304×128 ≈ 644 万参数;lm_head 不共享(untied),又一份 644 万——两份查询表合计约 1288 万,占全部 14M 的九成以上。真正「思考」的部分:每层十来个权重矩阵与偏置(注意力 4 个、FFN 2 个大件加小件),6 层合计约 120 万,再加归一化的 γ/β 零头。这笔账容易算错,先看卡。
04计算量账本
算力账同样透明:每生成一个 token,大约要做两倍于参数量的浮点运算,14M 模型就是约 0.03 GFLOP——这就是它能在你浏览器标签页里毫秒级跑完的原因。换个 124M 的模型呢?本页引擎没有 KV cache,每出一个字都要从头重算整个前缀,上下文一长,单线程 JavaScript 大约要 2–5 秒一个 token:不是引擎慢,是账本上真有那么多活(配上 KV cache 的正式推理框架,同样的模型毫秒级就能出一个字)。
实验台会在每个节点标注计算量(FLOPs)与参数量——「账本」的每一行都摊开给你看。
05回顾与下期预告
到这里盘个账:入门层的三个基石(token、embedding、下一个词预测)和解剖层的七个零件(注意力、多头、FFN、归一化、位置编码、残差流、整机流水线),你全部见过真权重版本。一只 transformer 在你手里已经没有黑盒。
但还有一个最大的问题没答,你肯定也想到了:这些权重数值是哪来的?初始时它们是随机数,是预训练把随机数「练」成了会说话的模型。那是下一期锻造层(第 12 课起,施工中)的故事。
交互实验:全模型流水线(全站交互收口)
引擎加载中…
SVG 架构总图(pythia 真实张量命名:ids → wte → 6×[LN₁→注意力 / LN₂→FFN →⊕ 并行残差] → ln_f → lm_head → softmax → 概率,层数读自 config,架构图零权重可看)。输入短句跑真权重前向后:「单步 / 自动播放 / 重置」逐块高亮推进,每步显示该块输出的形状与 min/max/mean(等宽数值行)+参数量/计算量小账本;点任意块弹张量检查器——该块输出前 8×8 数值热条网格(hover 显数值,附无障碍数值表),并给对应课的「深挖」链接(第 3 课你见过 logits——这里就是它的出生地)。页尾闭环对拍:分步管道 vs 引擎一键 forward。
等待开始下载…
组件挂载点 · 全模型流水线将在下一波接入(架构图与静态形状标注零权重可看)
组件加载失败。
降级方案:架构总图与静态形状标注零权重即可查看;流动动画与张量检查器需要权重,在权重下载或加载失败时显示「加载失败,点击重试」,不白屏,图文正文不受影响。