Layer Normalization 篇
来自:AiGC面试宝典
整理:宁静致远
📝通俗解释:本文档系统整理了Transformer模型中常用的几种归一化技术,是面试高频考点,建议重点掌握各方法的计算公式、优缺点及实际应用场景。
一、Layer Norm 篇
1.1 Layer Norm 的计算公式
Layer Norm(层归一化)会对同一层的所有神经元进行归一化,其计算公式如下:
第一步:计算均值 $$ \mu = E(X) = \frac{1}{H} \sum_{i=1}^{H} x_i $$
第二步:计算方差 $$ \sigma^2 = Var(x) = \frac{1}{H} \sum_{i=1}^{H} (x_i - \mu)^2 $$
第三步:归一化并线性变换 $$ y = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \beta $$
其中:
- $\gamma$(gamma):可训练的缩放参数
- $\beta$(beta):可训练的偏移参数
- $\epsilon$:防止除零的小常数(如 1e-6)
📝通俗解释:Layer Norm 就像是把一个班级所有学生的成绩进行标准化处理。先算出平均分(均值),再算出成绩的波动程度(方差),然后把每个学生的成绩转换成"距离平均分多少个标准差"的格式。最后还可以用gamma和beta来调整这个标准化后的分布形状,让模型学习到最适合的特征表示。
二、RMS Norm 篇(均方根 Norm)
2.1 RMS Norm 的计算公式
RMS Norm(Root Mean Square Normalization)是一种简化的归一化方法:
$$ RMS(x) = \sqrt{\frac{1}{H} \sum_{i=1}^{H} x_i^2} $$
$$ y = \frac{x}{RMS(x)} \cdot \gamma $$
📝通俗解释:RMS Norm 相比 Layer Norm 更加"偷懒"——它只关心数据的"能量"(均方根),不关心数据的方向(均值)。就像评价一个篮球队,只看队员的平均身高(能量),而不关心是高还是矮(方向)。这样计算更快,因为少算了一个均值。
2.2 RMS Norm 相比于 Layer Norm 有什么特点?
| 特性 | Layer Norm | RMS Norm |
|---|---|---|
| 计算内容 | 均值 + 方差 | 仅均方根 |
| 计算复杂度 | 较高 | 较低 |
| 效果 | 基准 | 基本相当,略有提升 |
总结:
- RMS Norm 简化了 Layer Norm,去除了计算均值进行平移的部分
- 优点:计算速度更快
- 效果:与 Layer Norm 基本相当,部分场景略有提升
📝通俗解释:可以把 RMS Norm 理解成 Layer Norm 的"精简版"。就像做菜时,Layer Norm 要计算平均值再调整(比较精细),RMS Norm 只看整体"火候"够不够(比较粗略)。虽然步骤少了,但做出来的"菜"(模型效果)差不多,甚至有时候更好吃,而且做饭时间更短。
三、Deep Norm 篇
3.1 Deep Norm 的思路?
Deep Norm 是微软提出的改进方法,其核心思想包括:
- 残差连接 upscale:在执行 Layer Norm 之前,up-scale 残差连接的输出($\alpha > 1$)
- 参数初始化 down-scale:在初始化阶段 down-scale 模型参数($\beta < 1$)
📝通俗解释:Deep Norm 就像给模型"减压"。它通过放大残差路径(让信息更容易传递)和缩小初始化参数(让训练起步更平稳),来防止深层网络训练时"心态爆炸"(梯度爆炸),让训练过程更稳定。
3.2 Deep Norm 代码实现
def deepnorm(x, f, alpha):
"""
Deep Norm 前向传播
alpha: 残差连接放大系数 (通常 > 1)
"""
return LayerNorm(x * alpha + f(x))
def deepnorm_init(w, beta):
"""
Deep Norm 初始化
beta: 参数缩放系数 (通常 < 1)
"""
if w.name in ['ffn', 'v_proj', 'out_proj']:
# FFN和输出投影使用较大的初始化增益
nn.init.xavier_normal_(w, gain=beta)
elif w.name in ['q_proj', 'k_proj']:
# Q、K投影使用标准初始化
nn.init.xavier_normal_(w, gain=1)3.3 Deep Norm 有什么优点?
- 稳定训练:缓解深层 Transformer 的梯度爆炸问题
- 常数更新:把模型更新限制在常数范围内,使得训练过程更稳定
- 支持更深模型:可以训练更深的网络结构
📝通俗解释:普通的 Transformer 深层网络就像一个传递信息的"传声筒游戏",层数多了之后信息会越来越走样(梯度爆炸)。Deep Norm 相当于给每层加了一个"放大器"和"稳定器",让信息能更完整地传递下去,这样就能训练上百层的模型而不"炸"掉。
四、Layer Normalization 位置篇
4.1 LN 在 LLMs 中的不同位置有什么区别?
在 Transformer 中,Layer Normalization 的位置有三种常见形式:
1. Post LN(后置 Layer Norm)
- 位置:Layer Norm 在残差连接之后
- 结构:
x -> Attention -> Add -> LayerNorm -> FFN -> Add -> LayerNorm - 缺点:深层梯度范式逐渐增大,容易出现训练不稳定的问题
📝通俗解释:Post LN 就像在每节课结束后才检查学生掌握情况(归一化),层数多了之后,后面几节课的压力会越来越大,容易"崩不住"。
2. Pre LN(前置 Layer Norm)
- 位置:Layer Norm 在残差连接内部(放在注意力或FFN之前)
- 结构:
x -> LayerNorm -> Attention -> Add -> LayerNorm -> FFN -> Add - 优点:深层梯度范式近似相等,训练更稳定
- 缺点:模型效果略差于 Post LN
📝通俗解释:Pre LN 就像在每节课开始前先复习重点(归一化),这样每节课的压力都比较均衡,训练更稳定,但可能没有课后检查那么"针对性强"。
3. Sandwich LN(三明治 Layer Norm)
- 位置:在 Pre LN 的基础上,额外在残差连接内部再插入一个 Layer Norm
- 优点:Cogview 论文提出,用于避免值爆炸的问题
- 缺点:训练不稳定,可能导致训练崩溃
📝通俗解释:Sandwich LN 就像"课前复习+课后测验"双重检查,虽然想法是更严格把控,但有时候可能过于严格导致学生压力过大(训练崩溃)。
三种位置对比图示:
Post-LN: x -> [Multi-Head Attention + Add] -> LN -> [FFN + Add] -> LN
Pre-LN: x -> LN -> [Multi-Head Attention + Add] -> LN -> [FFN + Add]
Sandwich-LN: x -> LN -> [Multi-Head Attention + Add] -> LN -> [FFN + Add] -> LN📝通俗解释:这三种位置就像安排"复习环节"的时机——Post LN 是课后复习,Pre LN 是课前复习,Sandwich LN 是课前课后都复习。课前复习(Pre LN)让每节课压力均匀,最稳定;课后复习(Post LN)效果更好但后面压力大;三明治虽然严格但容易出问题。
五、Layer Normalization 对比篇
5.1 各主流 LLMs 使用的 Normalization 方法
| 模型 | Normalization 方法 | 位置 |
|---|---|---|
| GPT-3 | Pre Layer Norm | 前置 |
| LLaMA | Pre RMS Norm | 前置 |
| Baichuan | Pre RMS Norm | 前置 |
| ChatGLM-6B | Post Deep Norm | 后置 |
| ChatGLM2-6B | Post RMS Norm | 后置 |
| Bloom | Pre Layer Norm | 前置 |
| Falcon | Pre Layer Norm | 前置 |
补充说明:
- Bloom 在 embedding 层后添加 Layer Norm,有利于提升训练稳定性,但可能会带来一定的性能损失
📝通俗解释:主流大模型现在更偏爱"Pre + RMS Norm"的组合——前置归一化让训练更稳定,RMS Norm 计算更快。LLaMA、Baichuan 等新秀都采用这个方案。而 ChatGLM 系列早期用了 Deep Norm(后置),后来也转向了 RMS Norm。
面试要点总结
- 计算公式:LN 和 RMS Norm 的公式必须能手写
- 对比理解:RMS Norm 相比 LN 更快、更简单
- 位置影响:Pre LN 更稳定,Post LN 效果更好,Sandwich LN 容易崩
- 实际应用:主流趋势是 Pre + RMS Norm
整理自:知识星球 - AiGC面试宝典日期:2023年09月29日