AdaLN 将条件向量动态生成 LayerNorm 的缩放和平移参数,是 DiT、文生图/文生视频大模型的核心组件。
核心原理
标准 LayerNorm 固定参数无法适配动态条件信号,AdaLN 将 和 替换为条件向量动态生成的函数:
- :输入特征
- :条件向量
- :动态生成的缩放和平移参数
从 LN 到 AdaLN
| 归一化 | 特点 |
|---|---|
| BatchNorm | 对批次大小敏感,不适配 Transformer |
| LayerNorm | 固定 ,成为 Transformer 标准 |
| AdaLN | 动态 ,适配条件生成 |
AdaLN-Zero
DiT 论文提出的工业级变体,核心设计:
- 生成 6 个动态参数:(注意力分支)和 (FFN 分支)
- 零初始化,实现恒等映射
计算流程:
零初始化让初始阶段 Transformer Block 输出等于输入,解决深层模型训练不稳定问题。
PyTorch 实现
class AdaLN(nn.Module):
def __init__(self, feature_dim, condition_dim, eps=1e-5):
super().__init__()
self.eps = eps
self.gamma_mlp = nn.Sequential(
nn.Linear(condition_dim, feature_dim), nn.SiLU())
self.beta_mlp = nn.Sequential(
nn.Linear(condition_dim, feature_dim), nn.SiLU())
nn.init.ones_(self.gamma_mlp[0].bias)
nn.init.zeros_(self.beta_mlp[0].bias)
def forward(self, x, condition):
mean = x.mean(dim=-1, keepdim=True)
var = x.var(dim=-1, keepdim=True, unbiased=False)
x_norm = (x - mean) / torch.sqrt(var + self.eps)
gamma = self.gamma_mlp(condition).unsqueeze(1)
beta = self.beta_mlp(condition).unsqueeze(1)
return gamma * x_norm + beta适用场景
| 场景 | 条件类型 |
|---|---|
| 文生图/文生视频 | 时间步、文本嵌入 |
| 风格迁移 | 风格特征向量 |
| 多模态大模型 | 模态类型、模态特征 |
工程实践
- 条件向量先经 LayerNorm 归一化
- 条件映射网络 1-2 层即可,无需过深
- 多条件融合:先融合后映射,避免参数爆炸
- FP16 训练时 调整为