扩散模型为什么用 U-Net?时间步 t 是怎么注入网络的?
简化版
扩散模型传统上常用 U-Net,因为去噪是输入输出空间对齐的密集预测,多尺度编码—解码能兼顾大范围结构与局部细节,Skip Connection 还能把对应尺度的特征直接送到解码端。时间步或噪声强度通常经正弦/Fourier 特征与 MLP 编码,再以相加或 scale-shift 方式注入多个残差块;具体网络不要求“每个块”都采用同一种注入。文本条件则可由 Cross-Attention 等机制提供。
详细版
为什么是 U-Net
- 输入输出同形:去噪要从
x_t预测同尺寸的噪声ε,是典型的「图到图」密集预测,U-Net 正为此设计。 - 多尺度感受野:下采样让深层看到全局结构(物体、布局),上采样逐步恢复分辨率。
- 跳跃连接:把编码器同尺度特征送给解码器,缩短高分辨率信息路径并利于融合局部与全局信息;它不等于无损复制原图高频,因为编码特征本身来自带噪输入且仍会被网络变换。
U-Net 里的关键模块
- 残差块(ResBlock):卷积 + 归一化 + 残差,主力特征提取;时间嵌入在这里注入。
- 自注意力块:在中低分辨率层加入,让空间位置间做全局交互(卷积只有局部感受野,注意力补全局)。
- 交叉注意力块:注入文本条件(文生图)。
- 下采样/上采样:改变分辨率。
时间步注入三步
1) t → 正弦位置编码 → 得到高维向量
2) → 小 MLP → 时间嵌入 t_emb
3) 在每个 ResBlock 内:把 t_emb 加到特征上(或生成 scale/shift 调制)
为什么每个块都要注入 t
不同噪声水平对应不同的条件分布和最优预测函数。把时间表示注入多个深度层级,可让网络按 SNR 调整特征处理;“高噪声管结构、低噪声修细节”是常见观察,不是所有模型和采样轨迹的硬分工。
完整版教学
一、先想清楚去噪网络的”任务形状”
扩散网络的输入是带噪图或 latent x_t,输出通常是同形状的 ε、v 或 x₀ 预测。这是输入输出空间对齐的密集预测任务,U-Net 是成熟而有效的选择之一;任务形状解释了它为何合适,但不推出它是唯一或必然最优架构。
二、U-Net 三大件各自解决什么
① 下采样编码器——获取全局语义 单层卷积作用于局部邻域,堆叠也能扩大感受野;逐级下采样能更高效地扩大有效感受野,并在较少空间 Token 上处理全局结构。它以损失部分空间分辨率为代价换取多尺度表示。
② 上采样解码器——恢复分辨率 预测的噪声必须和输入同尺寸,所以要把下采样压缩的特征一步步上采样回原分辨率。
③ 跳跃连接——挽救高频细节(U-Net 的精髓) 下采样会丢失空间细节,光靠低分辨率瓶颈恢复较困难。Skip Connection 把同尺度编码特征直接送到解码端,使梯度和高分辨率特征都有短路径;这些特征仍是网络从带噪输入提取的表示,并非把原始纹理原封不动抄过去。
记忆图景:U 的左半边「看懂整体」,右半边「重建细节」,中间横线(跳连)「把细节抄过去」。
三、为什么还要往 U-Net 里塞注意力
纯卷积 U-Net 只有局部感受野,难以建模「相距很远的两个区域要协调一致」(比如画面左右两只眼睛要对称、风格要统一)。于是在中低分辨率层插入自注意力,让所有空间位置两两交互,补上全局一致性。放在低分辨率是因为注意力是 O(N²) 复杂度,高分辨率算不起。文生图再加交叉注意力注入文本。这也解释了扩散模型后来能顺势演化到「纯 Transformer(DiT)」——注意力早就是 U-Net 里的重要成分了。
四、时间步嵌入:把”第几步”翻译成网络听得懂的信号
网络必须知道当前处于哪个噪声水平,否则无法给出正确的去噪量。t 是个整数(1…1000),直接喂没意义,要先编码:
第一步,正弦位置编码:和 Transformer 位置编码同理,用不同频率的 sin/cos 把标量 t 映射成一个高维向量。好处是连续、平滑、不同 t 可区分,且对相近的 t 给出相近的编码。
第二步,MLP 投影:过一两层带激活的全连接,得到时间嵌入 t_emb,维度对齐特征通道。
第三步,注入每个 ResBlock:常见两种方式——
- 相加:把
t_emb(广播到空间维)直接加到特征图上。 - 调制(FiLM/scale-shift):用
t_emb生成一组(γ, β),对归一化后的特征做γ·feature + β。这种自适应调制通常比单纯相加更强,SD/DiT 都在用。
为什么在多个层级注入:同一网络要覆盖从高到低的多种 SNR,浅层和深层特征都需要据此改变处理方式。常见 U-Net 会在许多 ResBlock 注入时间嵌入,但具体位置由架构决定;核心要求是条件能充分影响输出,而非机械规定每个块必须注入。
五、把一次前向串起来
输入: x_t (带噪潜图), t (时间步), c (文本)
1. t → 正弦编码 → MLP → t_emb
2. c → 文本编码器 → 文本嵌入
3. x_t 进入 U-Net:
编码器: [ResBlock(注入 t_emb) → (自注意力/交叉注意力) → 下采样] × N
中间块: ResBlock + 自注意力 + 交叉注意力
解码器: [上采样 → 拼接跳连特征 → ResBlock(注入 t_emb) → 注意力] × N
4. 输出: 预测噪声 ε_θ(x_t, t, c)
六、看一次多尺度特征怎样流动
若输入潜变量为 64×64×4,第一次下采样后可变成 32×32×C,继续降到 16×16、8×8;解码时逐级恢复分辨率,并通过 skip connection 拼接同尺度编码特征。低分辨率层更容易建模全局布局,高分辨率跳连保留边缘与纹理,所以 U-Net 同时兼顾结构和细节。
| 位置 | 空间尺寸示例 | 主要信息 |
|---|---|---|
| 编码浅层 | 64×64 | 局部纹理、边缘 |
| 中间层 | 8×8 | 全局语义与布局 |
| 解码深层 | 64×64 | 融合语义后恢复细节 |
时间步嵌入告诉网络当前噪声强度:高噪声阶段应先恢复粗结构,低噪声阶段再修细节。同一个带噪输入若配错时间步,网络会采用错误的去噪尺度;因此 timestep 的采样分布、嵌入注入位置和推理调度器必须成套验证。
七、常见误区与追问
- 误区:U-Net 输出的是去噪后的图。 输出的是噪声预测 ε(或 x₀/v),图像由采样公式反解。
- 误区:时间步只能在入口注入一次或必须注入每个块。 常见做法是在多个 ResBlock 重复注入,但具体覆盖范围是架构选择,验收看条件是否充分传递。
- 追问:跳跃连接为什么重要? 它缩短同尺度特征和梯度路径,帮助融合局部细节与瓶颈处的全局表示,但不是无损旁路。
- 追问:注意力为什么常放在低分辨率层? 全局注意力成本随空间 Token 数平方增长,低分辨率更经济;现代模型也会借助高效或局部注意力覆盖更高分辨率。
- 追问:一定要用 U-Net 吗? 不是。近年 DiT(Diffusion Transformer) 用纯 Transformer 替代 U-Net,扩展性更好,是 SD3、Sora 的方向;但 U-Net 仍是理解扩散网络结构的基础。
- 追问:时间步编码和 Transformer 位置编码是一回事吗? 都可能使用正弦/Fourier 特征,但输入语义、频率设计和后续注入方式不同,也都可以采用可学习变体。
八、加强记忆
U-Net 用“多尺度下采样—瓶颈—上采样”处理同形状去噪输出,Skip Connection 为同尺度局部特征提供短路径,注意力则补充远距离交互和文本读取。时间条件记“噪声标量编码—MLP—多层相加或调制”,因为一个共享网络必须针对不同 SNR 实现不同函数。守住两个边界:Skip 不是无损复制高频,时间也不必机械注入每个块;DiT 证明 U-Net 是强基线而非唯一选择。