输入“一只蓝色杯子,放在木桌上”,屏幕上逐渐出现画面。模型是不是先在数据库里找到一只杯子,再把背景换掉?如果最初只有噪声,杯子的形状又是从哪里来的?

本章讲两条相关的生成路线:扩散模型通过学习不同噪声程度下的恢复规律生成样本;流匹配学习一个随位置和时间变化的移动方向场。我们只用加减乘除和一个解释清楚的平方根,不要求微积分,也不从某款产品的画风推测它的内部算法。

1.先分开训练、生成与编辑

训练时,系统拥有真实图像,可以人为破坏它,再让网络学习与恢复有关的预测任务。生成时,系统从新抽出的噪声开始,使用已学到的规律逐步更新,通常没有一张等待被揭开的原图。

这两种过程不能混画。训练知道原始样本和加入的噪声,因此能够构造监督信号;生成只知道当前状态、时间或噪声级别,以及文字等条件。让噪声“变成图”的能力来自参数中学到的数据分布,不是噪声本身秘密保存了那张图。

编辑又是第三种情形:可以从已有图像或其表示出发,加到某个噪声程度,再在新条件下生成,也可以使用专门的编辑结构。保留多少原图、改变多少内容,取决于具体流程,不能把所有编辑都说成完全从随机噪声重画。

2.前向加噪:日程规定每一步破坏多少

经典DDPM使用逐步加高斯噪声的前向过程。高斯噪声可以直观理解成多数数值靠近零、少量偏得较远的随机扰动;每个位置都加入这样的数值,不是只往图片上撒几颗白点。DDPM原论文

“噪声日程”规定不同步骤的噪声强度。常用βₜ表示第t步新增噪声的方差,αₜ=1−βₜ表示该步对应的保留因子;下标t只是步数。方差描述随机数分散的程度,不是某一个实际抽到的噪声值。

把截至第t步的保留因子相乘,得到ᾱₜ。上面那条横线提醒我们:这是累计量,不是单步αₜ。在这种前向过程下,可以直接构造指定时刻的带噪样本:

xₜ=√ᾱₜ × x₀+√(1−ᾱₜ) × ε

x₀是干净样本的数值,xₜ是第t个噪声级别的样本,ε是新抽出的标准高斯噪声,√表示平方根。对图片,x和ε都是许多数组成的数组,公式在对应位置上运算。两个系数的平方相加为1,并不是两个系数本身相加为1。

例如ᾱₜ=0.64时,信号系数是0.8,噪声系数是0.6;ᾱₜ=0.36时,两者是0.6和0.8。累计保留下降,原样本的影响变弱,噪声影响变强;到后期,分布接近便于抽样的噪声分布。

单步与累计不能混用。教学日程若β₁=0.36、β₂=0.4375,则α₁=0.64、α₂=0.5625,而ᾱ₂=0.64×0.5625=0.36。第二步的累计保留不是0.5625。这些大步数字只为手算,不是推荐的真实训练配置。

直接构造某个xₜ,让训练不必每次从第一步完整跑到第t步。它给出的是该时刻所需的带噪样本;分别抽噪声画出的几个时刻,不应假装成同一次逐步加噪的完整轨迹。DDPM前向过程与直接采样公式

3.网络究竟学什么:拿一个数走完监督

只看一个数,设干净值x₀=2,累计保留ᾱₜ=0.64,本次抽到ε=0.5。则带噪值xₜ=0.8×2+0.6×0.5=1.9。这不是像素亮度的强制范围,只是标准化数值的教学例子。

让网络接收1.9和对应时间t,预测加入的噪声。若它预测0.2,而训练程序知道实际噪声是0.5,平方误差就是(0.2−0.5)²=0.09。平方表示一个数乘自己,使正负偏差都受到惩罚;再通过第7章的参数更新,让同类预测更接近目标。

时间输入不可省略。同一个数值1.9出现在低噪声与高噪声阶段,应该如何解释很不一样。实际训练随机选择样本、时间和噪声,网络学习许多不同破坏程度下的规律,不能只学会清理某一种固定污点。

用这个例子还可以看见预测误差如何影响恢复。如果噪声预测恰好为0.5,按(1.9−0.6×0.5)÷0.8可还原为2;若预测0.2,就得到2.225。这里计算的是当前时刻对干净值的估计,不是完整DDPM采样器的一步公式。

25|图像怎样生成:从噪声到图,而非给文字换皮:图1

