Skip to content

Transformer Block

Attention 只完成跨 token 的信息路由与聚合;一个完整 Transformer Block 还需要把多 Head 结果重新融合、写回 residual stream,并通过 FFN 继续加工每个位置的特征。

典型 Pre-Norm Block 可以压缩为两行:

H=X+MHA(Norm(X))X=H+FFN(Norm(H))

功能上:

text
Attention
→ 跨 token 通信

FFN
→ token 内部计算

Residual
→ 信息 / 梯度主干

Norm
→ 稳定子层输入尺度

1. 从多个 Head 到统一表示

设:

XRn×dmodel

经典 MHA 中:

h×dhead=dmodel

例如:

n=100,dmodel=512,h=8,dhead=64

单个 Head 输出:

headiR100×64

8 个 Head 沿 hidden dimension 拼接:

C=Concat(head1,,head8)R100×512

Concat 在做什么?

假设两个 Head 对某个 token 分别输出:

head1=[a,b],head2=[c,d]

Concat:

[a,b,c,d]

它只是把不同 Head 的特征保留下来并排列在同一个向量里,并没有完成充分的跨 Head 特征重组。


2. Output Projection WO

Multi-Head Attention 完整输出不是停在 Concat:

O=Concat(head1,,headh)WO

经典情况下:

WORdmodel×dmodel

因此:

ORn×dmodel

WO 负责:

  • 将不同 Head 的特征重新线性组合;
  • 允许跨 Head 信息混合;
  • 将结果映射回 residual stream 使用的统一 hidden space。

所以:

text
Head 1 ─┐
Head 2 ─┤
...     ├→ Concat → W_O → MHA Output
Head h ─┘

3. 为什么还要 Residual

Attention 子层不会简单地:

XO

Pre-Norm 中是:

H=X+MHA(Norm(X))

可以把子层看成学习一个增量:

XX+ΔX

即:

不要求每层重新生成完整表示,而是在当前 hidden representation 上学习应该增加什么修正。


4. Residual 的信息与优化意义

一般形式:

y=x+F(x)

信息角度

原始表示存在直接路径:

text
x ─────────────────┐
                   + → y
x → F(x) ──────────┘

因此深层网络不需要每一层都完全覆盖已有信息。

梯度角度

yx=I+F(x)x

相比:

y=F(x)

Residual 多出一条 identity path,对深层网络中的梯度传播和优化稳定性很重要。

这不意味着所有梯度问题被完全消除,而是网络结构中存在更直接的信息和梯度路径。


5. 为什么子层最后要回到 dmodel

Residual 需要:

X+O

因此二者维度必须兼容。

若:

XRn×dmodel

则 MHA 最终也要输出:

ORn×dmodel

FFN 虽然中间会升维,最终也必须降回 dmodel,才能再次写回 residual stream。


6. Norm 到底归一化什么

传统 LayerNorm 对单个 token 的 hidden feature dimension进行归一化。

设一个 token:

xi=[xi1,xi2,,xid]

其中:

d=dmodel

均值:

μi=1dj=1dxij

方差:

σi2=1dj=1d(xijμi)2

标准化:

x^ij=xijμiσi2+ϵ

随后还可以使用可学习的缩放和平移参数:

yij=γjx^ij+βj

若:

XR128×4096

可以理解为:

text
Token 1 的 4096 维 → 单独归一化
Token 2 的 4096 维 → 单独归一化
...

LayerNorm 不负责让不同 token 发生通信;跨 token 交互仍由 Attention 完成。

现代 LLM 常用 RMSNorm,第二课单独学习。


7. Pre-Norm 与 Post-Norm

Post-Norm

原始 Transformer 典型结构:

H=Norm(X+MHA(X))

数据流:

text
X → MHA → +X → Norm

Pre-Norm

现代深层 Transformer / LLM 更常见:

H=X+MHA(Norm(X))

数据流:

text
X ───────────────────┐
│                    │
↓                    │
Norm                  │
↓                    │
MHA                   │
↓                    │
+ ←──────────────────┘

H

注意:

Residual 加回来的是原始 X,不是 Norm(X)

不要写成:

Norm(X)+MHA(Norm(X))

Pre-Norm 让 residual stream 保持更直接的 identity path,这对很深的 Transformer 训练稳定性有重要价值。


8. Attention 子层之后已经包含上下文

完成:

H=X+MHA(Norm(X))

后,当前位置的 Hi 已经包含:

  • 原始 hidden representation;
  • 从其他可访问 token 聚合来的信息;
  • 多个 Head 的不同子空间结果;
  • WO 对 Head 特征的重新组合。

因此后面的 FFN 虽然不直接访问其他 token,处理的依然是已经上下文化的表示。


