前置知识

阅读本文前,建议先了解:


一、概述

Transformer 是目前几乎所有大语言模型的核心架构。你可以把它理解为 LLM 的”大脑结构”。

2017 年,谷歌发布了一篇划时代的论文《Attention Is All You Need》,提出了 Transformer 架构。从那以后,它成为了 NLP(自然语言处理)领域的主导架构,GPT、BERT 等模型都是基于 Transformer 构建的。

一句话理解

Transformer = 一种让模型”学会关注重要信息”的神经网络架构

1.1 Transformer 解决了什么问题

在 Transformer 出现之前,主流使用的是 RNN(循环神经网络,Recurrent Neural Network)。RNN 有一个致命缺陷:长距离依赖问题

RNN 处理句子:[我] → [爱] → [学习] → [机器] → [学习]
              ↑       ↑       ↑        ↑        ↑
              记住   记住    记住     记住     记住
              "我"   "我爱"  "我爱学习" ...   越来越难

当句子变长时,RNN 很难捕捉到远距离词语之间的关系。

Transformer 换了一种思路:不是强行记住所有内容,而是学会”按需查看”

[!比喻] 就像你考试时做阅读理解 你不需要把整篇文章背下来,而是根据问题去文章里关键信息——这就是注意力机制的核心思想。

1.2 Transformer 的两大优势

优势说明
并行计算RNN 必须按顺序处理,Transformer 可以同时处理所有词
长距离依赖任何两个词都可以直接”对话”,无论距离多远
RNN:         [我] → [爱] → [学习] → ...  (串行,慢)

Transformer: [我] [爱] [学习] ...        (并行,快)
              ↓    ↓    ↓
           同时计算注意力

二、总体架构

Transformer 采用编码器 - 解码器(Encoder-Decoder)架构:

graph LR
    A[输入文本] --> B[词嵌入]
    B --> C[位置编码]
    C --> D[编码器层 ×N]
    D --> E[解码器层 ×N]
    E --> F[线性层]
    F --> G[Softmax]
    G --> H[输出概率]

2.1 四大核心组件

组件作用位置
输入层将词转换为向量,并注入位置信息最前端
编码器(Encoder)理解输入,提取特征中间
解码器(Decoder)根据编码结果生成输出中间
输出层将向量转换回概率分布最后端

2.2 编码器与解码器的关系

┌─────────────────────────────────────────────────────────┐
│                    Transformer                          │
├─────────────────────────────────────────────────────────┤
│                                                          │
│  输入文本 ──→ ┌─────────────┐                          │
│               │   编码器     │ 理解输入                   │
│               │  (Encoder)  │                          │
│               └──────┬──────┘                          │
│                      │                                  │
│                      ▼ 传递编码信息                      │
│               ┌─────────────┐                          │
│               │   解码器     │ 生成输出                   │
│               │  (Decoder)  │                          │
│               └──────┬──────┘                          │
│                      │                                  │
│                      ▼                                  │
│                  输出文本                               │
│                                                          │
└─────────────────────────────────────────────────────────┘

2.3 三种使用模式

根据任务需求,Transformer 可以有不同的使用方式:

模式结构适用任务代表模型
编码器-only输入 → 编码器 → 输出理解任务(分类、情感分析)BERT
解码器-only输入 → 解码器 → 输出生成任务(写作、对话)GPT、LLaMA
完整 Transformer输入 → 编码器 → 解码器 → 输出序列到序列(翻译、摘要)T5、BART

GPT 为什么只能用解码器?

GPT 是”自回归”模型——它只能基于已经生成的内容来预测下一个词。如果让右边的词也参与,模型就能”作弊”看到答案了。


三、输入层:词嵌入与位置编码

输入层负责将原始文本转换为模型可以处理的向量表示。

3.1 词嵌入(Token Embedding)

词嵌入将每个词(Token)转换为一个固定维度的向量:

输入:"我喜欢学习"

分词:["我", "喜欢", "学习"]
       ↓
词嵌入:[0.2, -0.5, 0.8, ...]  ← 512 维向量
        [0.1, 0.3, -0.2, ...]
        [-0.4, 0.6, 0.1, ...]

为什么用向量表示词?

向量可以捕捉词的语义语法特征。相似的词在向量空间中距离相近,比如”国王”和”王后”的向量距离比”国王”和”苹果”更近。

3.2 位置编码(Positional Encoding)