图1|训练由已知干净值2和已抽噪声0.5构造带噪输入1.9;预测器输出0.2,损失0.09用于更新参数。生成时只有当前状态、时间与条件,没有训练标签可直接读取;后续采样规则见图2。

为什么不直接一次还原?噪声严重时,同一带噪输入可能对应许多合理原图,恢复不是唯一逆运算。预测器学的是数据分布下的规律,生成过程则利用这些规律逐步构造样本。最终画面可以是训练中没有出现过的新组合,也可能出现记忆复现,因此不能保证永远原创。

同一个观察为何仍能训练?在上述噪声级别,x₀=2、ε=0.5会产生1.9;另一组x₀=1.25、ε=1.5也会产生0.8×1.25+0.6×1.5=1.9。训练程序知道自己选了哪组,便有正确的监督标签;仅看到1.9的预测器却未必能区分来源。若简化成这两种来源同样可能、没有其他信息,噪声预测1会让两项平方误差的平均最小,而不是总能猜中0.5或1.5。许多样本与条件让网络学习这种条件规律,训练标签并不是生成时可以精确反解的密码。

预测噪声只是一个常见参数化选择。有的模型预测干净样本或其他等价关联量。网络的预测目标、前向噪声过程与实际采样器必须配套;看到界面写“去噪”,不能断定网络内部一定直接输出噪声数组。

4.反向生成:模型给预测,采样器决定怎么走

生成时先抽一个高噪声状态。每一步,网络根据当前状态和时间给出预测,采样器结合日程计算下一个状态。经典DDPM反向步骤通常还包含随机项,最后一步有相应特殊处理,不是永远机械地“当前值减去预测噪声”。

同一组训练权重可以在兼容条件下采用不同采样方案。DDIM研究展示了与原训练目标兼容、可采用更少步骤的采样路线;其中有确定性设置,也有其他设置。不要把“扩散”定义成每一步必须再抽随机噪声。DDIM原论文

选择一种明确规则,就能把采样器的黑箱打开。这里只采用不额外抽噪声的确定性DDIM一步,并采用本章的累计保留记号ᾱ。当前时间t的噪声预测记作ε̂,帽子表示“估计”。先估计干净样本,再组合成下一个噪声更少的时间s:

x̂₀=xₜ−√(1−ᾱₜ)×ε̂÷√ᾱₜ

xₛ=√ᾱₛ×x̂₀+√(1−ᾱₛ)×ε̂

这里s<t,ᾱₛ>ᾱₜ;x̂₀是采样器按预测算出的干净值估计,xₛ才是下一轮输入。此特例沿本次预测的噪声方向组合,不再额外加入随机项;它来自DDIM一般更新中随机系数为0的情形,不代表完整DDPM或所有采样器都这么走。DDIM原论文第4.1节及式12

沿第2节的两级教学日程做一步:当前t=2,ᾱ₂=0.36,状态x₂=1.6;模型预测ε̂=0.2。采样器先算x̂₀=(1.6−0.8×0.2)÷0.6=2.4,再前往s=1、ᾱ₁=0.64,得到x₁=0.8×2.4+0.6×0.2=2.04。这里1.6是一次采样的当前状态,不假定系统知道它对应哪张原图。训练小例中的1.9与这次生成步骤也不是同一次DDPM随机轨迹。

25|图像怎样生成:从噪声到图,而非给文字换皮:图2

图2|指定确定性DDIM特例,模型只输出噪声预测0.2;采样器依据两级累计保留0.36→0.64,先得到干净值估计2.4,再得到下一状态2.04。当前状态、干净估计、下一状态是三个不同对象;下一轮需用新状态与新时间重新预测。

数值从1.6变大到2.04,并不违反“去噪”:下降的是日程中的噪声水平,不是要求每个坐标都向零缩小。下一轮网络接收的是2.04和时间1,要重新预测,不能把第一次的0.2永远当作已知真实噪声。这个区分也像软件中的接口契约:预测器输出何种量、时间刻度怎样解释、求解器期待何种输入,都要匹配;数组形状相同不代表可任意互换。

步数、求解方法和单步网络成本共同决定速度。更多步通常提供更细的更新,但质量不会无限增加;过少步也可能让粗糙近似积累明显误差。不同模型的“二十步”不能只按数字比较,因为预测器、日程和每步计算都可能不同。

随机种子控制随机数序列的一部分。在固定模型、设置和兼容实现下,它有助于重复结果;换了模型或算法,即使种子相同,也不意味着画面应该相同。种子是复现条件之一,不是跨系统通用的图片编号。

