注意力与残差连接 (Attention & Residual / Transformer Block)

1. 定义

  • 自注意力 (Self-Attention):让序列里每个位置”按需去看和它相关的其他位置”的机制——谁相关、权重就大。它是 Transformer 抓取长程依赖的核心。
  • 残差连接 (Residual / Skip Connection):把子层的输入直接加到输出上(output = Sublayer(x) + x),让梯度有”高速公路”直达浅层。
  • 两者组合成 Transformer 的基本块:注意力子层、前馈子层各包一层”残差 + 层归一化(Add & Norm)“。今天的大语言模型,本质就是把这种块堆叠几十上百层

类比:注意力像”开会时每个人按需抬头看相关同事的发言再汇总”;残差像”在主线任务上叠加一个修正建议,但主线本身绝不丢”——这样叠很多层也不会把最初的信息冲没。

关联:LLM 的底座就是 Transformer,见 foundation_model.md;残差正是为了解决深层网络的梯度消失,见 gradient-descent.md 第 9 节;从感知机到深层网络的演进见 single-layer-perceptron.md

2. 核心概念

概念含义
Query / Key / Value (Q/K/V)注意力三件套:用 Q 去和每个 K 算相似度,按相似度加权求和 V
Scaled Dot-Product相似度 = QKᵀ / √d_k,再 softmax 得权重
Multi-Head把 Q/K/V 拆成多组并行算注意力,捕捉不同子空间关系,再拼回
残差 / Skipx + Sublayer(x),绕开子层直连,保梯度通路
Add & Norm残差相加后再做 LayerNorm(层归一化),稳定训练
FFN每个块里的”前馈网络”子层(两层线性 + 激活),做逐位置变换

3. 注意力机制(公式与直觉)

直觉:拿 Q 和每个位置的 K 算”有多相关” → softmax 变成权重(加起来为 1)→ 按权重加权求和 V,得到这个位置”看了全场之后”的新表示。

token 序列 ──▶ 各自算出 Q/K/V
   │
   ▼  QKᵀ/√d_k → softmax → 权重
   ▼  按权重对 V 加权求和
   ▼
每个 token 的新表示(已融合相关位置的信息)

缩放 √d_k 很关键:维度大时点积数值过大,softmax 会进入梯度极小的饱和区,训练不动。

4. 残差连接:为什么必须有

深层网络(几十上百层)直接堆叠会把梯度乘很多次,容易梯度消失(浅层学不动)。残差给梯度留了条”直连高速”:

普通堆叠:  x → 子层 → 子层 → 子层 …   梯度要层层反传、层层相乘,易消失
残差堆叠:  x ──┐
              ├─▶ 子层(x) ─┐
         x ──┘            ├─▶ + x ──▶ …   梯度可沿"+"直传回 x,不被子层吞掉

一句话:残差让”叠很深”成为可能——这正是 LLM 能堆成百上千层、从而涌现出强能力的工程前提。

5. 组合:Transformer Block(核心)

x ──▶ [LayerNorm] ─▶ Multi-Head Attention ─▶ + x (残差) ─▶ [LayerNorm] ─▶ FFN ─▶ + x (残差) ─▶ 输出
      └──────────────── 子层1(注意力)────────┘   └────────── 子层2(FFN)──────────┘

这就是 LLM 反复堆叠的基本单元。 PyTorch 里一行就是一块:

import torch.nn as nn
 
# 现成块:d_model=隐藏维度, nhead=头数, dim_feedforward=FFN 宽度
block = nn.TransformerEncoderLayer(d_model=512, nhead=8, dim_feedforward=2048)
 
# 手动看残差长啥样(概念版)
def residual_attn(x, attn, norm):
    return x + attn(norm(x))      # 注意力子层 + 残差
def residual_ffn(x, ffn, norm):
    return x + ffn(norm(x))       # 前馈子层 + 残差

6. 典型工作流 / 为什么重要

  1. 文本先 token 化、做成嵌入,带上位置编码输入。
  2. 过 N 个 Transformer Block(注意力抓依赖、残差保深层可训)。
  3. 最后接任务头(分类 / 下一个 token 预测)。
  • 优势:注意力天然并行(不像 RNN 要一步步)、能直接看任意远距离依赖;残差让它堆得极深——二者共同成就了现代大模型。

7. 常见误区

  • ❌ “注意力 = 记住了全部信息” → 它只是对当前序列做加权聚合,是”看一眼相关位置”,不是存储记忆(长程记忆靠堆叠层与上下文)。
  • ❌ “残差是装饰、可有可无” → 没有它,深层 Transformer 梯度消失、训不动
  • ❌ “Transformer 取代 RNN 只因为快” → 主因是可并行 + 抓长程依赖 + 残差使其能堆很深,速度只是并行带来的副作用。
  • ❌ “QKᵀ 不用缩放也行” → 维度大时点积过大让 softmax 饱和、梯度消失,必须 /√d_k
  • ❌ “残差就是再把输出加一遍” → 是 子层输出 + 原始输入 x(同一分辨率的直连),不是简单重复。

8. 延伸阅读 / 关联概念