扩散模型为什么要先加噪声,再一点点去噪
扩散模型为什么要先加噪声,再一点点去噪
第一次看扩散模型的原理,很容易觉得它在绕远路:明明想生成一张清晰图片,为什么训练时要把好好的图片弄成噪声,再让模型学着恢复?
如果只是修复图片,这样做还算直观。但文生图时,用户只输入了一句话,根本没有原图可以恢复。那模型到底在“去”什么噪声,又是从哪里变出画面的?
理解这件事,得先分清两个过程:训练时给真实图片加噪,是为了构造学习任务;生成时则直接从随机噪声出发,并不需要先找一张图片把它弄坏。
从一片噪声直接画出图片,跨度太大
假设要让模型生成一只猫。
我们知道猫大致是什么样,但“猫的图片”其实包含大量可能性:正脸还是侧脸,趴着还是站着,长毛还是短毛,背景是沙发还是草地。模型要生成的,也不只是一个猫的轮廓,而是包含形状、纹理、光照和空间关系的一整张图。
直接从随机数跳到这样一张图片,相当于一次性决定所有细节。这个任务可以做,其他生成方法也有自己的办法,但扩散模型采用了另一种思路:把生成拆成一系列逐步修正的过程。
问题是,怎么给这些中间过程准备训练数据?
我们有真实的猫照片,却没有现成的“从随机噪声逐渐变成猫”的每一步。反过来倒很容易:从照片出发,不断加入随机噪声,就能得到一系列由清晰到模糊、再到几乎看不出内容的状态。
加噪的作用,就是构造这些难度不同、过程可控的训练样本。
加噪不是随便把图片弄脏
在经典扩散模型中,常见做法是往图像中加入高斯噪声。可以把它理解成:给每个像素叠加一个随机扰动,同时逐渐减弱原图的信息。
常见表达式是:
\[ x_t=\sqrt{\bar{\alpha}_t}\,x_0+ \sqrt{1-\bar{\alpha}_t}\,\epsilon \]
其中,\(x_0\) 是原图,\(\epsilon\) 是标准高斯噪声,\(x_t\) 是某个噪声等级下的图片。随着时间步 \(t\) 增大,原图占比逐渐下降,噪声占比逐渐上升。
这几个系数很重要。整个过程并不是只往图片上无限叠加噪点,而是在控制图像信号与噪声的比例。到最后,原图信息已经很弱,得到的数据分布可以接近标准高斯分布。
为什么希望终点是高斯噪声?因为它非常容易采样。
生成一张真实照片很难,生成一个由随机数组成的数组却很容易。如果模型学会了从这种简单分布逐步走向真实图像分布,生成就有了一个方便的起点。
还有个实现细节:训练时不一定真的连续执行几百次加噪。利用上面的公式,可以直接采样某个时间步,再一次算出对应的带噪图片。
模型学的,是不同噪声程度下该怎么修正
最常见的讲法是“模型学习去噪”,但这个说法有点宽泛。
在经典的噪声预测训练方式里,程序先取一张真实图片,随机选择一个时间步,再生成噪声,把两者混合。随后让模型根据带噪图片和时间步,预测加入的噪声。
训练目标可以写成:
\[ L=\mathbb{E}\left[ \left\|\epsilon-\epsilon_\theta(x_t,t)\right\|^2 \right] \]
这里的 \(\epsilon_\theta\) 就是模型预测的噪声。我们自己生成了噪声,因此知道训练目标是什么,不需要人手工标注每一步该怎么去噪。
不过,模型并没有办法在任何情况下都准确猜出那一次随机加入的噪声。当噪声很强时,原图信息已经丢失,可能有很多张原图都与当前状态相容。模型只能从大量训练样本中学到统计规律,给出有助于反向生成的估计。
不同噪声等级下,这项任务的难度也不同。
噪声较少时,物体轮廓还在,模型有很多现成线索可以利用。噪声很强时,局部像素几乎没有参考价值,模型就更需要依靠训练中学到的图像规律。
因此,它逐渐学到的内容会超出“去掉几个噪点”:什么样的结构像猫,毛发如何分布,物体边缘与背景是什么关系,这些都可能帮助它完成去噪任务。
实际模型也不一定直接预测噪声,还可以预测干净样本或其他经过变换的目标。预测形式会变,但核心仍然是学习不同噪声状态下的修正方向。
既然能预测噪声,为什么不一次减完?
这是最容易产生误解的地方。
在高噪声状态下,模型并不知道某个确定的“正确原图”。一团随机噪声可能逐渐生成猫,也可能生成狗;即便限定为猫,也有无数种姿态和背景。
如果只做一次预测,就要求模型在信息最少、歧义最大的时候,把整张图的结构和细节全部决定好。
还可以从均方误差训练目标理解这个问题:面对多种合理答案,模型的一次估计可能倾向于它们的平均结果。几种不同位置的轮廓平均在一起,就可能变成模糊的形状。
逐步生成允许模型不断更新判断。
当前这一步只推进一段,得到一个稍微更有结构的状态;下一步再根据新的状态重新预测。画面中已经形成的结构,会成为后续生成的条件。整个过程由采样算法控制,有些算法还会在中间步骤引入适量随机性。
所以,采样并不是简单重复执行:
图片 = 图片 - 模型预测的噪声
具体更新还涉及当前与下一步的噪声水平,以及采样器采用的计算方法。模型提供估计,采样器据此决定下一步怎么走。
也不能把“扩散模型必须执行上千步”当成固定规则。通过更合适的采样方法或蒸馏训练,步数可以大幅减少;一些经过专门训练的模型甚至可以单步或少步生成。逐步去噪是一种有效的建模方式,步数并不是越多越好。
文生图时,文字在哪里起作用?
如果只从随机噪声出发,模型可以生成图片,却未必生成用户想要的内容。
文生图会把提示词编码成模型能够使用的条件信息。去噪模型的输入因而不仅有当前的带噪状态、时间步,还有文本条件:
当前带噪状态 + 噪声等级 + 文本条件
↓
预测修正方向
例如输入“一只趴在窗台上的橘猫”,文本条件会影响去噪过程,让生成朝着符合这段描述的方向发展。
文字不是等图片生成之后再贴上去的标签,而是在生成过程中持续参与判断。但它也无法保证每个要求都被准确执行:复杂数量、空间关系和细节约束,仍然可能出现偏差。
同一句提示词能生成不同图片,也就不难理解了。初始随机噪声不同,生成起点就不同;采样过程中的随机性也可能带来变化。随机种子通常用于控制这些随机数,但要复现结果,还需要保持模型、采样设置和相关运行条件一致。
生成过程并没有一张藏起来的原图
训练时确实有原图,生成时通常没有。
模型从大量图片的加噪与去噪任务中学习规律,随后利用这些规律,把新的随机噪声逐渐变成图像。这个过程不要求每份噪声都对应训练集里的一张照片,也不是从噪声里找回某张事先藏好的图片。当然,模型仍可能记住个别训练样本,这是另一个需要区分的问题。
另外,很多图像生成系统并不直接对像素进行扩散。它们先把图片压缩成潜在表示,在这个更小的空间里加噪、去噪,再用解码器还原成图片,以降低计算成本。
因此,看到生成过程从模糊逐渐变清晰,可以把它当作一个直观展示,却不必理解成模型真的在擦除画布上的雪花点。它实际处理的,可能是一组人眼无法直接阅读的潜在特征。
回头再看“为什么先加噪”,原因就具体了:我们容易得到真实图片,也容易把它逐渐变成噪声。这个可控过程提供了大量训练任务,而终点又是一个容易随机采样的分布。模型学会反向修正后,就能从这个简单的起点出发,一步步生成有结构的画面。
- 点赞
- 收藏
- 关注作者
评论(0)