这里还要区分训练的噪声日程与生成时选取的时间点。前者决定网络学习哪些带噪状态,后者决定采样器实际沿哪些位置更新。生成少走几步不是把训练日程随意删掉,也不是只需把步数旋钮改小就能无代价提速;两者的尺度与模型输入必须保持兼容。

网络骨架也不是生成算法本身。预测器可以采用卷积网络或Transformer等结构;使用Transformer不表示它必然像语言模型那样逐token自回归。应分别问“用什么网络计算预测”和“用什么目标训练、怎样采样”。

5.文字条件与引导:怎样让噪声走向蓝色杯子

无条件生成只要求样本像训练分布中的图。文字条件则让更新同时考虑“蓝色杯子、木桌”等要求。文本先编码成向量,再通过交叉注意力或其他条件注入方式影响预测。交叉注意力让视觉状态读取文字表示,具体结构因模型而异。

一种常见方法叫无分类器引导,即classifier-free guidance。训练中有时省去条件,使网络同时学会有条件和无条件的预测;使用时组合两种预测,增强条件对更新方向的影响。“无分类器”指不需要另训练一个分类器指导,不是没有文字条件。无分类器引导原论文

以噪声预测为例,可写为:引导预测=ε无条件+w×(ε有条件−ε无条件)。w是引导强度;在这一写法里,w=0用无条件预测,w=1用普通条件预测,w大于1沿两者的差异继续外推。其他文献和软件可能采用不同参数记法,数值不能盲目互抄。

教学数字取无条件预测0.4、有条件预测0.1,w=2,则引导预测是0.4+2×(0.1−0.4)=−0.2。结果超出了原来0.1到0.4的区间,这恰好说明它是外推,不能理解成两个答案的温和平均。

25|图像怎样生成:从噪声到图,而非给文字换皮:图3

图3|文字条件先影响预测器;同一状态与时间下,无条件预测0.4、有条件预测0.1,差为−0.3。按本章w=2的约定沿差方向走两份,得到−0.2,位于原区间之外。它是交给兼容采样器的预测值,不是最终像素。

更强引导不保证更好。它可能提高提示的显著性,同时牺牲多样性、自然度或细节稳定性;过强时还可能出现失真。常见实现需要计算两种预测,因此也有计算代价,但具体实现可以优化,不能固定承诺耗时恰好翻倍。

6.潜空间:先把图换成较紧凑的表示

直接在每个像素上反复更新,成本很高。潜扩散先用编码器把图像映射成较紧凑的潜表示,在这个空间中训练或执行扩散,最后用解码器把潜表示还原为可看的图像。潜表示是学习得到的数字,不是一张藏起来的缩略JPEG。

潜扩散原论文把感知压缩与生成过程结合,并利用交叉注意力加入文字等条件。它是明确公开的技术路线,不能由此认定所有生成产品都采用相同潜空间或压缩比例。潜扩散原论文

做一笔教学资源账:256×256的RGB图有196,608个通道数;若假设编码器输出32×32×4的潜表示,则有4,096个数,是前者的1/48。这个比例只比较表示中的数值个数,不包含网络权重,也不等于运行显存或耗时缩小48倍。

25|图像怎样生成:从噪声到图,而非给文字换皮:图4

图4|训练图像可先编码到潜空间,在潜空间建立加噪与学习任务;生成从潜噪声开始,反复预测和更新潜状态,最后解码成像素。196,608对4,096只是指定尺寸下的数值个数比1/48,未包含网络与运行开销。

压缩可能丢掉小字和精细纹理,解码器也可能引入伪影;扩散网络即便把潜表示处理得很好,最终像素仍受编解码能力限制。因此理解或生成中的“细节不对”,不一定全部来自文字条件没有写清楚。

7.流匹配:学习每个位置该往哪边移动

流匹配把生成写成随时间移动的过程:从容易抽样的噪声分布出发,学习一个向量场,把整体分布逐步运送到数据分布。向量场可以想成地图上到处有箭头,每个箭头说明在这个位置、这个时刻该往哪里移动多快。

注意本节将t=0约定为噪声起点、t=1约定为数据终点,与前面DDPM前向加噪的时间方向相反。时间只是给过程编号的约定,比较公式前必须先核对起点与终点。

一种教学路径取噪声点z=−1,数据点x=3,令时间t从0走到1,中间位置写为xₜ=(1−t)z+tx。t=0时是−1,t=0.25时是0,t=0.5时是1,t=1时是3。沿这条直线,单位时间的移动量是x−z=4。