9. FFN:Position-wise 非线性计算

经典形式:

FFN(x)=W2σ(W1x+b1)+b2

对序列中的每个位置分别应用同一套参数:

FFN(h1),FFN(h2),,FFN(hn)

所以:

text
Attention
→ token 与 token 之间的信息通信

FFN
→ 每个 token 自己的 feature dimension 上进一步计算

FFN 不在这个子层里直接混合不同 token,但输入 hi 已经包含 Attention 聚合来的上下文。


10. 为什么 FFN 必须有非线性

如果只有:

y=W2W1x

令:

W=W2W1

则:

y=Wx

多层线性变换仍然等价于一层线性变换。

即使有 bias:

y=W2(W1x+b1)+b2

展开:

y=W2W1x+W2b1+b2

令:

W=W2W1,b=W2b1+b2

仍然只是:

y=Wx+b

即一个仿射变换。

所以:

Bias 不等于非线性。

加入 ReLU / GELU / SiLU / SwiGLU 等非线性结构后,整个 FFN 才不能在全局上合并成一个固定仿射映射。


11. 为什么 FFN 常先升维再降维

经典结构:

dmodeldffdmodel

通常:

dff>dmodel

例如概念上:

5122048512

可以理解为:

text
升维
→ 给当前位置更大的中间特征空间

非线性
→ 进行复杂特征组合

降维
→ 回到 residual stream 的 d_model

现代 LLM 中常见 SwiGLU 等门控 FFN 变体,第二课再展开。


12. FFN 子层的第二次 Residual

完成 Attention 子层得到:

H

随后:

Z=Norm(H)F=FFN(Z)

最后:

X=H+F

所以一个 Pre-Norm Block 有两次 Residual:

H=X+MHA(Norm(X))X=H+FFN(Norm(H))

X 成为下一 Transformer Block 的输入。


13. 完整维度例子

设:

XR100×512

并使用:

h=8,dhead=64,dff=2048

Attention 子层

text
X                    100 × 512
Norm(X)              100 × 512
每个 Q/K/V Head      100 × 64
每个 Attention Map   100 × 100
每个 Head Output     100 × 64
8 Heads Concat       100 × 512
W_O                  512 × 512
MHA Output           100 × 512
Residual 后 H        100 × 512

FFN 子层

text
Norm(H)              100 × 512
First Projection     100 × 2048
Activation           100 × 2048
Second Projection    100 × 512
Residual 后 X'       100 × 512

Block 内部可以拆 Head、升维、再降维,但进入和离开 Block 的主 hidden dimension 仍保持 dmodel


14. 一层接一层时发生什么

第一层输入:

X(0)

Block 1 得到:

X(1)

第二层不会继续使用第一层的 Q/K/V,而是使用第二层自己的参数:

WQ(2),WK(2),WV(2)

重新计算:

Q(2)=X(1)WQ(2)K(2)=X(1)WK(2)V(2)=X(1)WV(2)

因此:

X(0)X(1)X(2)X(L)

每层都基于当前 representation 重新建立信息路由,并继续写回 residual stream。


15. Embedding 与后续 Hidden Representation

最初:

X(0)

主要由 Token Embedding 与位置信息构成。

多层以后:

X(L)

已经融合大量上下文关系和非线性特征计算。

例如同一个 token:

text
bank

出现在:

text
central bank

与:

text
river bank

初始 token embedding 可以相同,但经过上下文相关的多层 Attention / FFN 后,hidden representation 会明显不同。


16. 高频误区

text
错误:Concat 已经完成所有 Head 融合
正确:Concat 只是拼接,W_O 继续重组 Head 特征
text
错误:Attention Output 覆盖原始 X
正确:Residual 通常写成 X + sublayer output
text
错误:Pre-Norm residual 加 Norm(X)
正确:X + F(Norm(X))
text
错误:FFN 负责 token 间通信
正确:Attention 通信,FFN 对已上下文化的单 token 表示计算
text
错误:Bias 产生神经网络非线性
正确:多层 affine 仍可合并;Activation 才引入非线性
text
错误:FFN 升维后 Block 输出也变大
正确:FFN 最终降回 d_model,才能写回 residual stream

17. 最终心智模型

text
X

Norm

Multi-Head Attention

Concat → W_O

Residual: + X

H

Norm

FFN: 升维 → 非线性 → 降维

Residual: + H

X'

Next Transformer Block

功能上:

MHA=CommunicationFFN=ComputationResidual=Information/Gradient HighwayNorm=Activation Scale Stabilization

下一课:

04_modern-llm-components.md

Mistakes:

05_Mistakes/AI.md

Interview QA:

06_Interview/AI_QA/Transformer.md