解剖层 · 第 11 / 25 课 · 收官

组装:完整跑一遍真模型

真权重交互 复用已加载权重(未加载则需确认下载 28.1MB) 建议 15–30 分钟

学完这课你能

  1. 把 7 个零件拼成完整 transformer,能脱稿复述一个 token 从文本到 logits 的全流程。
  2. 建立「14M 参数模型 = 一摞带形状的小张量的有序运算」的体感;知道参数大头在 untied embedding 两份。
  3. 会用单步执行 + 张量检查器自查任何中间量(为三期后的自修路)。

拼模型,像看一只透明钟:齿轮咬着齿轮,一眼看到底。前 10 课你已集齐全部零件——这课合上表盖,让整机走一圈。

一只透明外壳的机械钟表,内部多枚齿轮互相咬合,摆轮与发条清晰可见,整机协作运转
类比 透明钟=完整 transformer;每枚齿轮=一个零件;咬合转动=一次前向传播。

01全家福

六个零件加一条公路,全部到齐了,可以拼整机。pythia-14m 的完整流程用真实张量名写出来:wte(词表查询)→ 6 × [ln → 注意力 / FFN 并行残差] → ln_f(最后一道归一化)→ lm_head(输出矩阵)。和 GPT-2 的「标准件」比,差异有三处:并行残差(第 10 课)、RoPE(第 9 课)、输出矩阵 lm_head 与 wte 不共享(untied,下面算参数账时会再见到它);归一化都是输入侧 pre-LN(第 8 课)。全流程画出来是这样:

以下一组 ×6 层(并行残差,第 10 课) 注意力(Q/K 带 RoPE) 从别处搬信息 FFN 本地深加工 tokens 文本 → id embedding 查表 → 128 维 取 x 取 x 汇入 汇入 ln_f 最后一道 LN lm_head → 50304 分数 softmax 分数 → 概率 概率 从头到尾只有矩阵乘、加法、归一化和一个激活——没有任何魔法
结构 全课程最完整的一张:id 查表成向量;6 组注意力/FFN 汇回主干;最终 LN 后 unembed 成概率。

对照图放在实验台里:左边是本站真跑的 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 万,再加归一化的 γ/β 零头。这笔账容易算错,先看卡。

第 1 课埋的伏笔在此回收:词表越大,两份 embedding 越肥。模型社区甚至实测过:某些标称 33M 的小模型,把两份查询表算全后体积数倍于标称——「参数量」宣传口径的水,就藏在这张表里。

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。

组件挂载点 · 全模型流水线将在下一波接入(架构图与静态形状标注零权重可看)