【大模型应用开发】Transformer 架构详解 —— 大模型的“心脏“
9.1 背景:为什么需要 Transformer?
2017 年之前,处理文字的主流模型是 RNN(循环神经网络) 和它的变体 LSTM。它们有什么问题?
RNN 的三大痛点
痛点 1:长距离遗忘
"小明昨天去了超市,买了牛奶、面包和鸡蛋,
然后他回家做了___"
RNN 要"记得"小明昨天去了超市,但中间隔着 20 个词,
前面的信息早就"忘"得差不多了。
痛点 2:不能并行
RNN 必须一个字一个字顺序处理:
第 1 个词 → 第 2 个词 → 第 3 个词 → ...
没法同时处理,训练慢得离谱。
痛点 3:梯度消失
错误信息在反向传播时逐层衰减,模型学不到远处的规律。
Transformer 的破局
2017 年,Google 发表论文《Attention Is All You Need》(你只需要注意力),提出了 Transformer:
- 注意力机制:所有词同时"互相对话",没有距离遗忘问题
- 完全并行:所有词同时处理,训练速度飞升
- 效果碾压:从此 GPT、BERT、Llama、Qwen 全是 Transformer
一句话:Transformer 让模型从"一个字一个字排队处理"变成了"所有字同时开会讨论"。
9.2 宏观结构:一张图看懂
┌─────────────────────────────────────────────────┐
│ 输入文本 │
│ "中国的首都是____" │
└──────────────────────┬──────────────────────────┘
↓
┌─────────────────┐
│ Token 化 + Embedding │ ← 第 2、8 课学过
└─────────────────┘
↓
┌─────────────────┐
│ 位置编码 (Positional Encoding) │ ← 第 11 课细讲
└─────────────────┘
↓
┌─────── 重复 N 次(如 12/32/64 层)───────┐
↓ ↓
┌─────────────────┐ ┌─────────────────┐
│ 多头自注意力 │ │ 前馈网络 FFN │
│ Multi-Head │ → 残差 → Norm → │ Feed-Forward │
│ Attention │ │ + 残差 + Norm │
└─────────────────┘ └─────────────────┘
↓
┌─────────────────┐
│ 输出预测层(Softmax) │
└─────────────────┘
↓
"北京"(概率最高的词)
整个 Transformer 的核心就三块:
- 多头注意力:让每个词"看到"所有其他词(第 10 课深讲)
- 前馈网络:对每个词单独做"深度思考"
- 残差 + LayerNorm:让深层网络能正常训练
9.3 核心流程:一个 Token 的旅程
跟着一个词"北京"走一遍:
第 1 步:向量化
"北京" → Token 编号 3111 → Embedding 向量 [0.3, -0.1, 0.8, ...](如 4096 维)
第 2 步:加上位置信息
位置向量(告诉模型"我是第 4 个词")+ 词向量 → 最终输入向量
第 3 步:多头注意力
"北京"发出的查询(Q),去和句子里所有词的**键(K)**比对:
"北京" vs "中国" → 相关性很高(0.9)
"北京" vs "的" → 相关性一般(0.4)
"北京" vs "首都" → 相关性很高(0.85)
然后把值(V)按相关性加权汇总。这一步让每个词都吸收全句信息。
第 4 步:前馈网络
对融合后的向量做两次线性变换 + 激活函数(相当于每个词单独"想一想")。
第 5 步:重复 N 层
上面的 3~4 步重复十几到几十层,信息一层层被加工得越来越"懂语义"。
第 6 步:预测下一个词
最后一层输出向量 → 映射回词汇表 → 得到每个词的概率 → 选"北京"。
9.4 残差连接(Residual Connection)
问题
Transformer 动不动就是几十层。网络太深会梯度消失:误差信号传到浅层就衰减没了,底层学不到东西。
解决
给每一层加一条"捷径":
输出 = 层处理(输入) + 输入
↑ ↑
精加工的结果 原始信息(不走弯路)
类比:快递不想每次都穿过整个拥堵城区,所以修了高架桥直达。即使城区内部堵死,信息也能通过高架桥传出去。
残差让模型可以堆叠 100+ 层而依然能训练。
9.5 LayerNorm(层归一化)
问题
输入数据的数值范围飘忽不定(有的维度是 0.01,有的是 100),训练不稳定。
解决
对每个样本的向量做"标准化":减去均值、除以标准差,让数值稳定在 0 附近。
LayerNorm([1.2, -0.5, 3.1, 0.4]) → 标准化后均值≈0,标准差≈1
类比:比赛前把所有选手的身高换算成"相对平均值的偏差",避免身高差影响裁判判断。
9.6 前馈网络(FFN):被低估的部分
注意力负责"词与词之间"的交流,FFN 负责**"单个词内部"的深加工**:
FFN(x) = activation(x · W1 + b1) · W2 + b2
4096 维 → 升维到 11008 维 → 激活 → 降维回 4096 维
直觉:先"展开"到高维空间(能看到更多细节),思考完再"压缩"回去。一个事实:FFN 里的参数占整个模型参数的三分之二,比注意力还多。
9.7 现在的 LLM 都是 Decoder-only
原始论文里有 Encoder(编码器)和 Decoder(解码器)两部分,但现在的大模型(GPT、Llama、Qwen、DeepSeek)只用 Decoder 部分,而且做了简化:
GPT 的架构(简化):
输入 → Embedding → [ 掩码自注意力 → FFN → 残差 → Norm ] × N 层 → 输出层
└──────── 每一层都长这样 ────────┘
区别在于一个关键细节:掩码(Mask)。GPT 生成文字时只能"看前面"不能"偷看后面":
生成"中国的首都____"时:
"北" 可以看到:中、国、的、首、都(前面所有)
"北" 不能看到:它自己之后的任何字
因为自回归生成时,后面的字还没生成出来呢!
所以 Decoder-only 模型的注意力叫因果注意力(Causal Attention):只允许往"前"看。
9.8 参数都花在哪了?
以 Llama-7B 为例(约 70 亿参数):
| 组件 | 占比(约) |
|---|---|
| FFN 的权重矩阵 | ~67% |
| 注意力(Q/K/V/O 矩阵) | ~25% |
| Embedding 层 | ~8% |
70 亿参数意味着:存储模型需要 70 亿 × 2 字节(FP16)≈ 14GB。 这直接关系到第 15 课要讲的"模型量化与本地部署"。
更多推荐
所有评论(0)