Transformer 本身不具备处理序列顺序的能力——它把所有词同时处理,无法区分”猫追狗”和”狗追猫”。

位置编码为每个位置生成一个独特的向量,与词嵌入相加:

词向量 + 位置编码 = 带位置信息的词表示

"猫追狗"
 ↓
[猫,位置 0] [追,位置 1] [狗,位置 2]
graph TD
    A[词向量] --> C[相加]
    B[位置编码] --> C
    C --> D[带位置信息的表示]

位置编码使用正弦和余弦函数生成,确保模型可以学习到相对位置关系:

[!比喻] 就像给每个人发一个编号 即使大家同时入场,通过编号也能知道谁先谁后。


四、注意力机制(核心)

注意力机制(Attention Mechanism)是 Transformer 的核心,也是最重要的部分。

4.1 什么是注意力

想象你在嘈杂的咖啡馆里和朋友聊天。即使周围很吵,你也能”自动过滤”噪音,只关注朋友的声音——这就是注意力

Transformer 的注意力机制让模型在处理每个词时,可以”关注”输入序列中的任意其他词:

输入句子:"小明把球给了小红,谁拿到了球?"

注意力分配:
┌─────────────────────────────────────────────────┐
│  小明   ██          20%  ← 不太重要              │
│  把     █            10%  ← 不太重要              │
│  球     ████         35%  ← 重要                  │
│  给了   ██          20%  ← 上下文                 │
│  小红   ████         35%  ← 重要(谁拿到)          │
│  谁     █            10%  ← 问句标记              │
│  拿到   ████         35%  ← 关键动作              │
│  了     █             5%  ← 不重要                │
│  ?     █             5%  ← 不重要                │
└─────────────────────────────────────────────────┘

4.2 QKV:注意力计算的三要素

注意力机制通过三个向量计算相关性

向量英文说明比喻
QueryQ查询向量,“我想找什么”搜索词
KeyK键向量,“我包含这些信息”网页标题
ValueV值向量,“我的实际内容”网页内容

[!比喻] 就像使用搜索引擎

  • Query = 你输入的搜索词
  • Key = 每个网页的标题/标签
  • Value = 网页的实际内容

搜索引擎比较 Query 和 Key 的匹配程度,决定展示哪些 Value,以及展示多少。

4.3 缩放点积注意力(Scaled Dot-Product Attention)

注意力的计算公式:

计算步骤分解:

graph LR
    A[Q, K, V] --> B[计算 Q×Kᵗ]
    B --> C[除以 √dₖ 缩放]
    C --> D[Softmax 归一化]
    D --> E[乘以 V]
    E --> F[注意力输出]
  1. 计算相似度 得到 Query 和每个 Key 的相似度分数
  2. 缩放:除以 防止数值过大
  3. 归一化:Softmax 将分数转换为概率分布(和为 1)
  4. 加权求和:用概率对 Value 加权,得到最终输出

4.4 自注意力(Self-Attention)

自注意力(Self-Attention)让序列中的每个词都和其他所有词计算相关性:

句子:"猫坐在垫子上"

自注意力让模型理解:
- "猫" 和 "坐在" 相关(主语 - 谓语)
- "坐在" 和 "垫子" 相关(谓语 - 宾语)
- "猫" 和 "垫子" 间接相关(通过"坐在")
graph TD
    subgraph 输入
        A[猫]
        B[坐在]
        C[垫子]
        D[上]
    end
    
    subgraph 自注意力
        A --> A
        A --> B
        A --> C
        A --> D
        B --> A
        B --> B
        B --> C
        B --> D
    end
    
    style 输入 fill:#e1f5fe
    style 自注意力 fill:#fff3e0

这就是为什么 Transformer 能理解复杂句法结构的原因!

4.5 多头注意力(Multi-Head Attention)

多头注意力(Multi-Head Attention)让模型同时从多个角度理解输入:

输入:"猫坐在垫子上"

头 1:关注语法关系 → "猫"(主语) → "坐在"(谓语)
头 2:关注语义关系 → "猫"(动物) → "垫子"(物品)
头 3:关注位置关系 → "坐在"(动作) → "垫子上"(位置)

输出:将多个头的信息拼接,形成更丰富的表示

graph TD
    A[输入] --> B[头 1: 语法注意力]
    A --> C[头 2: 语义注意力]
    A --> D[头 3: 位置注意力]
    B --> E[拼接]
    C --> E
    D --> E
    E --> F[输出矩阵]