训练可以随机取配对端点和中间时间,让网络根据中间位置、时间和条件预测目标速度。真实网络看到许多样本路径,学习的是共同的速度场;生成时只有新的起点和学得的场,并不知道每条训练路径的终点。

若某处网络预测速度为4,用最简单的教学更新“新位置=旧位置+时间步长×速度”,从−1以0.25步长移动,就到0。真实速度通常随位置和时间变化,需要每步重算;数值求解器负责把这些局部预测连接为整条轨迹。若另一条教学路径从1走到5,同样速度4会让两个点一起右移,而不挤成同一点。这帮助我们看见,生成关心的是一群样本的分布怎样变化,不只是单条线终点好不好看。

25|图像怎样生成:从噪声到图,而非给文字换皮:图5

图5|流匹配的直线教学路径取t=0为噪声端、t=1为数据端。第一条路径位置为−1+4t;另一条为1+4t,两者速度同为4,距离始终为2。一次欧拉更新从−1走到0;真实速度场需随新位置和时间重算。

流匹配原论文把它表述为对条件概率路径的向量场进行回归,允许包含扩散路径在内的多种路径。因此扩散与流匹配有理论联系,却不能简单说“一个随机、一个确定”,或“流匹配就是没有噪声的扩散”。流匹配原论文

同样不能把一条配对直线推广成所有生成轨迹永远笔直。许多训练路径在同一区域提供不同信号,学出的整体场、数值近似和条件都会影响实际路线。更直或更少步是否更好,需要在相同质量、成本和条件下测量。

本章练习

题目

问题1|训练标签与可逆性

ᾱ=0.64时,验证(x₀=2,ε=0.5)和(x₀=1.25,ε=1.5)是否产生相同带噪数值。为什么训练程序能拥有噪声标签,却不意味着仅看输入的网络每次都能精确反推出标签?

问题2|换一个预测,走完一步

沿用图2,当前x₂=1.6,累计保留由0.36走向0.64,不额外抽噪声;只把预测ε̂改成0.5。计算x̂₀与下一状态x₁。下一轮能否继续假定预测仍为0.5?

问题3|引导究竟是在平均还是外推

无条件预测0.4、有条件预测0.1,按ε引导=ε无条件+w(ε有条件−ε无条件)。分别计算w=0、1、2的结果,并解释为什么w=2不属于两项的凸平均。

问题4|表示规模与移动速度

256×256×3图像与32×32×4潜表示各有多少个数?比值是多少,能否直接换成耗时比?另在流匹配教学路径上,旧位置−1、步长0.25、预测速度4,一次更新到哪里?这与潜空间大小属于同一设计问题吗?

思考提示

提示1|对应问题1

信号系数为0.8、噪声系数为0.6。比较完整来源信息与网络实际看到的信息。

提示2|对应问题2

先按当前噪声级别求干净估计,再按目标噪声级别重新组合,不要直接做1.6−0.5。

提示3|对应问题3

先算两种预测之差;观察结果是否始终落在0.1与0.4之间。

提示4|对应问题4

一个问题在数“每个状态有多大”,另一个在算“状态下一步怎么走”。

参考答案与解析

答案1|对应问题1

两者都是1.9:0.8×2+0.6×0.5=1.9,0.8×1.25+0.6×1.5=1.9。训练程序记录了自己选择的样本和噪声,所以标签明确;网络只看相同观察与时间时不能凭空区分两种来源。监督可以学习数据条件规律,并不把本来缺失的信息变成唯一可逆编码。

答案2|对应问题2

x̂₀=(1.6−0.8×0.5)÷0.6=2;x₁=0.8×2+0.6×0.5=1.9。它还处于第1个噪声级别,所以下一状态不必等于干净估计2。下一轮应给网络新状态1.9与时间1重新求预测;题设没有给出旧预测永远等于真实噪声的保证。

答案3|对应问题3

三项结果依次为0.4、0.1、−0.2。w=2相当于2×有条件预测−1×无条件预测,含负权重,超出0.1,0.4区间,因此是外推。它增强两预测的差,不保证质量一定提高。

答案4|对应问题4

两者为196,608和4,096个数,潜表示占1/48。网络结构、步数、编解码及其他开销都未计入,不能据此宣称耗时减少48倍。一次位置更新为−1+0.25×4=0。潜空间决定在哪种表示中生成,流场及求解规则决定状态怎样演化,是可组合的不同设计维度。

下一章

文字、视觉条件、生成目标、潜空间和采样器属于不同设计层,可以组合。下一章再加入时间:当样本是一段声音或连续视频,模型不只要让每个片段像真的,还要维持顺序、节奏和跨片段一致性。