Transformer:现代大模型核心架构入门
Transformer 是一种让所有词同时互相"看"彼此的神经网络,而不是像之前的 RNN 那样一个字一个字地读。
一、为什么要抛弃 RNN?先看痛点
在 Transformer 出现之前,处理语言的主流方法是RNN(循环神经网络),它像人一样"一个字一个字地读"——必须处理完第1个字,才能处理第2个字,依此类推。
三大致命缺陷:
问题 | 具体表现 |
串行瓶颈 | 无法并行,1000个字的句子要走1000步,GPU利用率极低 |
梯度消失 | 第1个字的信息传递到第1000个字时,梯度近乎为零,"忘了开头说了什么" |
长距离依赖弱 | "小明……(中间500字)……他喜欢"中的"他"很难关联回"小明" |
Transformer 的核心思路是:把"一个字一个字读"改成"所有字同时互相看",一步到位捕捉所有位置间的关系。
二、整体架构总览
先看整体骨架 :
三、词嵌入(Token Embedding):把文字变成数字
新手核心问题:计算机怎么理解"苹果"这个词?
计算机只认数字,所以第一步是把所有词映射成一个高维数字向量(比如 768维或 4096维的浮点数列表)。
- 词表:把所有可能的词/子词列成一个大表(3.2万~12.8万个)
- 每个词在表里有一个编号(Token ID)
- 通过"嵌入层"(一张巨大的查找表),编号 → 向量
类比:就像字典,但字典里每个字的"解释"是一串768个数字,而不是文字说明。
四、位置编码(Positional Encoding):告诉模型"你在第几位"
新手疑问:Transformer既然所有词同时看,那它怎么知道"我爱你"和"你爱我"是不同的意思?
答:全靠位置编码。每个词的向量 + 该词所在位置的向量,叠加在一起,模型就能区分位置1的"我"和位置3的"我" 。
现代升级——RoPE 旋转位置编码:原始 sin/cos 位置编码有个缺点:训练时只见过512个位置,推理时遇到1000个位置就"懵了"。LLaMA、Qwen 等大模型用的RoPE通过旋转矩阵编码相对位置,外推能力更强,支持 32k、128k 甚至更长上下文。
五、核心灵魂:自注意力机制(Self-Attention)
这是整个 Transformer 最难理解、也最重要的部分。用一个生活类比来理解:
你在读"银行存了钱,然后去河岸散步"这句话。
看到"银行"时,你的大脑会自动把它和"钱"关联,而非"河岸"。这种"词与词之间的关联度计算",就是注意力机制在做的事。
三个角色——Q、K、V:
名称 | 全称 | 类比 | 作用 |
Q | Query(查询) | 你想找什么 | 当前词发出的"提问" |
K | Key(键) | 档案的标签 | 每个词的"索引标签" |
V | Value(值) | 档案的内容 | 每个词实际携带的信息 |
计算步骤(5步):
- 用当前词的Q去和所有词的K点积 → 得到相似度分数
- 除以 √d(√d 是一个缩放系数,防止点积值过大导致 Softmax 梯度消失,是让 Transformer 能正常训练的关键细节。防止数值过大,梯度消失) →缩放
- 过 Softmax 归一化 → 得到 0~1 的注意力权重(所有词权重之和=1,把数字变成概率分布)
- 用权重对所有词的V加权求和 → 得到融合了上下文的新表
六、多头注意力(Multi-Head Attention):同时从多个角度"看"
新手疑问:为什么需要多个头(head)?
单头注意力一次只能聚焦一种语义关系。比如处理"小明让小红帮他做作业"时:
- 第1个头 → 专注指代关系("他"=小明)
- 第2个头 → 专注动作关系("让"的施受者)
- 第3个头 → 专注实体关联(人物关系)
- ……(通常 8~32 个头)
多个头并行计算,最后把结果拼接起来,表达能力远强于单头。
类比:用多台摄像机从不同角度拍同一场景,最后剪辑在一起,比单一视角信息更丰富。
七、掩码(Mask):GPT 类模型如何"防止作弊"
GPT 在训练时是给定前文预测下一个词——但如果训练时允许模型偷看答案(后面的词),那预测就没意义了。
掩码自注意力用一个下三角矩阵把未来的词遮住:
这就是"单向"的含义。
八、前馈神经网络(FFN):注意力之后的"深度加工"
注意力层负责收集信息(从其他词那里取来相关内容),FFN 层负责深度加工(对每个词的向量做独立变换)。
结构很简单:两层线性变换 + 一个激活函数。
组件 | 作用 | 类比 |
第1层线性 | 升维(例:768→3072) | 把信息展开成更大空间 |
激活函数 | 引入非线性(GELU/SwiGLU) | 筛选有用的特征 |
第2层线性 | 降维(3072→768) | 压缩回原始维度 |
九、残差连接 + 层归一化:训练稳定性的关键
这两个组件不显眼,但极其重要——没有它们,几十层深的 Transformer 根本训练不收敛。
残差连接(Residual Connection):
输出 = 子层(x) + x ← 把输入直接加回来
好处:梯度可以直接从后面"跳回"前面,不用穿越重重非线性,有效防止梯度消失。
类比:高速公路旁边还有辅路——主干道走注意力/FFN,辅路直接走原始信号,两者汇合。
层归一化(LayerNorm):把每层的激活值归一化到均值0、方差1,防止数值爆炸,让训练更稳定。
为什么这能解决"梯度消失"?
训练时,梯度要从最后一层反向传回第一层。每经过一个子层,梯度就要乘以该层的导数——如果导数小于 1,乘几十次就接近 0 了(梯度消失)。
十、训练 vs 推理:两种完全不同的工作模式
十一、现代大模型的关键优化
优化点 | 原始设计 | 现代大模型改进 | 代表模型 |
位置编码 | 绝对正弦/余弦 | RoPE 旋转位置编码 | LLaMA、Qwen、GPT |
激活函数 | ReLU | GELU / SwiGLU | LLaMA2/3、Qwen |
归一化 | Post-LN LayerNorm | Pre-LN RMSNorm | LLaMA、Mistral |
注意力效率 | 标准 MHA | GQA 分组查询注意力 | LLaMA3、Qwen2 |
显存优化 | 标准注意力 | FlashAttention | 几乎所有主流模型 |
超大模型 | 全激活 FFN | MoE 混合专家 | Mixtral、DeepSeek |
几个名词解释:
- RMSNorm:LayerNorm 的简化版,省掉均值计算,只保留方差归一化,速度更快效果相当
- GQA(分组查询注意力):多个 Q 头共享一组 K/V,大幅减少显存,推理速度提升 2-4×
- FlashAttention:重写注意力计算内存访问模式,减少显存读写次数,对用户透明
- MoE(混合专家):FFN 拆成 N 个"专家网络",每次只激活其中几个,实现"万亿参数量但计算成本只有百亿"的效果
十二、复杂度一眼看懂
自注意力:O(n² × d) n = 序列长度,d = 向量维度 ↑ 瓶颈在 n²,序列加倍 → 计算量变4倍RNN:O(n × d²) ↑ 瓶颈在 d²,短序列时比 Transformer 慢
结论:
- 短文本(<512 tokens)→ Transformer 完全碾压 RNN
- 超长文本(>100k tokens)→ 需要滑动窗口、稀疏注意力(Mistral Sliding Window)或 FlashAttention 降低 n² 开销
十三、一句话总结各核心组件
组件 | 一句话理解 |
Token Embedding词嵌入 | 把文字翻译成数字向量 |
Positional Encoding位置编码 | 在向量里塞入"这个词排第几位"的信息 |
Self-Attention自注意力机制 | 每个词去问所有词"你和我有多相关",加权收集信息 |
Multi-Head多头注意力 | 同时从8/16/32个角度做注意力,并行捕捉不同语义关系 |
Masked Attention掩码 | 遮住未来的词,保证自回归生成合法 |
Cross-Attention | 让解码器"看一眼"编码器的全局理解(翻译/多模态用) |
FFN前馈神经网络 | 对每个词独立做非线性变换,深度加工语义 |
残差连接 | 给梯度开辟直行通道,防止训练崩掉 |
LayerNorm/RMSNorm | 每层数值归一化,训练稳定 |
KV Cache | 推理时缓存已算的 K/V,不重复算,提速数倍 |
看完之后,是不是有所收获呢?若有内容不当的地方,欢迎交流!
