Part1:Transformer原理大白话:大模型到底怎么"思考"?
学习目标:理解大模型"预测下一个词"的本质,用生活类比掌握Attention/Position等核心概念,建立"原理→行为→调优"的认知链条
一、大模型到底是什么?
1.1 通俗解释:超级"下一个词预测器"
想象一下,你给AI看完了整个互联网上所有的书、文章、代码、对话。它不是"记住"这些内容,而是学习语言的统计规律——看到"今天天气很",它知道下一个词大概率是"好",而不是"苹果"。
核心认知:大模型不是"知识库",而是"概率预测器"
- 训练时:给模型一句话,遮盖最后一个词,让它猜("今天天气很___" → "好")
- 使用时:给模型开头,让它一个词一个词往下"接龙"
- 质量来源:训练数据量极大(TB级),模型参数极多(数十亿到数万亿),学到规律足够丰富
1.2 为什么能生成"有逻辑"的答案?
直觉理解:模型通过学习海量文本,掌握了:
- 语法:主谓宾搭配("我吃饭"而非"饭吃我")
- 事实:北京是中国首都(出现次数极多)
- 推理:"太阳从东边升起"+"现在早上8点"→"太阳在东边"
但模型不理解这些知识,只是知道这些Token组合出现概率高。
二、Transformer:大模型的"心脏"(2017年革命性架构)
2.1 为什么需要Transformer?
之前的痛点(RNN/LSTM时代):
- 像 singly reading(逐个阅读),无法并行计算
- 长距离遗忘:读到第1000个词,忘了第1个词说了什么
- 梯度消失/爆炸:训练不稳定
Transformer三大创新:
- Self-Attention:让每个词直接看到所有词(全局视野)
- Positional Encoding:给词打"位置标签"(解决顺序问题)
- Residual + LayerNorm:让深层网络可训练(训练稳定性)
三、Self-Attention:核心中的核心
3.1 微信群聊类比(让每个词"学会看上下文")
假设你在一个10人群聊,每条消息被所有人看到:
每个词会做三件事:
-
Query(我在找什么):每个词会说"我需要关注哪些信息?"
- 词"很"的Query:我需要知道"形容什么"(天气?人?心情?)
-
Key(我能提供什么):每个词会自我介绍"我是什么类型"
- 词"天气"的Key:我是"自然现象"相关词
- 词"好"的Key:我是"评价/形容词"
-
Value(我的实际内容):我真正的身份信息
计算匹配度:
"很"问"天气":匹配度0.8 (天气需要形容词修饰)
"很"问"吃":匹配度0.1 (吃的动作不需要"很"修饰)
最后加权汇总:根据匹配度,把相关词的Value加起来,得到"很"的新表示。
效果:词"很"现在知道它和"天气"强相关,和"吃"弱相关。
3.2 Self-Attention计算流程图
输入序列:["猫", "抓", "老", "鼠"]
↓
每个词生成三个向量:Query、Key、Value
↓
计算注意力得分矩阵(4×4):
猫 抓 老 鼠
猫 [ 0.1 0.8 0.05 0.05 ] ← "猫"最关注"抓"
抓 [ 0.7 0.1 0.15 0.05 ] ← "抓"最关注"猫"
老 [ 0.05 0.1 0.7 0.15 ] ← "老"最关注"鼠"
鼠 [ 0.05 0.05 0.1 0.8 ] ← "鼠"最关注"老"
↓
Softmax归一化(每行和为1)
↓
加权求和:每个词的新表示 = 所有词的Value × 对应得分
↓
输出:每个词都有了"看过上下文"的新理解
一句话总结:Attention让每个词都能看到整句话,并学会"该关注谁"。
四、Multi-Head Attention:多专家视角
4.1 为什么需要"多头"?
单一注意力头的局限:
- 可能只学会一种模式(比如语法关系)
- 信息混合不充分
多头·并行的思路(戴不同眼镜看画):
- 头1:关注语法结构(主谓宾关系)
- 头2:关注语义主题(话题相关度)
- 头3:关注指代关系(代词指代谁)
- ... 总共8/12/16个头
最终:把所有头的输出拼接起来,再通过一个线性层融合。
4.2 多专家协作示意图
输入一句话
↓
┌─────────────────────────────┐
│ 分成12个"专家小组"同时工作 │
├─────────┬─────────┬─────────┤
│ 头1 │ 头2 │ 头3... │
│ 看语法 │ 看主题 │ 看指代 │
├─────────┼─────────┼─────────┤
│ 头4 │ 头5 │ 头6... │
│ 看情感 │ 看逻辑 │ 看修饰 │
└─────────┴─────────┴─────────┘
↓
12个小组各自给出建议
↓
汇总所有建议 → 最终答案
工程经验:
- 头数选择:通常8(小模型)、12(Base)、16/32(Large)
- 可以剪枝:训练后去掉低贡献头,速度↑,精度↓<1%
五、位置编码:给词贴"位置指纹"
5.1 为什么需要位置信息?
Attention本身只看内容相似度,不看顺序:
- 输入"猫抓老鼠"和"老鼠抓猫",Attention得分一样(对称问题)
- 但两句话意思完全不同!
解决方案:给每个词额外加一个"位置向量",告诉模型它的位置。
5.2 正弦位置编码(原始方案)
核心思想:用不同频率的正弦波为每个位置生成独特的指纹。
就像每个人的工牌:
- 位置1:工牌号001
- 位置2:工牌号002
- 每个位置有唯一编码,相邻位置相似,远距离差异大
几何直觉:位置i和位置j的编码向量内积 ≈ f(|i-j|) 只和距离有关
5.3 RoPE:旋转位置编码(🌟 当前主流)
核心思想:把词向量看作2D平面上的向量,按位置旋转不同角度。
想象指南针:
- 位置0:指针指向0°
- 位置1:指针旋转+θ°
- 位置2:指针旋转+2θ°
- 位置n:指针旋转+nθ°
关键是:旋转角度只和相对位置有关,所以:
- 位置3和位置5的距离 = 位置100和位置102的距离(都是2步)
- 天然支持外推:训练用2K长度,推理可以扩展到8K
RoPE优势:
- ✅ 绝对位置 → 相对位置:位置差m的内积不变
- ✅ 数学优雅:旋转操作可结合
- ✅ 无参数:纯数学计算,不占参数
- 🌟 应用:LLaMA、ChatGLM等主流模型
六、完整Transformer Block:食材的融合
6.1 架构总览(6大组件)
x (输入)
↓
[1] LayerNorm → 让输入更"规矩"
↓
[2] Multi-Head Attention → 词与词之间"互相了解"
↓
[3] Residual Connection → x + attn_output(保留原始信息)
↓
[4] LayerNorm → 再次规范化
↓
[5] Feed-Forward Network (FFN) → 每个词自己"思考消化"
↓
[6] Residual Connection → x + ffn_output (最终输出)
6.2 各组件作用
LayerNorm(层归一化)
- 作用:稳定训练,每层输入分布更"规矩"
- 类比:健身前先热身,避免受伤
Residual Connection(残差连接)
- 作用:解决梯度消失,让梯度"抄近路"回传
- 公式:
output = x + f(x) - 直观:如果f(x)学不好,至少还有x本身
Feed-Forward Network(前馈网络)
- 作用:对每个位置的表示进行非线性变换,增强模型表达能力
- 经验:中间维度通常是
d_ff = 4 * d_model(如768→3072→768)
6.3 Pre-LN vs Post-LN(训练稳定性)
Post-LN(原始Transformer):
x → Attention → LayerNorm → 残差
Pre-LN(现代主流):
x → LayerNorm → Attention → 残差
为什么Pre-LN更好?
健身例子:
- Post-LN:先疯狂训练(梯度爆炸风险),最后才按摩放松(归一化)→ 容易受伤
- Pre-LN:先热身按摩(归一化),再合理训练 → 更安全稳定
工程经验:现在99%的大模型用Pre-LN。
七、大模型如何生成答案:解码过程
7.1 生成流程(自回归)
像接龙游戏:
- 你说"今天天气"
- 模型预测下一个词是"很"(概率最高)
- 你说"今天天气很"
- 模型预测下一个词是"好"
- 重复直到生成完整回答
关键理解:
- 每次只预测下一个词(不是一次生成整段)
- 新生成的词追加到输入,再预测下一个 → 自回归(Auto-regressive)
- 这就是为什么GPT是Decoder-only架构(需要mask避免看到未来词)
7.2 解码策略(影响生成质量)
| 策略 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 贪心搜索 | 每次都选概率最高的词 | 快、确定 | 重复、无创意 | 事实问答 |
| 束搜索 | 保留3-5条候选路径,选整体概率最高 | 质量好 | 慢、内存大 | 翻译、摘要 |
| 采样 | 按概率随机采(引入多样性) | 有创意、多样 | 可能不可控 | 创意写作 |
| 带温度采样 | 调整概率分布平滑度 | 可控随机性 | 需调参 | 通用场景 |
| Top-p采样 | 从累积概率90%的词中采样 | 自适应、常用 | 计算略复杂 | ChatGPT默认 |
实践建议:
- 🎯 ChatGPT默认:
temperature=0.8+top_p=0.9 - 🎯 代码生成:
temperature=0.2+top_p=0.5(更确定) - 🎯 创意写作:
temperature=1.0+top_p=0.95
Top-p(核采样)直观理解:
- 不固定选几个词,而是看"这些词的概率加起来已经90%了吗?"
- 在这个范围内再按概率采样
- 既避免选荒谬的低概率词,又保留一定多样性
八、为什么大模型会"胡说八道"?—— 幻觉问题
8.1 根本原因
-
概率生成本质:模型只会"猜最可能的词",不保证事实准确
- 训练数据中"地球是平的"出现很多(某些历史文本)→ 模型可能学偏
-
知识压缩损失:海量知识压缩进参数,必然丢失细节
- 模型知道"爱因斯坦生于1879",但记不清具体日期
-
上下文未覆盖:训练数据截止后的事件一概不知
- ChatGPT-3.5训练截止2021年 → 不懂2024年奥运会
-
推理链断裂:多步推理时,中间步骤出错,最终结果离谱
- "小明有5苹果,买3袋每袋4个..." → 中间算错3×4=16 → 最终5+16=21
8.2 缓解策略(工程实践)
- ✅ RAG检索增强:提供权威参考资料,减少自由发挥
- ✅ Chain-of-Thought:强制输出推理过程,人工检查中间步骤
- ✅ Self-Consistency:多次采样,选出现最多的答案(降低偶然错误)
- ✅ Fact-Checking工具:调用搜索API验证关键事实
- ✅ 约束解码:禁止特定词汇,限制输出格式
九、训练稳定性:让深层网络可训练
9.1 梯度消失/爆炸问题
现象:
- 梯度消失:深层网络反向传播时,梯度越来越小,前面层几乎不更新
- 梯度爆炸:梯度越来越大,导致参数突变,损失NaN
原因:链式法则连乘
dL/dW1 = dL/dW2 * dW2/dW1
= dL/dW3 * dW3/dW2 * dW2/dW1
= ...
= Π(各层导数)→ 如果每层导数<1,连乘→0;>1,连乘→∞
9.2 解决方案组合拳
现代Transformer的稳定性三件套:
- LayerNorm:每层输入标准化为均值0、方差1,避免激活值过大/过小
- Pre-LN:归一化在残差块内部,更稳定(对比Post-LN)
- Residual:梯度可以直接从output传到input,避免连乘衰减
其他优化:
- 梯度裁剪:限制梯度最大值,防止爆炸
- 学习率预热:前1000步逐步增大学习率(如1e-6 → 1e-4),避免早期震荡
- AdamW优化器:解耦权重衰减,防止正则化与自适应学习率冲突(🔥主流)
十、动手任务
任务1:手绘Attention流程图
画出以下流程:
- 输入序列"猫 抓 老 鼠" → 转换为词向量
- 生成Q/K/V矩阵
- 计算Attention Score矩阵(4×4)
- Softmax归一化
- 加权求和得到输出
任务2:设计"位置编码"小游戏
用Python生成正弦位置编码,验证:
pe = positional_encoding(seq_len=10, d_model=64)
# 计算位置0和位置1的点积,应该≈位置3和位置4的点积(它们距离都是1)
cos_sim = cosine_similarity(pe[0], pe[1])
print(f"位置0和1的余弦相似度: {cos_sim}")
任务3:CRIS框架分析
找一个真实Prompt(如"写一封请假邮件"),用CRIS四要素拆解:
- Context: 背景是什么?
- Role: 模型扮演谁?
- Instruction: 具体指令?
- Style: 输出格式?
✅ 学习检查点
完成本Part后,您应该能:
-
解释为什么大模型本质是"概率预测器":
- 不是存储知识,而是学习统计规律
- 通过预测下一个词,涌现出推理能力
-
画出Self-Attention完整计算流程:
- Q/K/V生成 → Attention Score → Softmax → 加权求和
- 能解释每个步骤的数学意义
-
对比Pre-LN vs Post-LN:
- Pre-LN为何更稳定?(归一化在残差内)
- 现代模型为何99%用Pre-LN?
-
选择合适解码策略:
- 什么时候用贪心?束搜索?采样?
- Top-p和Top-k的区别?
-
定位幻觉根源:
- 概率生成的固有问题
- 如何用工程手段缓解?(RAG、CoT、Self-Consistency)
📚 延伸阅读
- 原始论文:《Attention Is All You Need》(2017)[了解历史背景]
- 可视化工具:BERTViz(https://github.com/expertise/bertviz)观察注意力头
- 深入讲解:《The Illustrated Transformer》(Jay Alammar博客,图文并茂)
- 代码实践:HuggingFace Transformers库的
modeling_llama.py查看RoPE实现
Part 1 结束!
掌握Transformer原理后,您已经理解了"大模型怎么思考"的核心。
下一部分我们将深入 Part 2:Tokenization与Embedding —— 文本如何变成数字,以及词向量如何承载语义。学习节奏建议:Part 1理论性强,建议2周时间,务必动手实现简化版Attention和位置编码,加深理解。
评论区