
用程序员最熟的「版本管理 代码风格规范」来类比不用公式也能彻底搞懂。一、什么是残差一句话定义残差 期望输出 - 原始输入 H(x) - x在残差连接中网络不是直接学习完整的输出而是学习输出相对于输入的增量——也就是残差。大白话类比git diff你写了一段代码输入 x想把它改得更好期望输出 H(x)。残差 期望输出 - 原始代码 H(x) - x这就好比你在 Git 里做了一次修改git diff显示的就是你改了多少行、加了什么新内容而不是把整个文件重新打印一遍。网络只需要学会“这段代码需要改多少”而不是从零生成整段代码。为什么叫“残”差因为它是处理完之后剩下的增量——原始信息保留只学习“新增的那部分”。二、梯度消失是什么意思一句话定义神经网络层数一多最前面的层“学不到东西”了——梯度更新信号越传越弱最后几乎消失。大白话类比没有版本管理的代码仓库想象一个项目没有 Git 历史所有人都在同一个文件上直接修改第一个人改了几行第二个人又改了几行……第100个人打开文件时已经看不出最初的样子了也不知道每一步改了什么梯度消失就是这个道理反向传播时梯度纠错信号从最后一层往第一层传每经过一层梯度都要乘以激活函数的导数通常小于1和权重矩阵的缩放因子层数一多乘到第10层、第20层梯度就变成 0.0000001 了最前面的层几乎收不到更新信号学不动了对Transformer的影响Transformer 动不动就几十上百层如果没有残差连接前面的层根本学不到东西训练不起来。三、为什么要做残差连接核心目的解决梯度消失让深层网络能训练起来大白话类比Git 版本管理没有残差的时候就像没有做版本管理每次在原副本上直接修改原始代码 → 第1次修改 → 第2次修改 → ... → 第100次修改 → 最终文件每一次修改都可能覆盖、丢失信息到最后面目全非无法回溯。有了残差连接就像每完成一次需求提交一次 commit保留增量修改记录原始代码 → commit1 → commit2 → ... → commit100 ↑ ↑ ↑ 原始增量1 原始增量2 原始增量100不管你怎么改原始版本始终可回溯每次只记录“改了什么”。三大好处梯度传得动反向传播时梯度可以通过捷径恒等映射的导数为1直接传回去不会乘来乘去变没了学习更轻松不用学完整的输出只学“在输入基础上改多少”学残差比学完整映射简单多了信息不丢失原始信息一路保留到底不会越处理越丢更形象的比喻没有残差像在同一个 Word 文档上反复修改越改越乱想找回最初的版本也找不到了有残差每次修改都另存为一个新文件保留原始文件并在新文件上标注“相对于原文件的改动”。任何时候都能回溯到最初版本也能清楚看到每一步改了哪里四、怎么做残差连接公式就一行输出 输入 神经网络层(输入) y x F(x)伪代码defresidual_block(x,layer):# 1. 正常经过一层神经网络outputlayer(x)# 2. 把原始输入直接加回去残差捷径returnxoutput# 核心就这一步Transformer里的实际样子每一个注意力层、每一个前馈层外面都包了一层残差连接输入 x ↓ ┌─────────────┐ │ 多头注意力 │ ← F(x) └─────────────┘ ↓ ← 残差连接直接加原始 x ↓ 层归一化 ↓ ┌─────────────┐ │ 前馈网络 │ ← F(x) └─────────────┘ ↓ ← 又一个残差连接 ↓ 层归一化 ↓ 输出注意点维度必须一样才能加。如果维度不一样就加一个线性投影把 x 转成相同维度再加。五、什么是层归一化LayerNorm一句话定义把每一层输出的特征按每个样本自身拉到一个稳定的范围内让数值稳定、训练更快。大白话类比统一代码风格规范不同程序员写的代码风格各异张三喜欢 2 空格缩进李四喜欢 Tab 缩进王五喜欢大括号换行直接把这些代码拼在一起后续维护的人会疯掉。层归一化就像一个代码格式化工具如 Prettier算出当前代码的平均缩进、命名风格均值 mean算出风格的离散程度标准差 std把所有代码统一成标准的 2 空格、驼峰命名归一化到均值0、方差1再允许每个团队保留一点点自己的偏好可学习的缩放和平移参数为什么需要它数值稳定不会某一层输出特别大、某一层特别小代码风格统一训练更快梯度更稳定不容易梯度爆炸/消失后续程序员不用适应各种奇葩风格收敛更好模型更容易找到最优解团队协作更顺畅六、Post-LN 和 Pre-LN 分别是什么有什么差异这是 Transformer 里最容易搞混的细节其实就是层归一化放的位置不一样。1. Post-LN后归一化原始Transformer用的先做残差相加再做归一化x → 注意力层 → → LayerNorm → 输出 └── x ──┘ ↑ 残差连接顺序F(x) → 加x → 归一化2. Pre-LN前归一化现在主流都用这个先做归一化再进层最后残差相加x → LayerNorm → 注意力层 → → 输出 └── x ──┘ ↑ 残差连接顺序归一化 → F(x) → 加x3. 核心差异对比表维度Post-LN原始版Pre-LN主流版归一化位置残差相加之后进层之前训练难度难深层容易不稳定易深层也很稳梯度流梯度可能爆炸/消失梯度更平滑能不能直接堆深层不行20层以上就难训可以100层也能训性能上限在浅层或精心调参时可能略优在深层和大规模训练中更可靠最终效果基本持平现在谁用很少用了GPT、BERT、几乎所有新模型大白话总结Post-LN像先写完代码再格式化——如果代码本来就乱格式化后可能还是乱而且深层时容易崩Pre-LN像先定好代码规范再写代码——每写一段都先格式化保证风格统一怎么写都不乱七、残差连接 层归一化在 Transformer 中起到什么作用这俩是 Transformer 的「稳定器双雄」缺一不可。1. 残差连接解决“能不能训”的问题让梯度能传回去恒等映射导数为1深层网络学得动保留原始信息不会越处理越丢降低学习难度只学增量2. 层归一化解决“稳不稳”的问题数值范围统一不会忽大忽小梯度更稳定不容易爆炸/消失训练速度更快收敛更好3. 加在一起112残差负责梯度能传回去LayerNorm负责数值不跑偏两者配合Transformer 才能堆到几十上百层还能稳定训练。类比残差连接 Git 版本管理每次 commit 都知道原版本和增量保证历史可回溯、梯度可传导层归一化 ESLint Prettier统一代码风格保证后续协作不出乱子八、有替代方案吗有但各有优劣目前残差LayerNorm 还是绝对主流。1. 残差连接的替代方案方案原理优缺点DenseNet密集连接每一层都和前面所有层相连信息更全但参数多、计算量大Highway Network加门控控制多少信息走捷径更灵活但多了参数训练更复杂ReZero残差前乘一个可学习的权重初始为0训练更稳初始化更友好2. 层归一化的替代方案方案原理优缺点RMSNorm只算均方根不算均值更简单更快效果与 LayerNorm 相当或略优计算速度更快新模型常用BatchNorm按batch维度归一化NLP里不好用因为序列长度不一样GroupNorm按通道分组归一化视觉里常用NLP用得少3. 最新进展RMSNorm正在逐步替代 LayerNorm更简单更快效果相当LLaMA、Qwen 都在用并行残差Parallel Transformer注意力和前馈层并行计算后相加可提升训练速度但效果可能与串行有差异尚未成为主流无归一化一些新研究尝试去掉归一化靠初始化和特殊结构保证稳定但还没成主流九、一句话总结残差连接是 Git 版本管理保证每一次 commit 都知道原版本和增量让梯度传得回去、信息不丢失层归一化是 ESLint Prettier统一代码风格规范让每一层输出都在合理范围。两者配合Transformer 才能又深又稳地训起来。