1. 旧照片比白纸好画:约束条件如何改变问题难度
先问一个朴素的问题:给你一张严重褪色、满是划痕的旧照片,让你修复它;再给你一张白纸让你凭空画一幅同样内容的画,哪个更难?
直觉上可能是修复更难——你得猜原本的颜色,补断裂的纹理。但站在机器学习模型的角度,答案恰好相反:修复比创作容易得多。旧照片虽然破,但它提供了大量硬约束——构图、人物轮廓、局部明暗、色块分布全都摆在那儿,模型要做的不是"无中生有",而是在一个被限定得比较死的空间里填空。白纸作画就完全不同,任何位置、任何颜色、任何光影都是候选答案,可能性多到无穷无尽。
这个直觉正好对应标题里那句"为什么预测噪声比预测像素更稳定"的本质:两件事在数学上的地位根本不对等。一个是带约束的修复问题,目标分布集中、可解性强;另一个是几乎无约束的生成问题,目标分布高度多峰、充满歧义。把这件事想透,扩散模型的一大半原理就算真正吃透了。
1.1 "一对多"问题的陷阱:平均就是模糊
在数学上,一个预测任务可以抽象成:给定输入 X,预测目标 Y,训练一个模型 f(X) 让均方误差尽量小。当输入是加噪图像 x_t、目标是干净图像 x_0 时,同一个 x_t 其实可能由多张完全不同的干净图像加噪而来——这就是典型的"一对多"问题。
训练数据里每个 X 对应着多个合法 Y 时,最小二乘的最优解会收敛到条件均值 E[Y | X],也就是把所有可能的答案按概率加权取平均。平均的结果往往不是任何一张真实存在的照片,而是一张轮廓模糊、边缘发灰、脸部像重影的"混合体"。这不是模型笨,它只是诚实回答了一个本身就有歧义的问题——但视觉上一个平均值就是一团糊。
扩散模型能生成高清图像,靠的从来不是把"从噪声预测干净图"这个问题一步问完,而是把它拆成几百个小问题。拆分之后,每个小问题的歧义都只存在于一个很小的局部范围,平均值不再糊,模型才真正点到实处。
1.2 每个去噪步骤都是一次"局部修复"
再回到旧照片。修复旧照片时,几乎所有像素都有线索:旁边墙壁是灰色,那缺掉的那一块大概率也是灰色;人物左脸皮肤纹理还在,右脸的修复就要对称着来。这些线索构成锚点,把修复结果牢牢钉在正确的局部区域附近,不允许模型跑偏。
扩散模型的每步去噪本质上就是这种带锚点的小修复。当前图像 x_t 已经保留了大部分结构和内容线索,这一轮只需要回答一个更狭窄的问题:"从 x_{t-1} 到 x_t,刚刚添加的破坏是什么?"因为破坏幅度很小、线索很强,这一步的预测天然就是稳定的。
这解释了一个看起来反直觉的现象:与其让模型从纯噪声一步预测整张照片(等于白纸作画),不如让它一步步走,每步只做一次小修复。每一步问题的难度都停留在"修复旧照片"这个层级,而不是"从零创作"。预测噪声的稳定性,某种程度上就是把大问题拆小之后,每个小问题都自带锚点的必然结果。
2. 正向加噪的数学构造:毁掉一张图为什么要"毁得温柔"
理解了修复比创作容易,接下来看扩散模型具体怎么把一张干净照片逐步毁成噪声。这里有一组重要的数学细节,值得认真过一遍。
2.1 加噪公式的来龙去脉
扩散模型的正向过程定义得非常规整。设原始干净图像为 x_0,每一步加入少量高斯噪声,第 t 步的图像可以统一写成:
x_t = √(ᾱ_t) · x_0 + √(1 - ᾱ_t) · ε
其中 ε 是标准高斯噪声,每个像素独立服从 N(0, 1);ᾱ_t 是由噪声调度 β_t 累乘得到的衰减系数,它从接近 1 逐渐衰减到接近 0。
这个形式不是随手写的,有两个设计意图。第一,系数 √(ᾱ_t) 和 √(1 - ᾱ_t) 满足平方和等于 1,保证 x_t 的方差始终被控制在一个稳定范围——如果简单写成 x_t = x_{t-1} + ε,噪声会一路叠加导致像素值爆炸,图像很快就变成白花花一片,训练数值也会失控。第二,随着 t 增大,ᾱ_t 平滑地趋近于 0,图像信号分量 √(ᾱ_t)·x_0 逐渐被噪声分量 √(1 - ᾱ_t)·ε 接管,这个"接管"过程是连续、均匀、渐进的,模型在每个时间步面临的任务难度变化不会突兀。
这就是"毁得温柔"的含义:破坏不是一步到位的,而是沿着一条精心铺好的路径,让图像一点点滑入噪声深渊。在这条路径上,每一步的破坏量都是已知的、可控的,从而为后面的"学习预测破坏"提供了干净的训练信号。
2.2 破坏过程本身为什么成了训练信号
正向过程一旦固定,生成任务就被翻转过来:我们从纯噪声 x_T 出发,反向走回 x_0。关键在于,正向过程中的每一步加噪都可以看成一个已知的"破坏动作",而这个动作就是由噪声 ε 决定的。
模型要学的,不是直接画出干净照片,而是识别出"这一步到底加了什么噪声"。这个目标有一个非常讨巧的性质:无论图像内容是什么、无论处于哪个时间步,噪声 ε 的统计分布完全不变,永远都是零均值、单位方差、各像素独立。预测一个性质恒定、尺度一致的目标,比预测内容千变万化、亮度差异巨大的真实图像,数值上要稳得多。
还有一个衍生好处:因为正向过程是马尔可夫的,给定 x_0 和 x_t,我们其实可以把 q(x_{t-1} | x_t, x_0) 写成闭式高斯分布。经典的 DDPM 训练目标就是在最大化这个条件分布的似然,而最终的损失函数化成了预测噪声的均方误差。整个目标函数完全基于"已知的破坏过程"推导,不需要引入任何额外的先验假设,这也是扩散模型框架之所以干净、可靠的重要原因。
3. 同样一套模型,目标函数一换结果天差地别
很多人在初学扩散模型时会有个疑问:既然预测噪声和预测干净图像在最优解上可以互相换算,为什么大家非要用噪声预测?直接预测像素不行吗?
最优解可以换算,不代表训练过程好走。把目标从 ε 换成 x_0,等于把同一个模型塞进一个条件差得多的优化问题里。我拆开来说。
3.1 直接预测像素的三个麻烦
第一个麻烦前面已经提到:多峰目标下的均值坍缩。同一个 x_t 对应多个合法 x_0,最小二乘只会教你输出它们的平均。平均就是模糊,模糊就是细节全丢。这个问题在高噪声阶段尤其致命,因为那时 x_t 几乎不含图像信息,合法 x_0 的集合遍布整个数据分布,均值坍缩得最厉害。
第二个麻烦是不同时间步的任务难度跨度太大。在 t 接近 0 时,x_t 几乎就是原图,预测 x_0 很容易;在 t 接近 T 时,x_t 几乎纯噪声,预测 x_0 差不多等于从随机输入直接生成一张真实图片,难如登天。把这两个极端放进同一个均方误差里,损失值的大小天然差出好几个数量级。模型会把精力全放在容易的低噪声步上,高噪声步几乎没有梯度信号,训练效率被严重拖垮。
第三个麻烦涉及像素空间的冗余性。自然图像里相邻像素高度相关,大片平坦区域(天空、墙壁、皮肤)在像素空间中占了极大体积。直接对像素做 L2 损失,梯度会由这些平滑区域主导,而真正有信息量的边缘、纹理反而被淹没。形象地说,模型把大量力气花在"把天空涂匀"上,却没学会"把眼睛画出来"。
3.2 预测噪声的三个优势
再看噪声目标,这几个麻烦几乎被逐一化解。
优势一:目标分布集中且统计特性恒定。噪声 ε 永远来自同一个标准高斯分布,各像素独立同分布,预测它不存在"多个平均值变成糊"的问题——至少程度轻得多,因为噪声的随机结构远没有真实图像那么复杂和多模态。
优势二:目标尺度跨时间步一致。无论 t 多大,ε 的模长期望都是√d(d 是像素数),损失天然处于同一量级。模型在每个时间步都接收到可比的梯度信号,不需要设计复杂的损失权重去平衡不同阶段的难度。
优势三:噪声在像素空间和频率空间都是均匀分布的。白噪声的频谱是平的,每个位置的每个高频细节都携带着同等权重的监督信号。这让模型被迫同时关注平滑区域和纹理区域的去噪,不至于被大面积平坦区域带偏。
下面这张表把两者的差异总结得很清楚:
| 对比维度 | 预测噪声 ε | 预测像素 x_0 |
|---|---|---|
| 目标分布形态 | 简单、集中、统计已知 | 高度多峰、充满歧义 |
| 跨时间步损失尺度 | 基本一致 | 差异可达数量级 |
| 高频细节梯度 | 均匀覆盖 | 被平滑区域淹没 |
| 最优解的视觉结果 | 对应清晰去噪方向 | 常常退化成模糊平均 |
| 训练稳定性 | 高,曲线平滑 | 低,易早停或发散 |
4. 流形假设:为什么"小步修复"比"一步到位"更容易踩稳
扩散模型的稳定性还有一个更几何化的解释,那就是流形假设。这个概念值得单独拿出来讲,因为它是理解"小步修复"为什么可靠的关键。
4.1 自然图像只占像素空间的一小块
一张 64×64 的灰度图,像素空间是 4096 维。在这个空间里随便采样一个点,几乎必然是雪花噪声,根本不像任何真实物体。自然图像虽然散落在这个高维空间里,但只占据一个维度低得多的流形——这个流形上每一点都对应一张"看起来合理"的图片。
加噪过程做的事情,就是不断把图像往流形外推:一开始 x_0 在流形上,随着噪声增大,x_t 逐渐离开流形表面,飘向高维空间的深处。等 t 接近 T,x_t 已经基本变成流形外一个随机的高维点,和图像流形几乎没有任何可辨识的联系。
反推过程就是反过来:从流形外一个点出发,一步步走回流形表面。这里的关键是,每一步该往哪走,其实是有迹可循的——因为你距离流形越近,局部的结构线索越强,越容易判断正确的修正方向。
4.2 大步跳跃为什么危险
想象你在浓雾里想走回山脚营地。如果每走一步之前都能看清脚下两米的地形,你可以不断微调方向,稳稳当当走回去。但如果要求你闭着眼睛原地起跳一次,直接跳到营地,你大概率会落在完全未知的地方——因为雾太浓、距离太远,一次跳跃根本带不来足够的修正信息。
一步到位预测像素就是这个"闭眼大跳"。模型输入的是几乎纯噪声的图像,要输出的却是一张具体、清晰、结构精确的真实图片,中间隔着整个流形到噪声区的距离。这个距离内的所有信息都隐藏在噪声里,一次回归根本消化不了。
小步去噪则像雾中小步修正。每一步输入的 x_t 离流形都不算远,局部信噪比足够高,网络只用学"把当前图像往流形方向推一点点"。这个"一点点"的回归任务是良定的(well-posed),梯度方向清晰,误差不会跨步累积到无法收拾的地步。
这恰好也解释了为什么扩散模型的采样步数通常要几百步:不是模型偷懒,而是每一步的修正量必须小到"局部线索仍然有效"的程度。步数减少,每一步要跨越的距离就会变大,模型的预测就会从"稳稳的修复"滑向"冒险的猜测"。
5. 实测观察:预测噪声的训练曲线为何又稳又直
原理说了不少,说点实际的。我曾在模拟项目X里用一个小规模的扩散模型做过对比实验:同样的网络结构、同样的数据、同样的噪声调度,唯一区别是一个训练目标是预测 ε,另一个是直接预测 x_0。差异几乎是肉眼可见的。
5.1 两条训练曲线的直观对比
先看预测噪声的那一组。从第一个 epoch 起,损失就在稳步下降,曲线平滑,没有大的波动,也不需要特别精巧的学习率调度。训练过程中我尝试了不同的学习率,从 1e-4 到 3e-4,它都表现得很宽容;即使偶尔把学习率调得偏大,最多也就是损失震荡几下,很快就能恢复。整个过程几乎没操过心。
再看预测像素的那一组。头几个 epoch 损失确实也在降,但降得非常快就停滞了——典型的陷入"模糊均值"的信号。把生成的样本拿出来看,每一张都像同一张灰蒙蒙的背景,没有任何清晰结构。继续训练,损失几乎不动;加大学习率,反而出现梯度爆炸,偶尔直接变成 NaN。后来我把损失改成按时间步加权,试图补偿高噪声步的梯度不足,效果有所缓解,但训练仍然远不如噪声预测稳定,最终生成质量也明显差一截。
这两条曲线的对比让我真正明白了"稳定"二字的含义:稳定不只是不报错、不发散,更是说每一个梯度步都在往正确的方向推进。预测噪声时,目标简单、尺度统一,梯度几乎从来不会给出误导性的方向;预测像素时,模型常常学到"输出平均值"这种看似低损失实则无用的解,于是训练早早进入平台期。
5.2 我在实际训练里总结的几条经验
基于这些实验,我整理出几条对实操有帮助的经验,供参考:
第一,如果是在已有代码框架上改模型,确认输出头到底在预测什么。很多开源实现虽然写着"预测噪声",但内部做了重新参数化(例如通过 x_0 间接算 ε)。如果你直接改成输出 x_0,一定要同步重新设计最后的卷积层初始化和损失权重,否则很容易踩到训练崩溃的坑。
第二,对于预测噪声的模型,最后一层卷积建议用很小的初始化(甚至零初始化)。这样做等于让模型在训练初期先输出"没有噪声",再逐步学会修正,避免第一轮前向就产生巨大的错误梯度。这个小技巧在我多次实验中都能明显提升稳定性。
第三,损失函数用最简单的均方误差就行,但要注意把 ε 当作标准高斯来预测,不要在损失里额外加权重(除非你要针对某个时间步做特殊优化)。DDPM 原始的简化损失就是平均所有时间步的 ε 预测误差,这个配方简单却极其有效,没必要一开始就搞花活。
6. 从照片修复到超分与补全:这套思路能辐射多远
"预测破坏而不是预测真相"这套思想,远远不限于生成模型本身。它几乎重塑了整个图像修复领域,也解释了为什么"旧照片修复"这类任务在有扩散模型之后迎来了质的飞跃。
6.1 条件扩散:把修复问题也变成"预测破坏"
图像去噪、去模糊、超分辨率、修复破损区域、上色,这些任务的共同点是有输入图像作为强约束。早期方法多半直接训练一个模型从退化图像预测干净图像,也就是标准的像素预测——效果大家也知道,细节容易糊。
条件扩散模型换了个思路:仍然走加噪-去噪的框架,但把退化图像当作每一步都可见的额外条件。模型做的事和生成任务几乎一样——预测每一步添加的噪声;区别只是它在预测时额外"看着"那张退化图像,从而把去噪方向牢牢锚定在输入提供的信息上。
举个直观例子。给模型一张低分辨率图,让它生成高分辨率版本。普通回归模型要一步猜出所有高频细节,很容易把纹理平均掉;条件扩散模型则一步步地从噪声里"挤"出细节,每一步都参照低分图的结构约束,高频信息是逐步精修出来的,不是一步蒙出来的。这就是为什么基于扩散的超分模型在高倍放大下依然能保留自然的皮肤质感,而不是一片塑料感。
6.2 什么任务适合"修复式"建模,什么不适合
这套方法的适用边界也值得说清楚。它的核心优势来自"锚点"——输入条件越强,预测破坏就越稳定,效果就越好。去噪、超分、补全、上色,都有强输入条件,天然适合条件扩散。而纯文本生成图像这类任务,输入条件只是一个语义描述,锚点弱得多,所以必须依靠大规模数据和更长的采样过程来弥补,不能指望它像修复任务那样一步到位。
从另一个角度看,这个"修复大于创作"的原则在模型设计上也有启发:如果一个生成任务能够用某种方式提供"部分真实数据"作为条件,那么无论从训练稳定性还是生成质量上,都会比从头生成容易得多。这也就是为什么很多实际落地产品更偏爱条件扩散路线——不是无条件生成不够酷,而是"修复式"的问题结构更利于训练收敛,也更贴近真实业务需求。
把前面讲的内容串起来,核心其实就一句话:预测噪声之所以比预测像素稳定,是因为它把"从零创作"改造成了"局部修复",把高维空间里一个几乎不可能一步跨越的距离,拆成了上百个每个都很短的、带有锚点的小跨步。理解了这一点,再去看扩散模型的训练、采样、加速算法,你的视角会完全不一样——你不再是在背公式,而是在看一个老练的修复师如何一点一点把一张旧照片恢复到它原本的样子。