端到端读懂一个 transformer 层:前置归一化、注意力、残差、前置归一化、MLP、残差,如此重复。
每个子块此前都是单独介绍的;你还需要看清它们是如何接线组合的,以及整个堆叠是如何叠起来的。
术语表 · 6 个术语
- decoder layer
- 一个 pre-norm 块:x_attn = x + Attention(RMSNorm(x));x_out = x_attn + MLP(RMSNorm(x_attn))。Qwen3.5-0.8B 堆叠了 24 个这样的层。
- residual stream
- 贯穿整座塔全部深度、未经归一化的隐藏状态。每个块都从它读取,并把一个增量写回去。
- sub-block
- 注意力或 MLP。每一层恰好包含两个子块,每个子块都包在自己的归一化 + 残差里。
- hybrid attention
- Qwen3.5 的配方:每第四层使用 softmax 注意力,其余层使用线性变体(GatedDeltaNet)。
- linear attention
- 一种近似注意力,每个 token 占用固定的内存。用一部分精确回忆能力,换取极其便宜的长上下文解码。
- capture point
- 层内一个有名字的位置(pre_attn_input、mlp_output 等),inspector 在这里把激活统计量读出来。
完整的 Transformer 块
前面五章把各个组成部分——注意力、多头与 GQA、RoPE、RMSNorm、门控 MLP——逐一单独介绍,仿佛它们彼此孤立。 事实并非如此。Qwen3.5-0.8B 的 24 个解码器层中的每一层,都按同一种固定模式把它们拼接在一起,然后模型把这个模式堆叠 24 次。本章拉远视角:先看完整的一层,再看由这些层堆成的一座“塔”。
Pre-norm:归一化、子块、残差
Qwen3.5 采用现代的 pre-norm(前置归一化)方案。每一层内部有两个子块(注意力和 MLP),它们的包裹方式完全相同:先归一化输入,对归一化后的副本运行子块,再把结果加回残差流。
两次 RMSNorm、两次残差相加、一次注意力、一次 MLP——这就是完整的一层。下面的 3D 组件把它画成一座又高又窄的塔:残差流从底部贯穿到顶部,塔中你看到的每一个“环”就是这 24 层中的一层。
每个部件各自贡献什么
- 注意力(第 4 章)——整层中唯一让信息跨 token 流动的地方。没有它,每个位置都会各自独立演化。
- 多头与 GQA(第 5 章)——注意力由许多头并行运行,这些头共享一个更小的 K/V 投影池,模型因此能同时关注多种模式,又不会让 KV 缓存膨胀(KV 缓存保存每个 token 的 key 和 value,避免每一步都重新计算——后面有专门一章)。
- RoPE(第 6 章)——在注意力内部施加在 Q 和 K 上的旋转。模型正是靠它知道 token 5 在 token 3 之后,而不需要单独的位置嵌入。
- RMSNorm(第 7 章)——施加在每个子块之前。它把输入的幅度压到大约
sqrt(hidden_dim)≈ 32,让注意力分数和 MLP 激活不会爆炸。 - MLP(第 8 章)——使用 SwiGLU 门控非线性的逐 token 前馈网络。它占据了模型参数中最大的几块之一,是逐 token 特征计算发生的地方。
Qwen3.5 的 24 层中的每一层都有同样的六步结构。右侧的 3D 塔给你的是堆叠视角;这条横带给你的是解剖视角——第 1–22 层被折叠起来,因为它们和第 0 层长得一模一样。
残差流
解码器 LLM 中最重要却最少被点名的概念是残差流:一个逐 token 的向量,从嵌入进入层堆叠,被每个子块写入,最终在顶部被 LM head——把向量变成下一个 token 分数的最终投影(下一章)——读取。层内没有任何操作会替换它——注意力和 MLP 的结果都是加回去的。每一步操作实际上都是 h := h + Δ。
具体来说,用一个只有 4 个槽位的玩具残差流:设 h = [1.2, −0.4, 0.8, 0.3],注意力子块算出 Δ = [0.1, 0.3, −0.1, 0.0]。新的残差流是 h + Δ = [1.3, −0.1, 0.7, 0.3]。 这次写入只轻轻推动了几个槽位——最后一个原封不动地通过,其余槽位也保留了大部分旧值。
下面的动画把这件事演示得很具体:一个隐藏向量、两层的写入(注意力和 MLP 各两次)、顶部的 LM head 读取累积的总和。柱子不断变长,因为每次写入都是严格的加法——残差流从不变短。
这是单个 token 的隐藏状态,画成一根柱子:每个子块向它写入一次修正,柱子随之长高。注意力从左侧写入,MLP 从右侧写入。从来没有任何操作会覆盖它——每次操作都是 h := h + Δ。图中只画了两层;Qwen3.5-0.8B 会做 24 次。
有三点值得注意。第一,这条流从不会变窄——层里没有任何做减法或替换的操作。第二,每个子块读写的都是同一根柱子;它是整张网络共享的一段运行地址空间。第三,顶部的 LM head 读取的是流的顶端——每一层的贡献对最终预测都可见,而不只是最后一层。
示意图——柱高只是残差流幅度的合成替身;Qwen3.5-0.8B 会做 24 次。并非模型的实时输出。
由此带来两个结果。第一,梯度:即使在 24 层的堆叠里,反向传播也能沿恒等路径直接穿过,这正是深层 transformer 能训练起来的原因。没有残差时,梯度(调整权重的训练信号——训练一章会讲)会被每一层的变换(它的雅可比矩阵——这里先不必纠结这个词)反复相乘,跨过这么深的堆叠后往往会消失或爆炸(在向后穿过许多层的过程中缩小到几乎为零,或者越来越大);残差的恒等路径正是让它得以存活的关键。第二,幅度:残差流的 L2(向量的长度——各分量平方和的平方根)随深度增长,因为每一层都加入非零的贡献,而每个单独子块的输出始终很小。右侧的 3D 组件按层输出的逐 token L2 给每个环着色——沿塔向上扫视,可以看到幅度总体在攀升(趋势向上,个别层可能回落),大致呼应动画里不断生长的柱子。
心智模型:把残差流想成一块由全部 24 层共享的工作内存。每一层并不是变换这份表示,而是向一个共享的累加和贡献自己的部分。“思考”就是这个累加过程。
把这座塔读成一次“含义”的攀升
3D 组件按原始幅度(逐 token L2)给每个环着色,而这确实也是 inspector 唯一测量的东西。但在同一座塔之上,还叠着一个更柔软、更难精确指认的故事:残差流携带的内容,往往会随着你向上攀升而发生变化。对标准 transformer 的探针研究提示出一个粗略趋势——靠前的层偏向局部、表层的结构(哪个 token 挨着哪个、基本语法),靠后的层则偏向更抽象、句子层面的含义。请把它当成一种宽松的直觉,而非一次测量:这是人们从训练好的网络里读出的统计倾向,而不是盖在某个具体层上的标签。在这里它甚至更模糊,因为我们的 24 层里有 18 层是 GatedDeltaNet,而不是那类研究大多考察的 softmax 注意力堆叠——所以"靠前→语法、靠后→抽象"这幅图景,对这个特定模型而言充其量是个手势,并不是逐层的保证。
这次攀升你在上一章其实已经见过。注意力一章里的多义性演示喂入了三条 prompt,它们都以字节完全相同的 token ·bank 结尾——金融、航空、河畔——所以 embedding 查表在那个最后位置交给层堆栈的是同一个起点向量,可模型对下一个 token 的预测却彻底分了岔。这正是同一种分岔,如今换个角度读成一次沿塔的攀升:三份副本在底部进入时一模一样,随着上下文不断累积,每一层的写入都把它们再往外推开一点点,直到塔顶它们分别指向·account、·angle 和一个平实的句末。这里并没有提出任何新主张——它只是你已经见过的那次分岔的“深度视角”。
混合注意力:并非每一层都是“全量”的
Qwen3.5 是一个混合堆叠。大多数层使用一种叫 GatedDeltaNet 的快速线性注意力变体;只有每第四层(0.8B 模型上索引为 3、7、11、15、19、23,从 0 计数)使用第 4 章的经典 softmax(QKᵀ/√d) 公式。线性注意力层在长上下文紧张的内存预算下完成几乎全部的跨 token 混合;全量注意力层按固定间隔出现,负责线性注意力做不到的重活——例如精确回看某个早先的 token;第 12 章会展示一个线性层恰好在这件事上失败。3D 组件用更暖的颜色高亮全量注意力层,让你一眼看出这种交错。第 12 章将深入讲解这套混合配方的原理,以及它为什么成了高吞吐开源 LLM 的新默认。
柱条使用对数刻度(512 KB → 512 MB),让固定状态和增长中的缓存都画得下;每根柱条上方的字节数是精确值,随 token 数线性增长。在 256 个 token 时两者相等。
只有 24 层中的 6 层要付这笔随上下文增长的缓存开销;其余 18 层是 GatedDeltaNet,内存恒定。正是这 3:1 的配比(18 线性 : 6 全量)让长上下文依然负担得起。第 12 章(KV 缓存与混合注意力)会深入讲解这套混合配方如何控制总内存。
示意图——字节数由 Qwen3.5-0.8B 的精确维度(head_dim 256、2 个 KV 头)和线性层的固定状态大小计算得出;并非模型的实时输出。
这个组件展示什么
按下 Run,即可为一次前向传播捕获每层全部七个隐藏状态统计量。3D 塔渲染 24 个堆叠的片层——每层一个——按层输出的逐 token L2 着色。拖动可旋转,滚轮可缩放,点击某一层可在侧边面板查看它的统计量。面板里的迷你柱状图沿所选层内的七个捕获点逐一走过,让你追踪信号从层输入、穿过两个子块、再从顶部输出的全过程。
- 每一层的形状完全相同——两组"前置归一化 + 子块 + 残差"——这个形状堆叠了 24 次。
- 残差流的幅度随深度增长,尽管每个单独子块的输出始终很小。
- Qwen3.5 并非纯 transformer——24 层中只有 6 层使用 softmax 注意力,其余运行线性注意力。
自动运行结束后,拖动 3D 塔正对自己,然后分别点击第 3 层和第 4 层。'Layer 3 - Full attention' 标签与 'Layer 4 - Linear attention' 有什么不同?暖色与冷色的环在整座塔上又是如何分布的?