Diffusion Model 中的 U-Net 理解
前文我们学习了一些传统 Diffusion Model 的模型,比如 DDPM,LDM,也学习了 U-Net 的细节,但是它们是如何应用 U-Net 的呢。之前学习 Diffusion 一直处在理论或者宏观的角度,接下来需要结合代码理解细节。
为了适配扩散任务,现代的 Diffusion Model 在原始 U-Net 上引入了时间步嵌入。
Diffusion U-Net 的伪代码骨架
值得注意的是,现代的 Diffusion 往往会使用正余弦编码映射作为时间步,这里用标量进行了简化。
上采样与下采样:
1 | |
ResNetBlock:
1 | |
完整的 U-Net 伪代码:
1 | |
注意区别:
原始 U-Net
- Encoder: ConvBlock → MaxPool
- Decoder: UpConv → Concat → ConvBlock
Diffusion U-Net
- Encoder: ResNetBlock(t) → Downsample
- Decoder: Concat → ResNetBlock(t) → Upsample
如何理解:
- 对于原始 U-Net,常用于语义分割,比如医学图像分割,非常关心像素级位置精度。所以先上采样把特征图放大,然后和高分辨率特征拼接,然后卷积。
- 对于 Diffusion U-Net,核心任务是预测噪声,所以现在小画布上判断整体结构和噪声趋势,再逐步放大。
如何加入时间步特征?
通常做法是把
- feature map: [B, C, H, W]
- time embedding: [B, D]
但 [B, D] 不能直接和 [B, C, H, W]
相加,所以会先经过线性层:
1 | |
然后广播加到特征图上:
1 | |
其实也就是平摊成 Token 后,每个 Token 加一个相同的 Embedding。
如何结合文本特征?
文本通常不是直接输入 U-Net,而是先经过文本编码器,比如 CLIP text encoder:
1 | |
然后 U-Net 在很多层里通过 cross-attention 融合文本信息。
具体的先把空间位置摊平成 token:
1 | |
这表示图像里每个空间位置都是一个 image token。
然后做 cross-attention:
1 | |
Diffusion Model 中的 U-Net 理解
https://d4wnnn.github.io/2026/03/14/Notion/Diffusion Model 中的 U-Net 理解/