SERIES AI 与 LLM 学习路线 07 / 10

把 Transformer 拆成可检查的几层

分清多头注意力、位置编码、前馈网络,以及原始编码器—解码器中的三种注意力。

理解了 单头 Self-Attention 后,仍不能把 Transformer 想成“叠几层 Attention”。原论文的模型为机器翻译设计,完整结构是编码器栈 + 解码器栈,每个位置还要经过前馈网络、残差连接与层归一化。

一层里发生什么

以编码器为例,输入先加入位置信息,然后进入多头 Self-Attention。若有 hh 个头,每个头使用独立的 WQ(i),WK(i),WV(i)W_Q^{(i)},W_K^{(i)},W_V^{(i)},分别计算注意力,最后拼接并经过输出投影。多个头不是把同一个权重矩阵重复运行 hh 次;它们能学习不同的投影,但也不保证每个头一定对应可命名的语言现象。

之后的 position-wise FFN 对每个位置应用相同的两层变换:

FFN⁡(x)=max⁡(0,xW1+b1)W2+b2\operatorname{FFN}(x)=\max(0,xW_1+b_1)W_2+b_2

它在特征维度上做非线性变换;Self-Attention 则让不同位置交换信息。残差连接给层保留一条直接传递输入和梯度的路径,LayerNorm 帮助控制激活尺度。原论文使用在子层输出之后做归一化的安排;后来的模型也常见把归一化放在子层之前,读具体模型时应看实现。

为什么需要位置

只看一层没有位置编码的 Self-Attention,同样的 token 表示换个顺序,输出也会随之等变,无法仅凭内容区分先后。原论文给输入加正弦、余弦位置编码;它不是唯一选择,学习式位置表示和相对位置方法也存在。关键是模型必须获得足够的顺序信息。

三种注意力不要混在一起

原论文中的位置 Query 来自 Key / Value 来自 约束
编码器 Self-Attention 编码器当前表示 编码器当前表示 可看完整输入
解码器 Self-Attention 解码器当前表示 解码器当前表示 因果 mask,不能看未来
编码器—解码器 Attention 解码器当前表示 编码器输出 可看完整源序列

解码器训练时会把目标序列右移,利用前面 token 预测下一个 token;因果 mask 保证模型不会直接看到答案。生成时仍需逐个输出 token,训练阶段“位置可并行”不等于推理时整段答案能一次生成。

许多文本生成 LLM 使用仅解码器的变体,没有原始翻译模型里的编码器—解码器交叉注意力。说“Transformer 一定有编码器和解码器”与说“Transformer 只有 Self-Attention”都过于简单。下一篇 Tokenizer 与 Embedding 会说明文本怎样变成这些层的输入。

参考:Attention Is All You Need。

  1. 01从一个预测任务看 AI、机器学习与深度学习
  2. 02用 NumPy 的形状读懂一个线性分类器
  3. 03从线性层到反向传播:梯度究竟从哪里来
  4. 04PyTorch 训练循环里每一步在做什么
  5. 05从 RNN 到 Attention:固定长度上下文为何不够
  6. 06从矩阵形状理解 Self-Attention
  7. 07把 Transformer 拆成可检查的几层当前文章
  8. 08Tokenizer 和 Embedding 各自解决什么问题
  9. 09大语言模型怎样一个 Token 一个 Token 生成文本
  10. 10从检索链路理解 RAG,而不是只看向量数据库
NEXT IN SERIES 08 / Tokenizer 和 Embedding 各自解决什么问题