2.2 逆扩散过程与去噪网络


2.2 逆扩散过程与去噪网络

逆扩散从纯噪声出发,每一步预测该去除多少噪声并复原上一步状态。由于真实逆转分布无法解析得到,我们用 U-Net 这样的神经网络去近似预测噪声。本节拆开 U-Net 的降采样-瓶颈-上采样骨架,并说明时间步编码为何关键。

上一节的"破坏"造好了一张看板:x_t 是 x0 被噪声按调度涂过 t 次后的状态。现在轮到你当那个"冲洗画室的人"——你看到的是一团糊,手上没有原图,只能靠一盆清水(神经网络)一步步把糊擦回能认出的轮廓。逆扩散要回答的其实就一个问题:给定当前这团糊和"它糊到什么程度"这个提示,这一盆水下去应该冲掉什么?

这个问题刁钻的地方在于,它的真解是一团我们将永远算不清楚的分布。前向过程是照本宣科,公式一清二楚;逆向过程却是从后往前反推,真实逆转分布没有闭式解,只能请神经网络来"尽量猜"。于是整个去噪工作的核心,被换成了另一个等价问题:让网络预测"这一步往里加的噪声到底是什么"。一旦网络能预测噪声,我们就能用"当前状态减去预测噪声分量"来清洗一步,逻辑闭环。

U-Net 为什么适合当这盆清水

要预测"这一步加了什么噪声",模型得读图。而且不只是读图,它还得一边保持全局语义(这是个人还是只猫),一边保留局部细节(这件毛衣的纹理)。在各类架构里,U-Net 之所以是扩散标配,在于它的 U 形结构天然同时照顾两头:左边收缩路径一层层降采样,让感受野越来越大,迫出全局结构;右边扩张路径一层层上采,把细节位置还原到原分辨率;中间一条条跳跃连接把左边的浅层细节直接递给右边的深层,避免细节在上采过程中被冲散。去掉跳跃连接,U-Net 会在复原时把细毛衣纹路磨成一片糊——这正是它存在的意义。

结构示意就可以画成一条经典的 U :

时间步信息:给模型一张"糊到什么程度"的进度条

网络不光要读图,还要知道此刻处于整条去噪链的哪一步。同样一团轮廓,生在 t 小(还很接近原图)还是 t 大(已经接近纯噪)时,正确的擦法完全不同:靠前要精修细节,靠后要果断铺底。所以模型会把每个时间步 t 编码成一个向量,作为额外条件注入网络内部。做法很简单——位置编码把 t 变成高维向量,再与噪声图像的特征相加或拼接。没有这步,模型对着"糊的程度"毫无概念,去噪会变成千篇一律的一顿乱冲。

给一段极小、但能表达"预测噪声"这个核心训练姿势的伪代码,帮助你把"预测噪声"四个字落到实处:

import torch def denoise_one_step(model, x_t, t, scheduler): # model 输入:当前带噪图 + 时间步编码;输出:这一步的预测噪声 eps_pred = model(x_t, t) # 清洗:从 x_t 去掉预测噪声分量,套用调度给出的步长 x_prev = scheduler.step(x_t, t, eps_pred) return x_prev, eps_pred def sample(model, scheduler, total_steps=1000): x = torch.randn_like(model.blank()) # 从纯噪声起步 for t in reversed(range(1, total_steps)): x, _ = denoise_one_step(model, x, t, scheduler) return x

这段代码把两件抽象事落到动作:model 去当"预测噪声"的嘴巴,scheduler.step 负责把"预测成了"翻成"擦一下"。你会在第四章的实操里,把这套 skeleton 换成各种真实采样器。

为什么网络只学噪声而不学整图

这里值得停下来想一个反直觉问题:同样是复原,为什么不干脆让网络直接预测"干净的原图 x0",而要让中间层输出"噪声映射"?站在训练角度看,噪声域更从容:原图域里像素落差巨大,某一处的失误会立刻带来明亮畸变,误差在这里被放大;噪声域里目标是一团相对平滑的高斯场,用均方误差训练时梯度更平稳,网络不至于被单点异常牵着走。站在采样角度看,预测噪声还能和调度器的步长解耦——网络只负责告诉方向,走多猛交给 scheduler,这让每一步都可以独立地加回一点探索噪声,从而在清晰与多样性之间取得平衡。这两点叠加,让"预测噪声"成了扩散能否稳定训练的生死手。

采样:把擦的过程重复到位

生成一幅图,就是从 x_T(纯噪声)出发,按 t 从大到小一步步调用上述"预测噪声 + 擦一步",直到回到 x0。每一步其实都还伴有一次小规模重采样噪声(系数由调度给定),这在稳定性和多样性之间起着微妙作用——保守一点就少加点噪声,激进一点细节更活。这条路线的步数上限(动辄上千步)也直接引出了下一节讨论为什么需要加速采样器。

除了"擦",U-Net 里还装着注意力

你可能已经注意到 U-Net 靠降采样上采样干了很多活,但真正让它对"条件"和"长程关系"敏感的在另一个模块——注意力。纯卷积的感受野有限,远处像素要互相影响的成本很高;加上注意力层后,某一处在擦除时可以"看看"全图远方该怎么配合,这让全局的姿势与结构更协调。这一点现在只是埋个伏笔:第六章谈条件注入、谈 ControlNet,落脚点几乎都在这一小块注意力上。现在先记下"U-Net = 卷积骨架 + 注意力",后面很多话都能挂到这根上了。

⚠️ 常见坑:把"预测噪声"当成"直接预测下一张干净图"。细看训练代码会发现模型输出的是噪声映射,而不是弯路一步到位;这既让损失在噪声域更平缓稳定,也让每步更新更细腻。
💡 关键直觉:U-Net 的跳跃连接、时间步编码、预测噪声三件套,本质都在配合"一边保留结构、一边知道擦多猛"这两件事。

本节要点回顾

  • 逆向无法解析:真实逆转分布无闭式解,改用网络近似预测噪声。
  • U-Net 骨架:降采样抓全局、上采样还原细节、跳跃连接保纹理。
  • 时间步编码:把 t 编码注入网络,使其知道该擦多猛。
  • 采样循环:纯噪声起步,从大到小迭代,逐步去噪重建 x0。
  • 预测噪声的优势:噪声域损失更稳,更新更细腻,是后续加速的前提。

下一节我们把"损失到底在算啥"落到实处:从差异界的证据下界出发,看它怎么被化简成训练常用的那行预测噪声误差。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U