AI Infra学习之旅-残差、LayerNorm与Encoder-Decoder全貌
AI Infra学习之旅-残差、LayerNorm与Encoder-Decoder全貌
这是“Transformer 原理深讲系列”的第 4 篇。
前三篇我们已经依次讲清楚了:为什么需要 Transformer,文本如何进入模型,位置编码和 Attention 的核心计算机制,以及多头、Mask、FFN 为什么是 Transformer 不可缺少的组成部分。
到了这一篇,我们要完成两件更“总装”的事情:
第一,把这些零件真正拼成一层完整的 Transformer block;第二,把 Encoder、Decoder、Encoder-only、Decoder-only、Encoder-Decoder 这几种结构放到同一张图里讲清楚。
一、为什么“理解一层 Transformer Block”比记一堆模块更重要
很多人学 Transformer 时,会变成下面这种状态:
- 知道什么是 Q/K/V
- 知道什么是 Attention
- 知道有 Multi-Head
- 知道有 FFN
- 知道有 LayerNorm 和残差
但真正问一句:
一层 Transformer block 从输入到输出,到底完整经历了什么?
往往就开始糊了。
这是因为前面那些模块虽然都懂一点,但还没有真正被组织成一个动态系统。
而 Transformer 真正的力量,恰恰不在于某一个单点模块,而在于:
这些模块被怎样稳定地组合起来,并且能够一层一层不断堆叠。
所以这一篇的目标,是把前面那些“零部件”真正安装到一台能工作的机器里。
二、先回顾:一层 Transformer Block 里至少有哪两个核心功能模块
如果先不管残差和归一化,一层 Transformer block 至少包含两个核心子层:
1. Attention 子层
作用:
- 让每个位置和上下文中其他位置建立关系
- 完成跨位置的信息交换
- 生成上下文化表示
2. FFN 子层
作用:
- 对每个位置的表示单独做进一步非线性加工
- 强化和重组该位置内部的特征模式
也就是说,block 的本体骨架是:
跨位置交互 + 逐位置加工
这是你必须记住的一条主线。
但如果只有这两样,还不够。
因为深层网络会遇到训练稳定性问题。
于是我们就需要另外两个支撑件:
- 残差连接(Residual)
- LayerNorm
三、为什么深层网络会难训练
要理解残差和 LayerNorm,必须先理解一个背景事实:
网络一深,训练就容易变难。
这不是 Transformer 特有的问题,而是深层神经网络的共性问题。
常见困难包括:
1. 信息容易被层层覆盖
如果每一层都强行把输入改写成全新的表示,那么前面层的重要信息可能会被逐渐冲掉。
2. 梯度传播容易变差
反向传播时,梯度要穿过很多层。
如果每一层都让梯度缩小或扭曲一点,前面层拿到的有效训练信号就会越来越弱。
3. 数值分布容易漂移
随着层数增加,隐藏表示的均值、方差和尺度都会不断变化。
这会让训练:
- 更难稳定
- 更难调学习率
- 更容易发散或收敛很慢
所以深层 Transformer 要真正好用,必须解决两个问题:
- 信息和梯度怎么顺畅穿过去
- 每层输入输出的数值分布怎么维持稳定
这就对应:
- 残差连接
- LayerNorm
四、残差连接到底是什么
残差连接的核心形式很简单:
其中:
- (x) 是输入
- (F(x)) 是某个子层的输出(比如 attention 或 FFN)
- (y) 是最终输出
这意味着,子层不是直接把输入变成:
而是变成:
也就是:
原表示 + 本层修正量
这就是 residual connection,也叫 skip connection。
五、为什么叫“残差”
因为它不是让网络直接学习一个完整映射:
而是让网络学习:
于是:
这说明子层真正学到的,是相对输入的修正量,也就是“残差”。
从这个角度看,Transformer 的每一层不是在“推翻输入重来”,而是在:
已有表示的基础上,做一步增量式修正。
六、残差连接为什么如此重要
1. 给原始信息保留一条直通路径
如果没有残差,输出就是 (F(x))。
那一旦 (F) 学得不好,原信息可能被严重破坏。
有了残差:
即使 (F(x)) 暂时不理想,原输入 (x) 至少还能保留。
所以模型不会轻易“把前面学到的东西洗掉”。
2. 让网络更容易学“接近恒等映射”
并不是每一层都需要大改输入。
很多时候,最优行为只是做一点小修正。
有残差时,如果本层暂时没什么要改的,只要让:
就行了。
这让深层网络更容易收敛。
3. 让梯度更容易传播
从反向传播角度看:
这里 (I) 是恒等映射。
这意味着,即使 (F) 的梯度路径不够理想,梯度仍然有一条较为稳定的直通通路。
所以残差连接本质上是在做两件事:
- 稳住前向信息流
- 稳住反向梯度流
七、从“状态演化”角度看残差
如果你喜欢更统一的理解方式,可以把:
看成一种离散状态更新:
- (x):当前状态
- (F(x)):本层施加的增量修正
- (y):更新后的状态
这很像很多动力系统里的形式:
所以 Transformer 的深层堆叠,也可以看成:
表示状态在层与层之间不断被小步修正。
这种理解对后面看待“深层 Transformer 是怎样逐步形成更高语义抽象”的问题很有帮助。
八、LayerNorm 到底是什么
残差负责信息和梯度通路,
LayerNorm 负责数值稳定。
它的定义如下。
设某个位置上的隐藏向量是:
先计算它在特征维度上的均值:
再计算方差:
然后归一化:
最后再加上可学习缩放和平移参数:
写成向量形式就是:
其中:
- (\gamma,\beta \in \mathbb{R}^{d})
- (\epsilon) 是防止除零的小常数
九、LayerNorm 到底在归一化什么
这个问题特别容易混淆。
LayerNorm 不是:
- 对整个 batch 做归一化
- 也不是对整个序列所有 token 一起归一化
它通常是:
对单个 token 的特征向量,在特征维度上做归一化。
也就是说,如果某个 token 当前表示是一个 4096 维向量,那么 LayerNorm 会:
- 只看这 4096 个数
- 计算它们自己的均值和方差
- 把这个向量拉回到更规范的数值尺度
所以 LayerNorm 的作用对象是:
每个位置自己的隐藏状态。
十、为什么 LayerNorm 很重要
1. 控制数值尺度
深层网络里,如果某层输出整体尺度突然过大,就会导致:
- attention score 爆掉
- softmax 过于尖锐
- FFN 激活失衡
LayerNorm 能把输入重新拉回一个更稳定的数值区间。
2. 减少层间分布漂移
每层看到的输入分布如果不断飘移,网络就会很难训练。
LayerNorm 帮助不同层看到更可控的输入尺度和分布。
3. 优化更稳定
尺度被规范后,学习率更容易设,深层训练也更稳定。
所以 LayerNorm 本质上是在做:
每层的数值环境稳定器。
十一、Pre-LN 和 Post-LN 到底有什么区别
Transformer 里 LayerNorm 位置有两种经典写法。
1. Post-LN(原始论文常见)
写作:
意思是:
- 先经过子层
- 再加残差
- 最后做 LayerNorm
2. Pre-LN(现代大模型更常见)
写作:
意思是:
- 先做 LayerNorm
- 再进入子层
- 再和原输入做残差相加
现代很多 GPT / LLaMA 类模型更偏 Pre-LN,因为它通常在深层堆叠时训练更稳定。
直觉上,Pre-LN 让每个子层都能先看到一个已经被归一化好的输入。
所以你可以这样记:
- Post-LN 更接近原始 Transformer
- Pre-LN 更接近现代大模型工程实践
十二、一层 Transformer block 到底完整长什么样
现在终于可以把 attention、FFN、残差、LayerNorm 拼起来了。
我们先讲现代大模型里更常见的 Pre-LN block。
设输入是:
第一步:LayerNorm + Attention + 残差
这里 attention 可以是:
- Encoder 中的双向 Self-Attention
- Decoder 中带 causal mask 的 Self-Attention
作用是:
- 先规范输入数值
- 再进行跨位置上下文交互
- 最后以残差方式把修正量加回原表示
第二步:LayerNorm + FFN + 残差
作用是:
- 先规范 attention 后的表示
- 再对每个位置做逐位置非线性加工
- 最后把加工结果以残差形式叠加回去
于是,一层完整 block 就是:
这就是一个现代 Transformer block 的最核心写法。
十三、如果是 Post-LN,写法会怎样
原始论文风格的 block 更接近:
你会发现,主骨架并没有变:
- 一次 attention 子层
- 一次 FFN 子层
- 每个子层都包着残差和 LayerNorm
区别只是 LayerNorm 放在子层前还是子层后。
十四、为什么这样的一层可以反复堆很多层
这就是 block 设计最漂亮的地方。
它之所以能一层层堆上去,是因为它同时具备:
1. 跨位置信息交换能力
由 attention 提供。
2. 逐位置特征加工能力
由 FFN 提供。
3. 稳定的信息与梯度通路
由残差提供。
4. 稳定的数值分布环境
由 LayerNorm 提供。
这意味着:
- 每一层都能“看全局”
- 又都能“加工自己”
- 还不会因为太深而轻易训练崩掉
所以 Transformer block 真正厉害的地方不只是“内部模块多”,而是:
它是一个经过精心稳定化设计的可堆叠单元。
十五、现在进入第二个大问题:Encoder 和 Decoder 到底是什么
前面我们一直在讲一个“block”,但 Transformer 并不是只包含单个 block。
真正完整的架构,必须回答:
- 这些 block 是怎么堆起来的
- 堆成 Encoder 时是什么
- 堆成 Decoder 时又是什么
- 原始 Transformer 为什么是 Encoder-Decoder
- BERT、GPT、T5 为什么会走向不同结构
先讲原始 Transformer。
十六、原始 Transformer 为什么是 Encoder-Decoder
原始 Transformer 最早面向的典型任务是:
- 机器翻译
- 摘要
- 改写
这些任务有一个共同特点:
输入是一段序列,输出是另一段序列。
例如:
- 输入英文
- 输出德文
所以最自然的结构就是:
- 先有一个模块把输入“读懂”
- 再有另一个模块基于这个理解结果去“生成输出”
于是原始 Transformer 就采用了:
- Encoder
- Decoder
两个堆叠结构。
十七、Encoder 到底在干什么
Encoder 的任务是:
对输入序列做深层上下文化编码。
如果输入是:
Encoder 会输出一组表示:
这里每个 (h_i^{enc}) 都不只是第 (i) 个 token 本身,而是:
- 它自己
- 它和其他 token 的关系
- 它在整句中的语义角色
Encoder 通常使用的是:
- 双向 Self-Attention
- 没有 causal mask
所以它更适合“理解整句”。
十八、Decoder 到底在干什么
Decoder 的任务是:
一步一步生成输出序列。
如果输出序列是:
那么 Decoder 在生成第 (t) 个 token 时,需要建模:
也就是说,它既要看:
- 自己已经生成了什么(输出前缀)
- 输入句子被 Encoder 理解后的表示(Encoder 输出)
因此原始 Decoder layer 里通常有两种 attention:
1. masked Self-Attention
让 Decoder 看自己前面的已生成 token。
2. cross-attention
让 Decoder 去查看 Encoder 的输出表示。
所以 Decoder 不只是“会生成”,而是:
基于输入理解结果做条件生成。
十九、Encoder-only、Decoder-only、Encoder-Decoder 到底怎么区分
现在把整个家族整理一下。
1. Encoder-only
代表:
- BERT
- RoBERTa
- DeBERTa
特点:
- 只保留 Encoder 堆栈
- 输入是完整序列
- 每个位置可双向看全局
- 更适合理解任务
适用任务:
- 文本分类
- 句子匹配
- 命名实体识别
- 检索编码
2. Encoder-Decoder
代表:
- 原始 Transformer
- T5
- BART
特点:
- Encoder 先理解输入
- Decoder 再基于 Encoder 输出生成新序列
- 更适合 seq2seq 映射
适用任务:
- 翻译
- 摘要
- 改写
- 文本到文本转换
3. Decoder-only
代表:
- GPT
- LLaMA
- Qwen
- DeepSeek
- Mistral
特点:
- 只有 Decoder 的自回归部分
- 不再单独有 Encoder
- 不再有 cross-attention
- 使用 causal mask 逐 token 生成
适用任务:
- 通用文本生成
- 对话
- 写作
- 代码补全
- 通用大模型预训练
二十、为什么今天的大语言模型几乎都偏 Decoder-only
这是当前大模型时代最重要的结构取舍之一。
原因主要有三点。
1. 预训练目标最统一
Decoder-only 的核心目标是:
也就是 Next-Token Prediction。
这让海量文本都能直接用于预训练,不需要特地构造输入输出配对。
2. 生成能力天然强
大语言模型最重要的任务之一就是生成。
而 Decoder-only 结构天生就是为自回归生成设计的。
3. 推理路径更统一
现代推理系统里的很多核心技术:
- Prefill
- Decode
- KV Cache
- speculative decoding
- paged attention
本质上都围绕 Decoder-only Transformer 展开。
所以今天主流大模型几乎都偏向:
Decoder-only Transformer 的现代化变体。
二十一、GPT / LLaMA / Qwen 到底还是不是 Transformer
答案是:
当然是。
更准确地说:
- 它们不是“脱离 Transformer 的新东西”
- 而是“Transformer 的 Decoder-only 大模型版本”
它们仍然保留了 Transformer 的核心骨架:
- token embedding
- 位置处理
- Self-Attention
- multi-head 或其变体
- FFN / MLP
- 残差
- LayerNorm 或 RMSNorm
- 多层 Transformer Block 堆叠
- 最终预测下一个 token
只是它们通常在工程上做了很多改造,例如:
- 改用 RoPE
- 改用 RMSNorm
- 改用 SwiGLU
- 引入 MQA / GQA
- 引入 MoE
- 做长上下文和推理友好性优化
所以最准确的说法应该是:
现代大语言模型不是“不是 Transformer”,而是“Transformer 在大模型时代的演化版本”。
二十二、本篇真正要记住的两条主线
第一条:一层 Transformer Block 是怎么拼起来的
- attention 负责跨位置交互
- FFN 负责逐位置加工
- 残差负责稳住信息与梯度通路
- LayerNorm 负责稳住数值分布
- 现代常见 block 写法是:
第二条:Transformer 家族的结构分化
- Encoder-only 更适合理解
- Encoder-Decoder 更适合 seq2seq 转换
- Decoder-only 更适合通用生成
- 今天的大语言模型几乎都偏 Decoder-only
二十三、用一句话压缩本篇
一层 Transformer Block 的本质,是在残差连接和 LayerNorm 的支撑下,把 Attention 的跨位置交互与 FFN 的逐位置非线性加工稳定地组合起来;原始 Transformer 再把这种 Block 分别堆叠成 Encoder 和 Decoder,最终演化出 Encoder-only、Encoder-Decoder 与今天主流的 Decoder-only 大语言模型。
下一篇预告
下一篇主题是:
Transformer 在训练和推理时如何工作:从模型执行到推理系统的桥接
会重点讲清楚:
- 训练时为什么可以并行
- 推理时为什么必须逐 token 生成
- 什么叫 Teacher Forcing
- 什么叫 Prefill 和 Decode
- 为什么 KV Cache 是推理核心
- 为什么说现代推理系统的大部分问题,都能追溯到 Decoder-only Transformer 的执行方式
