单头注意力太单薄。把多头注意力、前馈网络、归一化、残差四块积木拼起来,就是一个 Transformer Block。 教学性模拟--可视化均为确定性示意,用以理解原理,非真实模型输出。
一个 Block = 注意力 + 前馈 + 归一化 + 残差。每块解决一个特定问题。
让序列互相关注。多头=多个关注视角同时进行。
逐位置的两层 MLP。模型记忆知识主要在这。
把数值拉回稳定区间,防训练发散。
加一条旁路:x + f(x)。让深网络能训。
把 Q/K/V 切成多份,每份独立做注意力。点下面的头看它关注什么。
the cat sat on the mat
6 个头用 6 种颜色。一个头可能盯着「主语-谓语」,另一个盯「形容词-名词」,还有的只看相邻词。多头 = 多视角并行,最后拼回来。单头表达不了这么丰富的关系。
注意力的输出再过一遍「升维 -> 激活 -> 降维」的两层 MLP。
为什么要先升到 4 倍再降回来?升维 = 投影到更高维空间,在那里更容易做「非线性切分」(靠激活函数),再降回原维度。d_ff = 4 · d_model 是经典比例。FFN 是逐位置的:每个 token 独立过同一个 MLP,不跨 token。模型的大部分参数和「知识」都堆在 FFN 里。
每层的数值幅度会漂,Norm 把它拉回稳定区。两种摆法。
先算子层(注意力/FFN)+ 残差,再归一化:Norm(x + Sublayer(x))。深层训练不稳,需要 warmup 小心调。
先归一化再进子层:x + Sublayer(Norm(x))。残差通路是「干净」的恒等映射,梯度能一路直通到底--深层也稳,所以现代大模型全用这个。
归一化算的是 LayerNorm(按一个 token 的所有维度求均值方差再归一)。现代 LLM 多用它的简化版 RMSNorm(只去均值不动方差,更快)--见第 6 篇。
给每层加一条「跨层旁路」,让信息能直达深处。
如果没有残差,信号每过一层都被「改造」一次,几十层下去最初的输入早被冲没了,梯度也传不回来(梯度消失)。残差把输入原样加回来,相当于让网络学「在原基础上改多少」(残差),而不是从头重建。哪怕某层 f 学到接近 0,信息照样能绕过它直达后面--深网络才训得动。Transformer 每个子层都有一条残差。
假设理想的输出是 H(x)。直接学 H(x) 很难;学残差 F(x) = H(x) - x,再算 x + F(x),等于让网络只需关注「还差多少」。最坏情况 F(x)≈0,输出≈输入,至少不比原来差。这种「可跳过」的结构是 ResNet 能训上百层、Transformer 能堆几十层的关键。
FFN 中间的非线性。演进路径:ReLU -> GELU -> SwiGLU。
把四块积木按 pre-norm 顺序串起来。点 RUN 看数据流过。
"hello"
这就是一个完整的 Transformer Block。下一篇把它堆 N 层,配上 embedding,就是完整的模型骨架。
| 术语 | 一句话 |
|---|---|
多头注意力 | Q/K/V 切多份并行做注意力,多视角 |
FFN | 逐位置两层 MLP(升 4 倍·激活·降回),存知识 |
d_ff | FFN 中间层维度,通常 = 4·d_model |
LayerNorm | 按 token 的各维度归一,稳定数值 |
pre-norm | 先 Norm 再进子层,残差通路干净,深层稳定 |
残差 | x+f(x),学增量、通梯度,深网络能训 |
Block | Norm+MHA+残差+Norm+FFN+残差,叠 N 层成模型 |
一个 Block 变成 N 层模型。三种架构之争,外加一个参数量计算器。