扩散模型为什么要先加噪声,再一点点去噪

举报
yd_248795310 发表于 2026/10/23 21:55:03 2026/10/23
【摘要】 扩散模型为什么要先加噪声,再一点点去噪第一次看扩散模型的原理,很容易觉得它在绕远路:明明想生成一张清晰图片,为什么训练时要把好好的图片弄成噪声,再让模型学着恢复?如果只是修复图片,这样做还算直观。但文生图时,用户只输入了一句话,根本没有原图可以恢复。那模型到底在“去”什么噪声,又是从哪里变出画面的?理解这件事,得先分清两个过程:训练时给真实图片加噪,是为了构造学习任务;生成时则直接从随机噪声...

扩散模型为什么要先加噪声,再一点点去噪

第一次看扩散模型的原理,很容易觉得它在绕远路:明明想生成一张清晰图片,为什么训练时要把好好的图片弄成噪声,再让模型学着恢复?

如果只是修复图片,这样做还算直观。但文生图时,用户只输入了一句话,根本没有原图可以恢复。那模型到底在“去”什么噪声,又是从哪里变出画面的?

理解这件事,得先分清两个过程:训练时给真实图片加噪,是为了构造学习任务;生成时则直接从随机噪声出发,并不需要先找一张图片把它弄坏。

从一片噪声直接画出图片,跨度太大

假设要让模型生成一只猫。

我们知道猫大致是什么样,但“猫的图片”其实包含大量可能性:正脸还是侧脸,趴着还是站着,长毛还是短毛,背景是沙发还是草地。模型要生成的,也不只是一个猫的轮廓,而是包含形状、纹理、光照和空间关系的一整张图。

直接从随机数跳到这样一张图片,相当于一次性决定所有细节。这个任务可以做,其他生成方法也有自己的办法,但扩散模型采用了另一种思路:把生成拆成一系列逐步修正的过程。

问题是,怎么给这些中间过程准备训练数据?

我们有真实的猫照片,却没有现成的“从随机噪声逐渐变成猫”的每一步。反过来倒很容易:从照片出发,不断加入随机噪声,就能得到一系列由清晰到模糊、再到几乎看不出内容的状态。

加噪的作用,就是构造这些难度不同、过程可控的训练样本。

加噪不是随便把图片弄脏

在经典扩散模型中,常见做法是往图像中加入高斯噪声。可以把它理解成:给每个像素叠加一个随机扰动,同时逐渐减弱原图的信息。

常见表达式是:

\[ 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\) 就是模型预测的噪声。我们自己生成了噪声,因此知道训练目标是什么,不需要人手工标注每一步该怎么去噪。

不过,模型并没有办法在任何情况下都准确猜出那一次随机加入的噪声。当噪声很强时,原图信息已经丢失,可能有很多张原图都与当前状态相容。模型只能从大量训练样本中学到统计规律,给出有助于反向生成的估计。

不同噪声等级下,这项任务的难度也不同。

噪声较少时,物体轮廓还在,模型有很多现成线索可以利用。噪声很强时,局部像素几乎没有参考价值,模型就更需要依靠训练中学到的图像规律。

因此,它逐渐学到的内容会超出“去掉几个噪点”:什么样的结构像猫,毛发如何分布,物体边缘与背景是什么关系,这些都可能帮助它完成去噪任务。

实际模型也不一定直接预测噪声,还可以预测干净样本或其他经过变换的目标。预测形式会变,但核心仍然是学习不同噪声状态下的修正方向。

既然能预测噪声,为什么不一次减完?

这是最容易产生误解的地方。

在高噪声状态下,模型并不知道某个确定的“正确原图”。一团随机噪声可能逐渐生成猫,也可能生成狗;即便限定为猫,也有无数种姿态和背景。

如果只做一次预测,就要求模型在信息最少、歧义最大的时候,把整张图的结构和细节全部决定好。

还可以从均方误差训练目标理解这个问题:面对多种合理答案,模型的一次估计可能倾向于它们的平均结果。几种不同位置的轮廓平均在一起,就可能变成模糊的形状。

逐步生成允许模型不断更新判断。

当前这一步只推进一段,得到一个稍微更有结构的状态;下一步再根据新的状态重新预测。画面中已经形成的结构,会成为后续生成的条件。整个过程由采样算法控制,有些算法还会在中间步骤引入适量随机性。

所以,采样并不是简单重复执行:

图片 = 图片 - 模型预测的噪声

具体更新还涉及当前与下一步的噪声水平,以及采样器采用的计算方法。模型提供估计,采样器据此决定下一步怎么走。

也不能把“扩散模型必须执行上千步”当成固定规则。通过更合适的采样方法或蒸馏训练,步数可以大幅减少;一些经过专门训练的模型甚至可以单步或少步生成。逐步去噪是一种有效的建模方式,步数并不是越多越好。

文生图时,文字在哪里起作用?

如果只从随机噪声出发,模型可以生成图片,却未必生成用户想要的内容。

文生图会把提示词编码成模型能够使用的条件信息。去噪模型的输入因而不仅有当前的带噪状态、时间步,还有文本条件:

当前带噪状态 + 噪声等级 + 文本条件
                  ↓
              预测修正方向

例如输入“一只趴在窗台上的橘猫”,文本条件会影响去噪过程,让生成朝着符合这段描述的方向发展。

文字不是等图片生成之后再贴上去的标签,而是在生成过程中持续参与判断。但它也无法保证每个要求都被准确执行:复杂数量、空间关系和细节约束,仍然可能出现偏差。

同一句提示词能生成不同图片,也就不难理解了。初始随机噪声不同,生成起点就不同;采样过程中的随机性也可能带来变化。随机种子通常用于控制这些随机数,但要复现结果,还需要保持模型、采样设置和相关运行条件一致。

生成过程并没有一张藏起来的原图

训练时确实有原图,生成时通常没有。

模型从大量图片的加噪与去噪任务中学习规律,随后利用这些规律,把新的随机噪声逐渐变成图像。这个过程不要求每份噪声都对应训练集里的一张照片,也不是从噪声里找回某张事先藏好的图片。当然,模型仍可能记住个别训练样本,这是另一个需要区分的问题。

另外,很多图像生成系统并不直接对像素进行扩散。它们先把图片压缩成潜在表示,在这个更小的空间里加噪、去噪,再用解码器还原成图片,以降低计算成本。

因此,看到生成过程从模糊逐渐变清晰,可以把它当作一个直观展示,却不必理解成模型真的在擦除画布上的雪花点。它实际处理的,可能是一组人眼无法直接阅读的潜在特征。

回头再看“为什么先加噪”,原因就具体了:我们容易得到真实图片,也容易把它逐渐变成噪声。这个可控过程提供了大量训练任务,而终点又是一个容易随机采样的分布。模型学会反向修正后,就能从这个简单的起点出发,一步步生成有结构的画面。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。