多头注意力的好处:

  • 同时捕捉不同类型的关系
  • 增加模型的表达能力
  • 类似卷积神经网络中的多个滤波器

4.6 残差连接(Residual Connection)

残差连接(Residual Connection)让信息可以直接跨层传递,缓解梯度消失问题:

输出 = 输入 + 子层输出 (Attention 或 FFN)
graph LR
    %% 推荐写法:稳健且兼容性好
    A["输入 x"] --> B["子层 F(x)"]
    A --> C["➕"]
    B --> C
    C --> D["输出 x + F(x)"]

为什么要用残差连接?

  1. 缓解梯度消失:深层网络中,梯度可以通过恒等连接直接传递到浅层
  2. 保留原始信息:子层只需要学习”残差”(需要补充的部分),而不是全部内容
  3. 更容易训练:恒等映射比学习完整映射更容易

4.7 层标准化(Layer Normalization)

层标准化(Layer Normalization)将每层的输入归一化为均值为 0、方差为 1 的分布:

输入 → 层归一化 → 子层 (Attention/FFN) → 残差连接 → 输出
graph LR
    A[输入] --> B[层归一化]
    B --> C[注意力/FFN]
    C --> D[残差连接]
    D --> E[输出]

层归一化的作用

  1. 稳定训练:防止数值爆炸或消失
  2. 加速收敛:让优化过程更平滑
  3. 减少对初始化的依赖:不同参数初始化下都能正常训练

4.8 编码器层与解码器层的区别

组件编码器层解码器层
自注意力双向(可以看到所有位置)单向(只能看到之前的位置)
掩码无掩码因果掩码(防止看到未来)
交叉注意力有(关注编码器输出)
graph TD
    subgraph 编码器层
        A1[多头自注意力] --> B1[残差 + 层归一化]
        B1 --> C1[前馈网络]
        C1 --> D1[残差 + 层归一化]
    end
    
    subgraph 解码器层
        A2[掩码多头自注意力] --> B2[残差 + 层归一化]
        B2 --> C2[交叉注意力]
        C2 --> D2[残差 + 层归一化]
        D2 --> E2[前馈网络]
        E2 --> F2[残差 + 层归一化]
    end

五、输出层:线性化

经过多层编码器和解码器处理后,模型需要将向量表示转换回具体的词。

5.1 线性层(Linear Layer)

线性层将解码器的输出向量映射到词表大小:

解码器输出:[0.2, -0.5, 0.8, ...]  ← 512 维向量
              ↓
线性层:W × x + b
              ↓
输出:[score₁, score₂, score₃, ...]  ← 词表大小的向量

5.2 Softmax 层

Softmax将分数转换为概率分布:

Softmax 输入:[2.0, 1.0, 0.1]
              ↓
Softmax 输出:[0.66, 0.24, 0.10]  ← 和为 1 的概率分布

5.3 采样生成

根据概率分布选择下一个词:

策略说明
贪婪解码选择概率最高的词
随机采样按概率随机选择
Top-k 采样从前 k 个高概率词中采样
Top-p 采样从累积概率达到 p 的词中采样
输出概率:{"我": 0.66, "你": 0.24, "他": 0.10}
              ↓
选择:"我" (概率最高)

六、总结

6.1 Transformer 架构回顾

graph TB
    A[输入文本] --> B[词嵌入 + 位置编码]
    B --> C[编码器层 ×N]
    C --> D[解码器层 ×N]
    D --> E[线性层 + Softmax]
    E --> F[输出概率]
    
    subgraph 编码器层
        C1[多头自注意力]
        C2[残差 + 层归一化]
        C3[前馈网络]
    end
    
    subgraph 解码器层
        D1[掩码多头自注意力]
        D2[交叉注意力]
        D3[前馈网络]
    end

6.2 核心组件速查

组件作用关键公式/概念
词嵌入词→向量语义向量空间
位置编码注入位置信息函数
自注意力捕捉词间关系
多头注意力多角度理解并行多个注意力头
残差连接信息跨层传递
层归一化稳定训练归一化为 N(0,1)
前馈网络非线性变换

6.3 为什么 Transformer 如此重要

原因说明
解决长距离依赖注意力机制让任何两个词都可以直接”对话”
并行计算同时处理所有词,训练速度快
可扩展性强参数越多效果越好,支撑 LLM 的”大”
通用性好同一架构可用于理解、生成、翻译等任务

理解了 Transformer,你就理解了为什么 LLM 能如此强大。


延伸阅读