AI 基础 · Transformer 详解
Transformer:现代大模型的那台"发动机"
你每天跟 ChatGPT 聊天,背后转的就是这台机器。2017 年一篇论文《Attention Is All You Need》提出了它,之后 GPT、BERT、LLaMA 全是它的变种。这一课不堆公式吓你,先用"开会时大家互相打听消息"这个比喻,把自注意力、多头、位置编码这些零件一个一个拆开看。
① 一句话直觉:什么是自注意力
读句子时,人脑不是一个词一个词顺着死读,而是边读边回头看相关的词。比如"它没灭,因为路灯太旧了"——你自动把"它"和"路灯"联系起来。自注意力(Self-Attention)就是让神经网络学会这件事:每个词都去"看"句子里所有其他词,按相关程度加权取信息。
1Q(Query)查询
"我在找什么信息?"像举手提问。
2K(Key)键
"我这里有什么可提供?"像贴在资料上的标签。
3V(Value)值
"真正的内容是什么?"像资料本身。
流程就是:用 Q 去和每个 K 算相似度(点积),得到一堆权重;再用这些权重把所有 V 加权平均,就得到这个词"应该关注到的新表示"。
② Q/K/V 到底怎么算(公式看懂就行)
三个矩阵 $Q,K,V$ 都是由同一个输入向量分别乘上三个可训练的权重矩阵 $W_Q,W_K,W_V$ 得到的:
核心公式
$$\mathrm{Attention}(Q,K,V)=\mathrm{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V$$
| 符号 | 含义 | 为什么要有它 |
| $QK^\top$ | 每个 Query 和所有 Key 做点积 | 算出"谁和谁相关"的分数表 |
| $\sqrt{d_k}$ | 除以 Key 维度的平方根 | 维度大时点积会过大,softmax 会塌成一点;除一下稳住梯度 |
| $\mathrm{softmax}$ | 把分数压成概率 | 所有权重加起来等于 1,方便加权 |
| $\times V$ | 用权重对所有 Value 求和 | 真正把"关注到的信息"取出来 |
记忆法Q 是"我想问啥",K 是"你招牌写啥",V 是"你店里真有啥"。Q 和 K 对得上眼,就多拿一点你的 V。
③ 多头注意力(Multi-Head Attention)
单头注意力只学一种"关注关系"。但一个词和别的词之间的关系是多维度的:可能是语法上的主谓,也可能是语义上的指代,还可能是位置上的邻近。多头就是把 Q/K/V 切成好几份,分头各算各的注意力,最后拼起来。
多头
$$\mathrm{MultiHead}(Q,K,V)=\mathrm{Concat}(\mathrm{head}_1,\dots,\mathrm{head}_h)W^O$$
$$\mathrm{head}_i=\mathrm{Attention}(QW_i^Q,KW_i^K,VW_i^V)$$
| 做法 | 类比 | 好处 |
| 8 头 / 16 头 | 8 个人同时读这句话,各看各的角度 | 多角度捕捉关系,表达力更强 |
| 每头维度变小 | 每人分到一小块信息专注看 | 总计算量和单头差不多,不更贵 |
④ 位置编码:模型怎么知道词的顺序
注意力本身是"打乱顺序无所谓"的——它一视同仁地看所有词。但"狗咬人"和"人咬狗"意思完全相反,所以必须额外告诉模型每个词在第几个位置。这就是位置编码(Positional Encoding)。
| 方案 | 做法 | 优缺点 |
正弦编码 (原版 Transformer) | 用不同频率的正余弦函数给每个位置算一组固定向量 | 不用训练、能外推到更长句子;但效果一般 |
RoPE 旋转位置编码 (LLaMA 系列) | 把位置信息"旋转"进向量里,通过相对角度表达距离 | 相对位置建模好,长文本外推强,现在主流 |
| ALiBi | 不加向量,直接在注意力分数上按距离扣一个惩罚 | 极简、外推超长上下文友好 |
防坑位置编码不是"把位置数字直接拼进去"那么简单——直接用 1、2、3、4 这种编号会让大数字压制小数字。所以要用正弦、旋转这种能表达相对距离、且量级均匀的方式。
⑤ FFN、残差、LayerNorm:搭起真正的一层
一个 Transformer 层不是只有注意力,它是三件套叠起来的:
| 零件 | 作用 | 大白话 |
| 注意力子层 | 词与词之间交换信息 | "互相打听" |
| 前馈网络 FFN | 对每个词独立做两层非线性变换 | "各自消化吸收",通常是 $xW_1\rightarrow \mathrm{激活}\rightarrow W_2$ |
| 残差连接 | 子层输入直接加回输出:$x+\mathrm{Sublayer}(x)$ | "别走丢原来的信息",让几十层也能训得动 |
| LayerNorm | 对每个样本的特征做归一化 | "稳住数值",防止越训越大或越小 |
一层的标准结构
$$x := \mathrm{LayerNorm}(x + \mathrm{MultiHeadAttn}(x))$$
$$x := \mathrm{LayerNorm}(x + \mathrm{FFN}(x))$$
堆上几十层(GPT-3 是 96 层),就是一个大模型。
⑥ Encoder-Decoder vs Decoder-only
| 架构 | 特点 | 代表 | 擅长 |
| Encoder-Decoder | 编码器读全句(双向看),解码器逐词生成(只能看左边) | T5、早期 BART | 翻译、摘要这种"先看懂全文再生成"的任务 |
| Decoder-only | 只有解码器,每生成一个词只能看它左边的词(因果掩码) | GPT、LLaMA、Qwen | 对话、写作、通用大模型——现在的主流 |
| Encoder-only | 双向看整句,不做生成 | BERT | 分类、检索、打标签 |
为什么现在都是 Decoder-only因为它最"通用":只要是预测下一个词,就能套对话、写代码、做摘要。数据又多又便宜,堆参数就变强,所以成了今天大模型的事实标准。
⑦ 三个例子:把公式落到具体句子上
例 1 · 指代消解
句子:"小王把书递给小李,他很开心。"
算"他"这个词的注意力时,模型会给"小王"和"小李"很高的权重,结合上下文判断"他"指谁。Q/K/V 在这里干的就是"把代词和它真正指的人连起来"。
例 2 · 多头各看各的
句子:"The animal didn't cross the street because it was tired."
有的头专注语法关系(it ↔ animal 的指代),有的头专注邻近词(street、cross)。8 个头合起来,模型同时从多个角度理解这句话,最后拼出更丰富的表示。
例 3 · 因果掩码
Decoder-only 生成"今天天气很__"时,预测"好"之前。
掩码会把右边还没生成的词全部遮住——模型只能看到"今天天气很",不能偷看答案,这正是它能一个词一个词往外蹦的原因。
防坑提示:三个最容易搞错的点
① 别把 Q/K/V 当成三个不同的输入——它们都来自同一个句子,只是乘了不同的权重矩阵。
② $\sqrt{d_k}$ 不是装饰,没有它维度一大 softmax 就饱和、梯度消失,模型训不动。
③ Decoder-only 不是"没有编码器就弱",恰恰相反,GPT 证明了单向生成 + 海量数据 + 大参数就能通吃。
⑧ 折叠自测(点开看答案)
基础1. 自注意力里 Q、K、V 分别类比什么?
Q 是"我在找什么(查询)",K 是"我能提供什么(标签)",V 是"真正的内容(资料)"。Q 和 K 对上眼,就多拿一点对应的 V。
中档2. 注意力公式里为什么要除以 $\sqrt{d_k}$?
点积的方差会随维度 $d_k$ 变大而变大,导致 softmax 进入饱和区、梯度几乎为零。除以 $\sqrt{d_k}$ 把方差拉回稳定范围,训练才不崩。
拔高3. RoPE 相比原始正弦位置编码,为什么更受大模型青睐?
RoPE 用旋转角度编码相对位置,天然适合长距离依赖,且在长度外推(训练短、测试长)时表现更好;LLaMA 等现代模型靠它轻松支持上万上下文。
⑨ 费曼三问:用大白话讲给自己听
问 1:如果我妈问"自注意力是干嘛的",我怎么说?
就是读句子时,每个词都回头看看别的词,和谁相关就多听听谁的,把相关信息拢到自己身上。
问 2:多头比单头好在哪?
一个人只从一个角度看句子太死板,好几个人各看各的角度(主谓、指代、远近),合起来理解更全面。
问 3:为什么现在聊天模型都是 Decoder-only?
因为它只要学会"预测下一个词"就能套对话、写代码、做摘要,通用又好堆数据堆参数,自然成了主流。
口述全链路
"Transformer 让每个词和句子里所有词算相关度:Q 问、K 答、V 给内容,点积除根号再 softmax 加权求和。"
"多头分头各看各的关系再拼;位置编码告诉模型词的顺序,现在主流用 RoPE。"
"外面包 FFN、残差、LayerNorm,堆几十层就是一个大模型。"
"GPT 是 Decoder-only,只能看左边逐词生成;它通用又能堆规模,就成了今天的标准。"
⑩ 典型模型规模速查
不同模型就是把上面这些零件按不同尺寸拼起来。看这张表建立量级感:
| 模型 | 层数 | 注意力头数 | 隐藏维度 | 上下文长度 |
| GPT-2 (1.5B) | 24 | 16 | 1600 | 1024 |
| GPT-3 (175B) | 96 | 96 | 12288 | 2048 |
| LLaMA-2 7B | 32 | 32 | 4096 | 4096 |
| LLaMA-2 70B | 80 | 64 | 8192 | 4096 |
怎么看参数 ≈ 层数 × 隐藏维度 × 常数。层数越多越深,维度越大表达越丰富,头数要能整除维度。
⑪ 为什么长文本这么贵:注意力的 O(n²)
自注意力要让每个词都和所有其他词算一次相似度,所以计算量和序列长度的平方成正比:
复杂度
$$\text{注意力计算量} \propto n^2 \cdot d$$
n 是词数,d 是维度。
| 序列长度 n | 相对计算量 n² | 感受 |
| 1k 词 | 1× | 飞快 |
| 8k 词 | 64× | 开始变贵 |
| 128k 词 | 16384× | 极贵,必须靠优化/稀疏注意力扛 |
这就是为什么"超长上下文"不是白送的——上下文翻一倍,注意力成本翻两番。所以才需要 RoPE 外推、稀疏注意力、KV Cache 等一堆工程优化。
⑫ 为什么是它取代了 RNN
Transformer 出来之前,主流是 RNN/LSTM——一个词一个词顺序地读。它有两个硬伤:
| 对比 | RNN / LSTM | Transformer |
| 怎么读句子 | 按顺序一个词一个词 | 所有词并行看 |
| 长距离依赖 | 传太远信息就丢了 | 任意两个词直接交互 |
| 并行训练 | 不行(得等前一个算完) | 行,GPU 能充分利用 |
| 结果 | 慢、长文弱 | 快、可堆规模 |
一句话总结Transformer 用"全局注意力 + 并行计算"两件事,同时解决了 RNN"记不住远的"和"训不快"两个老毛病,这才让今天这种超大规模模型成为可能。
⑬ 分层练习(点开解析)
基础Transformer 这个名字直译是什么?
原指"转换器",因论文强调"注意力即可,不需要循环/卷积结构"而得名。
基础自注意力中 Q 和 K 做点积是为了算什么?
算"每个词和其他词的相关程度",得到一张相似度分数表,再 softmax 成权重。
中档为什么 Decoder 生成时要加因果掩码?
因为它不能偷看右边还没生成的词。掩码把未来位置遮住,只能看左边,才能像接龙一样逐词生成。
中档残差连接解决了什么问题?
让深层网络不至于梯度消失、训不动;把输入直接加回输出,保留原始信息。
中档多头注意力的总维度和单头相比怎样?
通常保持相近:把头切小,每头维度变小,拼接后总维度不变,计算量大致持平。
拔高为什么注意力复杂度是 O(n²d)?长文本为什么贵?
每个词要和所有 n 个词算相似度,得到 n×n 的注意力矩阵,再乘维度 d。n 翻倍计算翻两番,所以超长上下文很贵。
拔高RoPE 为什么比正弦编码更适合长上下文?
它把相对位置编码进旋转角,外推到训练时没见过的更长序列时衰减更慢,支撑上万上下文。
⑭ 三句记忆口诀
① Q 问 K 答 V 给货,点积除根再 softmax。
② 多头分头看关系,RoPE 告诉顺序。
③ FFN 消化、残差保信息、LayerNorm 稳数值,堆几十层就是大模型。
📌 知识链路
本节位置
Transformer 是后面一切的地基:训练流程、GPT 演进、RAG 都建立在它之上。