
1. 引言:一个贯穿现代深度学习的"隐藏技巧"1.1 一个共同的身影回顾本系列的文章,你会反复看到一个似曾相识的设计:ControlNet用"零卷积"让旁路分支从零开始生长;LoRA把矩阵BBB初始化为零,让增量从零开始;DiT用"adaLN-Zero"让每个 Transformer 块从恒等映射起步;ResNet的残差结构,本质上也是"恒等映射 + 增量"。它们看似分散在不同领域(可控生成、高效微调、图像生成骨干),却共享同一个深刻的原理:让网络的初始状态是一个"已知的、稳定的"起点(通常是恒等映射),新的能力从零逐步"长出来",而不是一开始就随机扰动。这就是零初始化(zero initialization)的哲学。它看似只是一个实现细节,却是许多现代模型能够稳定训练、平滑接入、不破坏预训练的关键。1.2 本文要回答的问题为什么"从零/恒等起步"能带来稳定训练?零卷积、adaLN、adaLN-Zero 各自的数学形式是什么?它们之间有什么统一的联系?如何在代码里正确地实现它们?2. 理论根基:残差连接与恒等映射2.1 残差学习的视角一切都要从ResNet(残差网络)说起。残差块的定义是:xl+1=xl+F(xl,Wl) x_{l+1} = x_l + \mathcal{F}(x_l, W_l)xl+1=xl+F(xl,Wl)其中F\mathcal{F}F是"残差函数"(要学习的增量),xlx_lxl是恒等映射(identity mapping)。ResNet 的核心洞见是:与其让网络直接学习目标映射H(x)H(x)H(x),不如学习它与恒等映射的差H(x)−xH(x) - xH(x)−x。当理想变换接近恒等时,残差只需学一个很小的量。2.2 残差块的两种极端初始化假设我们把残差函数F\mathcal{F}F的输出缩放系数记为γ\gammaγ:xl+1=xl+γ⋅F(xl) x_{l+1} = x_l + \gamma \cdot \mathcal{F}(x_l)xl+1=xl+γ⋅F(xl)这个γ\gammaγ的初始值,决定了网络"起步时的形态":γ\gammaγ初始化起步形态含义γ=0\gamma = 0γ=0xl+1=xlx_{l+1} = x_lxl+1=xl(恒等映射)网络从"什么都不做"开始γ=1\gamma = 1γ=1(随机F\mathcal{F}F)xl+1=xl+F(xl)x_{l+1} = x_l + \mathcal{F}(x_l)xl+1=xl+F(xl)网络从"随机扰动"开始零初始化的精髓,就是把γ\gammaγ设成 0,让网络先"学会什么都不做",再逐步"长"出需要的能力。这个看似微小的改动,带来的是训练的极大稳定。2.3 为什么"从恒等起步"有效?梯度直通:初始时xl+1=xlx_{l+1} = x_lxl+1=xl,梯度可以无衰减地穿过所有层,深网络的早期训练不再困难;不破坏已知解:若F\mathcal{F}F是给预训练模型"打补丁",零初始化保证初始时补丁不改变原模型输出,杜绝灾难性遗忘;平滑开启:增量参数从 0 开始以有限的学习率增长,避免了"一开始就大幅扰动"导致的震荡。3. 零卷积:ControlNet 的旁路开关3.1 定义零卷积(Zero Convolution)是最直接的零初始化形式:一个1×11\times11×1卷积层,其权重和偏置都初始化为 0:Z(x;{ W,b})=W∗x+b,W=0, b=0 \mathcal{Z}(x; \{W, b\}) = W \ast x + b, \qquad W = 0,\; b = 0Z(x;{W,b})=W∗x+b,W=0,b