LLM 如何工作?
学习目标:理解 Transformer 架构和注意力机制的核心原理
预计时间:90 分钟
难度等级:⭐⭐⭐⭐☆
核心问题:机器如何理解语言?
在深入技术细节之前,先理解一个根本问题:计算机只懂数字,不懂文字,那么 LLM 如何处理人类语言?
关键洞察
LLM 的本质是一个巨大的数学函数:
输入文本 → 转换为数字 → 数学运算 → 转换回文本整个过程分为三个阶段:
- 输入处理:文本转换为数字表示
- 核心计算:Transformer 架构处理
- 输出生成:数字转换回文本
第一阶段:输入处理
步骤 1:分词(Tokenization)
分词器将文本切分为模型能处理的最小单元(Token)。
分词示例
输入:"Transformer 是强大的模型"
可能的分词结果:
- ["Transform", "er", "是", "强大", "的", "模型"]
- 每个词被分配一个唯一的数字 ID
分词策略:
- 字符级:每个字符作为一个 token(简单但效率低)
- 词级:每个词作为一个 token(效率高但词表大)
- 子词级:介于两者之间(GPT、BERT 都采用此方案)
步骤 2:词嵌入(Word Embedding)
将 Token ID 转换为高维向量表示:
Token ID → 向量
"Transformer" → [0.12, -0.54, 0.88, ..., 0.33]
↑
典型维度:768, 1024, 4096...为什么需要嵌入?
- 数字 ID 只是符号,没有语义
- 向量表示能捕获词的语义和关系
- 例如:"国王" - "男人" + "女人" ≈ "女王"
步骤 3:位置编码(Positional Encoding)
Transformer 是并行处理所有输入的,需要显式注入位置信息。
输入: "我 爱 AI"
嵌入: [v1, v2, v3]
问题:模型无法区分顺序!
"我 爱 AI" vs "AI 爱 我" - 嵌入相同
解决:添加位置编码
[v1 + p1, v2 + p2, v3 + p3]技术细节:正弦位置编码
原始 Transformer 使用正弦和余弦函数: $$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d})$$ $$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d})$$
现代模型(如 LLaMA)使用旋转位置编码(RoPE),效果更好。
第二阶段:核心架构 - Transformer
Transformer 整体架构
┌─────────────────────────────────────────────────┐
│ Transformer 架构 │
├───────────────────┬─────────────────────────────┤
│ Encoder │ Decoder │
│ (编码器) │ (解码器) │
│ │ │
│ ┌─────────────┐ │ ┌─────────────────────┐ │
│ │ Self-Attn │ │ │ Masked Self-Attn │ │
│ └─────────────┘ │ └─────────────────────┘ │
│ ↓ │ ↓ │
│ ┌─────────────┐ │ ┌─────────────────────┐ │
│ │ FFN │ │ │ Cross-Attn (可选) │ │
│ └─────────────┘ │ └─────────────────────┘ │
│ ↓ │ ↓ │
│ ┌─────────────┐ │ ┌─────────────────────┐ │
│ │ × N 层 │ │ │ FFN │ │
│ └─────────────┘ │ └─────────────────────┘ │
│ │ ↓ │
│ │ ┌─────────────────────┐ │
│ │ │ × N 层 │ │
│ │ └─────────────────────┘ │
└───────────────────┴─────────────────────────────┘关键区别:
- 仅 Decoder 模型(GPT 系列):擅长文本生成
- 仅 Encoder 模型(BERT 系列):擅长理解任务
- Encoder-Decoder 模型(T5):擅长翻译
核心组件 1:自注意力机制(Self-Attention)
这是 Transformer 的核心创新!
通俗理解:注意力就是"相关性"
想象你在读这句话:
"小明因为他生病了没来上学"
当理解"他"时,你的注意力会自动关联到"小明"。 注意力机制就是让模型学会这种"关注重点"的能力。
注意力机制的三要素
- Query(查询 Q):当前词的查询向量
- Key(键 K):所有词的键向量
- Value(值 V):所有词的值向量
比喻:图书馆查询系统
- Query:你想要查找的书名
- Key:图书馆里所有书的分类号
- Value:书架上的实际书籍
过程:
- 用 Query 匹配所有 Key,得到相关性分数
- 用分数加权求和 Value
- 得到最终结果
注意力计算过程
# 伪代码
def attention(Q, K, V):
# 1. 计算相关性分数
scores = Q @ K.T # 矩阵乘法
# 2. 缩放(防止数值过大)
scores = scores / sqrt(d_k)
# 3. 转换为概率分布
attention_weights = softmax(scores)
# 4. 加权求和
output = attention_weights @ V
return output注意力可视化示例
句子:"The cat sat on the mat"
处理 "cat" 时的注意力分布:
- The: 0.05
- cat: 0.40 ← 关注自己
- sat: 0.30
- on: 0.15
- the: 0.05
- mat: 0.05
模型学会了 "cat" 与 "sat"(动作)和 "mat"(位置)的关联!
核心组件 2:多头注意力(Multi-Head Attention)
单头注意力只能关注一种关系模式,多头允许模型同时关注多种关系。
为什么需要多头?
类比人类阅读:
- 第 1 头:关注语法结构(主谓宾)
- 第 2 头:关注语义关联(同义词)
- 第 3 头:关注指代关系(代词指代)
- 第 4 头:关注长距离依赖 ...
每头"看"问题的角度不同!
计算过程:
输入 X
↓
┌────────────────────────────────┐
│ Head 1: Attention(X) → O1 │
│ Head 2: Attention(X) → O2 │
│ Head 3: Attention(X) → O3 │
│ ... │
│ Head 8: Attention(X) → O8 │
└────────────────────────────────┘
↓
拼接 [O1, O2, ..., O8]
↓
线性变换 → 最终输出典型配置:
- GPT-3:96 个头
- LLaMA 2:40-80 个头
- GPT-4:估计 100+ 个头
核心组件 3:前馈神经网络(Feed-Forward Network)
每个位置独立进行的非线性变换:
FFN(x) = Activation(xW1 + b1)W2 + b2作用
- 注意力机制:融合上下文信息
- FFN:对每个位置进行"思考"和转换
- 类比:注意力 = "收集信息",FFN = "处理信息"
典型结构:
输入维度 d_model = 768
↓
扩展到 4 倍: 768 → 3072
↓
激活函数(GeLU / ReLU / SwiGLU)
↓
压缩回原维度: 3072 → 768核心组件 4:层归一化与残差连接
这两个技术确保深度网络能够稳定训练。
残差连接(Residual Connection)
输出 = x + Sublayer(x)作用:缓解梯度消失
允许梯度直接流过,避免在深层网络中消失。 类比:给信息"搭了一座桥",不必层层传递。
层归一化(Layer Normalization)
输出 = LayerNorm(x + Sublayer(x))作用:
- 稳定训练过程
- 加速收敛
- 提高模型稳定性
现代实践(如 GPT-2/LLaMA):Pre-LN
输出 = x + Sublayer(LayerNorm(x)) # 先归一化第三阶段:输出生成
概率分布预测
模型最后一层输出词汇表大小的 logits:
输入: "今天天气"
模型输出: [logits]
↓
Softmax
↓
概率分布:
"好": 0.45
"不错": 0.25
"很差": 0.15
"真": 0.10
...解码策略
如何从概率分布中选择下一个词?
1. 贪婪解码(Greedy Decoding)
next_token = argmax(probabilities)- 优点:快
- 缺点:可能陷入次优解
2. 束搜索(Beam Search)
- 保留 top-k 个候选序列
- 平衡多样性和质量
3. 采样(Sampling)
next_token = sample(probabilities, temperature=0.7)Temperature 参数
- 低温度(0.1-0.3):确定性高,输出保守
- 中温度(0.7-1.0):平衡多样性和质量
- 高温度(1.5-2.0):多样性高,但可能混乱
完整前向传播示例
让我们追踪一个简单的例子:
输入: "AI 将"
1. 分词:
["AI", "将"] → [42, 128]
2. 嵌入 + 位置编码:
[v42 + p0, v128 + p1]
3. Transformer 处理(N 层):
每层:
- 多头自注意力
- 残差连接 + 层归一化
- 前馈网络
- 残差连接 + 层归一化
4. 输出 logits:
[-1.2, 3.4, 0.8, ..., -0.5] # 词汇表大小
↓
Softmax
5. 概率分布:
"改变": 0.35
"革命": 0.25
"是": 0.20
...
6. 采样: "改变"
7. 循环生成直到结束符训练过程:模型如何学习?
预训练目标:下一个词预测
训练数据: "我爱学习 AI"
输入: "我爱学习"
目标: "AI"
损失函数: CrossEntropy(predicted, actual)
优化: 反向传播更新参数规模:
- 训练数据:万亿级 tokens
- 参数更新:数百万次迭代
- 硬件:数千个 GPU
训练技巧
- 梯度累积:模拟大 batch size
- 混合精度训练:FP16/BF16 加速
- 模型并行:超大模型分片到多 GPU
- 数据并行:相同模型复制到多 GPU
为什么 Transformer 如此强大?
1. 并行化
RNN:
t0 → t1 → t2 → t3 → t4 (顺序处理)
Transformer:
t0, t1, t2, t3, t4 (并行处理)2. 长距离依赖
句子: "小明... (100 个词后) ...他"
RNN:信息逐渐衰减
Transformer:直接注意力连接!3. 可扩展性
性能 = f(参数量, 数据量, 算力)
Transformer 的Scaling Laws特别好:
增加规模 → 性能持续提升可视化理解
注意力可视化示例
访问 BertViz 可以看到:
- 不同层关注不同的语言现象
- 低层:语法、词法
- 高层:语义、长距离依赖
嵌入空间可视化
使用 t-SNE 降维后可以看到:
- 语义相似的词聚集在一起
- 不同语言但语义相同的词靠近
思考题
检验你的理解
为什么需要位置编码?
多头注意力的"多头"有什么作用?如果只有单头会怎样?
Transformer 相比 RNN 的主要优势是什么?
访问 BertViz 或类似工具,观察不同层的注意力模式,记录你的发现。
本节小结
通过本节学习,你应该掌握了:
✅ 输入处理
- 分词、嵌入、位置编码
✅ Transformer 核心
- 自注意力机制
- 多头注意力
- 前馈网络
- 层归一化与残差连接
✅ 输出生成
- 概率分布预测
- 解码策略
✅ 训练过程
- 下一个词预测
- 大规模训练技巧
✅ 核心优势
- 并行化、长距离依赖、可扩展性
下一步:在下一节中,我们将对比分析主流大模型的特点和适用场景。
[^1]: Vaswani et al., "Attention Is All You Need", NeurIPS 2017 [^2]: "The Illustrated Transformer", Jay Alammar, 2018 [^3]: "Visualizing A Neural Machine Translation Model", Harvard NLP