LLM的Transformer架构
文章目录
一、前文回顾和本文概要
| 博文 | 核心内容 | 与本节关系 |
|---|---|---|
| 第一篇 | 预训练 → SFT → RM → RL 的训练流程 | 讲了训练流程“做了什么” |
| 第二篇 | 神经网络、梯度下降、机器学习六步骤 | 讲了模型内部“怎么学会的” |
| 第三篇 | Transformer 架构详解 | 把前两节串起来——训练流程 + 模型内部结构 = 完整图景 |
二、Transformer 总体架构
2.1 经典架构(2017 年论文)
2017 年 Attention Is All You Need 论文提出了完整的 Transformer 架构,分为两大模块:
┌─────────────────────────────────────────────────┐
│ Transformer │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Encoder │ │ Decoder │ │
│ │ (编码器) │ │ (解码器) │ │
│ │ │ │ │ │
│ │ 理解输入文字 │───▶│ 基于理解生成输出文字 │ │
│ │ 提取语义信息 │ │ 逐字续写 │ │
│ └──────────────┘ └──────────────────────┘ │
└─────────────────────────────────────────────────┘
- Encoder(编码器):把人类能看懂的文字变成人类看不懂的数学向量
- Decoder(解码器):把数学向量再生成人类能看懂的文字
2.2 从 Encoder-Decoder 到 Decoder-Only
| 架构 | 代表模型 | 特点 |
|---|---|---|
| Encoder-Only | Google BERT | 只做理解,不做生成;适合分类、情感分析 |
| Encoder-Decoder | 2017 原始 Transformer | 翻译等 seq2seq 任务 |
| Decoder-Only | GPT(2018 起全部) | 只用解码器,既理解又生成 |
为什么 GPT 选择 Decoder-Only?
- Decoder 本身就能理解文字(它在生成回答时需要理解上下文)
- Encoder 能做的,Decoder 也能做
- 那还要 Encoder 干什么?→ 干脆去掉,只留 Decoder
从 2018 年 GPT-1 开始,OpenAI 就选择了 Decoder-Only 架构。现在几乎所有主流大语言模型(GPT-4、Llama、Qwen 等)都是 Decoder-Only。
三、Transformer 的五大核心步骤
以一段 650 字的用户-法律顾问对话为例,大模型需要输出第 651 个字。整个过程分为五个步骤:
步骤一:Tokenization(分词/字词化)
把一段文字拆成 Token(最小处理单元)。
"海南清华" 这五个汉字:
├── GPT-3.5:拆成 11 个 Token
├── Llama(710M):英文和中文都约 40 万个 Token(处理《哈利波特》全书)
└── 不同模型 Token 拆分方式完全不同
- 英文中
subword可能拆成sub+word - 中文平均 1 个汉字 ≈ 2 个 Token(GPT-3.5)
- OpenAI 开源了 Tiktoken —— 纯代码(无 AI/神经网络),展示不同 GPT 版本的 Token 拆分规则
关键数字(以 GPT-3 为例):
- 1,000 个 Token ≈ 750 个英文单词 ≈ 500 个汉字
步骤二:Embedding(嵌入/向量化)
把每个 Token 变成一个高维数学向量。
2.1 最简单的方法:One-Hot 编码
假设常用汉字 3,000 个,每个字用一个长度为 3,000 的向量表示:
我 → [1, 0, 0, 0, ..., 0] (只有第 1 位是 1)
你 → [0, 1, 0, 0, ..., 0] (只有第 2 位是 1)
One-Hot 的问题:
- 维度太高:10 万个 Token 需要 10 万维向量
- 过于稀疏:99.99% 的位都是 0,信息密度极低
- 没有距离概念:无法体现"吃饭"和"用餐"语义相近、经常一起出现
2.2 Embedding 的做法
用神经网络来学习每个 Token 的最佳向量表示:
每个 Token → Embedding 神经网络 → 一个高维向量(如 GPT-3 的 12,288 维)
| 模型 | Embedding 维度 |
|---|---|
| GPT-3 | 12,288 维 |
| 其他模型 | 各不相同(人工设计) |
为什么需要这么高的维度?
因为后续要经过 96 轮(甚至 120+ 轮)信息聚合,每次聚合都会让向量包含越来越多的信息。一个向量最终要能代表 100 万字的语义——起点不高不行。
类比:你给一个 U 盘存东西,一开始你觉得 12,288 维去存一个字太浪费。但如果这个 U 盘后续要经过 96 次信息拷贝、融合、扩展,最后要能代表整本书的内容——那就不浪费了。
步骤三:Positional Encoding(位置编码)
问题:机器不像人类从左到右阅读,它一次性看到所有 Token。它怎么知道"我爱你"和"你爱我"是不同的?
解决:为每个位置生成一个专属的位置向量,加到对应的词向量上。
位置 1 → 位置向量₁ (12,288 维)
位置 2 → 位置向量₂ (12,288 维)
位置 3 → 位置向量₃ (12,288 维)
...
最终向量 = 词向量 + 位置向量(同位相加)
为什么位置编码能提高相邻词的相似度?
“首先"和"明确"这两个词本身的语义相似度可能只有 0.38,但当它们紧挨着出现在同一段文字中时,加入位置编码后,它们的相似度可能提升到 0.4+。这样可以促进相邻词之间更多的信息交换,帮助模型形成短语(phrase)级别的理解。
- GPT-3 的上下文窗口是 2,048 个 Token,所以最多只需要计算 2,048 个位置向量的编码
- 位置编码在训练初期也是随机初始化的,跟着整个模型一起学习
步骤四:Encoder / Decoder 的信息聚合
这是 Transformer 最核心、最复杂的部分。
核心思想:多轮信息聚合
初始:1,300 个向量(每个只代表一个 Token 的语义 + 位置,合起来表达上面提到的 650 字对话)
第 1 轮聚合:
每个向量作为"中心主题词",去其他 1,299 个向量那里"借"信息
→ 相关性高的多借,相关性低的少借
→ 得到新的一组 1,300 个向量
第 2 轮聚合:
此时每个向量已经不再只代表一个字了(可能代表短词/短语的意思)
继续互相"借"信息
→ 短语和短语之间信息交换
...
第 96 轮聚合:
每个向量都经历了 96 轮信息交换
→ 每个向量都包含了整段文字中极其丰富的语义信息
关键特性:
- 向量数量始终不变(输入 1,300 个 → 输出 1,300 个)
- 但每个向量包含的信息量呈指数增长
- 最后一个向量代表整段文字——前面的都扔掉,只保留最后一个
**Encoder vs Decoder 的区别,核心是自注意力机制(Self-Attention)的具体计算方式。
步骤五:Linear + Softmax(线性层 + 输出概率)
这是整个 Transformer 的最后一步,也是最简单的一步。
最后一个向量(代表整段文字的语义)
│
▼
┌─────────────┐
│ Linear │ 线性变换,映射到词表大小
│ (全连接层) │ GPT-3 词表约 5 万个 Token
└──────┬──────┘
│
▼
┌─────────────┐
│ Softmax │ 把分数转为概率(总和 = 1)
└──────┬──────┘
│
▼
选择概率最高的 Token 作为第 651 个字
- Linear 层的参数通常复用 Embedding 层的参数(或独立训练)
- 个别模型不共享参数,则 Linear 层也需要自行梯度更新
四、完整训练流程
一张图理解全部
┌──────────────────────────────────────────────────────────┐
│ 无论训练还是推理,都是这张图 │
│ │
│ 输入文字 │
│ │ │
│ ▼ │
│ Tokenization ──▶ Embedding ──▶ Positional Encoding │
│ │ │
│ ▼ │
│ Decoder × 96 层 │
│ (信息聚合 × 96 轮) │
│ │ │
│ ▼ │
│ 取最后一个向量 │
│ │ │
│ ▼ │
│ Linear ──▶ Softmax │
│ │ │
│ ▼ │
│ 输出下一个 Token │
└──────────────────────────────────────────────────────────┘
训练过程
- 一条训练数据:给模型前 N 个字,让它预测第 N+1 个字
- 计算误差:预测的 Token ≠ 正确答案 → 产生误差(损失函数)
- 梯度反向传播:
- GPT-3 总共有 1,750 亿个参数
- 其中 Embedding 层约 6 亿个参数(维度参数)、位置编码约 2,500 万个参数
- 96 层 Decoder 占了超过 1,000 亿参数——真正的大户
- 每个参数都要计算"该变大还是变小"来降低总误差
- 参数更新:所有参数同时调整
- Batch 循环:数据分批(Batch),每批训练完就更新一次参数
- Epoch:全部训练数据跑完一轮 = 1 个 Epoch
神经网络的应用
- 神经网络就是一个"万能公式”——Embedding、位置编码、Decoder 背后都是神经网络
- 梯度下降:每次计算误差后,让 1,750 亿参数"都挪一点"
- 混沌到有序:从随机初始化的参数,到能够理解 100 万字并准确续写
五、Encoder vs Decoder 应用场景对比
| 组件 | 擅长任务 | 典型应用 | 核心能力 |
|---|---|---|---|
| Encoder | 分析/理解 | 语义相似度比较、情感分析、文本分类 | 把一段文字理解后输出一个语义向量 |
| Decoder | 生成/创作 | 回答问题、翻译、写文章、文生图 | 从向量生成人类可读的内容 |
多模态中的 Encoder-Decoder:
- 文字 → Text Encoder → 向量
- 图片 → Image Encoder → 向量
- 两个向量相似度高 → 说明文字和图片内容匹配
- 文生图:Text Encoder 把文字变向量 → Image Decoder 把向量变图片
六、核心概念速查表
| 概念 | 一句话解释 |
|---|---|
| Token | 模型处理文本的最小单元(可能是字、词或子词) |
| Tokenization | 把自然语言文字拆成 Token 序列的过程 |
| Embedding | 用一个高维向量来表示一个 Token 的语义 |
| Positional Encoding | 给每个向量加上位置信息,让模型知道字词的顺序 |
| Encoder | 用多轮信息聚合来"看懂"输入文字 |
| Decoder | 在理解的基础上,逐字生成输出 |
| Decoder-Only | GPT 系列采用的架构,只用解码器完成理解+生成 |
| 信息聚合 | 每个向量去其他向量那里"借"信息,轮次越多理解越深 |
| Linear + Softmax | 最后一步:把语义向量映射为"下一个 Token 是哪个"的概率 |
| 最后一个向量 | 无论输入多少字,Encoder/Decoder 输出的最后一个向量代表整段文字 |
七、Q&A
Q: 向量有方向吗? A: 所有向量都有方向。二维向量是从原点到坐标点的连线,一万多维也同理。
Q: 为什么 Embedding 维度要这么高(12,288 维)? A: 因为后续要经过 96 轮信息聚合,每个向量最终需要承载极其丰富的语义信息。如果一开始维度太低,信息量瓶颈会导致理解能力不足。
Q: RAG 知识库里的 Embedding 和这里的 Embedding 是一回事吗? A: 类似但不同。RAG 的 Embedding 是一个独立训练的小模型,专门用于把一段文本变成一个向量(用于向量检索),相当于这里的 Embedding + Encoder 合在一起的功能。
Q: 位置编码为什么能提高相邻词的相似度? A: 两个词本身语义相似度可能不高,但它们在句子中紧挨着出现。加入位置编码后,它们的向量相似度被"拔高"了一点,从而促进更多信息交换,帮助模型形成短语级别的理解。
Q: Mask(掩码)只在训练时用吗? A: 是的。训练时需要用 Mask 遮住后面的内容(不能让模型偷看答案),使用模型时不需要——因为使用时就只有前面的内容,没什么可遮的。
Q: 参数越多越好吗? A: 不一定。如果数据量固定,参数过多会导致问题(过拟合等)。需要在数据量和参数量之间找到平衡。