
生成模型这几年从学术圈火到工程圈几乎每个做算法的团队都在用。但真正把VAE、GAN、扩散模型放在一起看的时候很多人脑子里其实是散的知道它们都能生成东西知道它们各有各的损失函数但要说清楚它们到底在优化同一个东西的哪个侧面就卡壳了。我自己在这个问题上反复绕了很久直到把概率密度和采样轨迹这两个视角拎出来整个图景才突然清晰。这篇就聊聊我怎么理解生成模型的统一框架以及这套理解在实际调参、排错、选型时到底能帮上什么忙。1. 为什么统一图景不是学术洁癖而是排错刚需1.1 一个真实场景模型突然生成质量暴跌先讲个我踩过的坑。有段时间在做一个图像生成项目训练到一半生成质量突然断崖式下跌——前一个epoch还像模像样下一个epoch出来的东西糊成一团。当时第一反应是学习率炸了调小之后没用又怀疑数据加载出问题检查了一遍也没毛病。折腾了大半天最后发现问题出在采样环节我改了一个采样步数的配置但没同步调整对应的噪声调度参数导致采样轨迹和训练时假设的密度分布对不上。这件事让我意识到如果脑子里只有模型结构这一层排错就只能靠猜。但如果你同时有概率密度和采样轨迹两个视角就能快速定位到底是密度估计出了问题训练阶段还是轨迹积分出了问题采样阶段。这两个阶段的问题表现很像但根因完全不同修法也完全不同。1.2 概率密度视角模型在学什么分布从概率密度角度看生成模型的本质是给定一批真实数据学出一个概率分布让这个分布尽可能贴近真实数据的分布。听起来简单但贴近怎么定义就是各家模型分道扬镳的地方。VAE走的是显式密度估计的路子。它假设数据由一个隐变量生成通过编码器把数据映射到隐空间再通过解码器还原。训练目标是最大化数据的对数似然下界ELBO。这个下界由两部分组成重构误差和KL散度。重构误差保证还原得准KL散度保证隐空间规整。你可以把VAE理解成我先假设一个分布形状然后让数据去适配这个形状。GAN走的是隐式密度估计的路子。它压根不显式写出概率密度而是通过判别器来间接衡量生成分布和真实分布的差异。生成器负责骗过判别器判别器负责分辨真假。理论上当判别器达到最优时生成器优化的就是JS散度。但GAN的问题也在这里JS散度在两个分布没有重叠时会饱和梯度消失训练就崩了。扩散模型则是另一条路。它把生成拆成很多步先定义一个前向过程逐步给数据加噪声直到变成纯噪声再学一个反向过程从纯噪声逐步去噪还原数据。从密度角度看扩散模型学的是每一步的条件密度最终通过马尔可夫链把噪声映射回数据分布。1.3 采样轨迹视角模型怎么从噪声走到数据光有密度还不够你还得能从分布里取出样本。这个过程就是采样轨迹。VAE的采样很直接从先验分布通常是标准正态里采一个隐变量过一遍解码器就出结果。轨迹只有一步简单粗暴但代价是生成质量往往偏糊因为解码器要覆盖整个隐空间压力太大。GAN的采样同样是一步从噪声分布采一个向量过生成器直接出图。轨迹也是一步但生成器是被对抗训练逼出来的所以细节更锐利。问题是训练不稳定而且容易模式崩溃——生成器只学会生成少数几类样本多样性差。扩散模型的采样是几百到上千步的迭代过程。每一步都沿着学到的反向过程走一小步从纯噪声慢慢雕刻出图像。轨迹长计算贵但质量高、多样性好。这也是为什么扩散模型在图像生成上能后来居上。把这三个放在一起看你会发现一个统一图景所有生成模型都在做同一件事——把简单的先验分布比如高斯噪声变换成复杂的数据分布。区别只在于变换的方式VAE用一步解码器GAN用一步对抗训练出来的生成器扩散模型用多步马尔可夫链。而概率密度描述的是变换的目标采样轨迹描述的是变换的路径。2. VAE、GAN、扩散模型在统一框架下的定位差异2.1 显式密度 vs 隐式密度一条分水岭理解生成模型第一刀应该切在是否显式建模概率密度上。显式密度模型VAE、扩散模型、归一化流会写出概率密度的表达式或者至少写出一个可优化的下界。好处是训练目标明确可以用最大似然估计训练相对稳定。坏处是密度函数的形式受限要么假设太强VAE的高斯假设要么计算太贵归一化流的雅可比行列式。隐式密度模型GAN不写密度只学一个采样器。好处是密度形式不受限能拟合任意复杂的分布。坏处是没有明确的训练目标只能靠对抗博弈稳定性差。这里有个常见的误解很多人以为GAN没有概率密度所以它不算概率模型。其实不是。GAN的生成器隐式定义了一个分布只是这个分布没有解析形式。你依然可以从里面采样只是没法直接算某个样本的概率。这个区别在工程上很重要如果你需要做密度估计、异常检测、似然比较GAN就不合适如果你只需要高质量采样GAN可以很能打。2.2 一步采样 vs 多步采样质量与成本的权衡第二刀切在采样轨迹的长度上。一步采样的模型VAE、GAN推理快适合实时应用。但一步要把整个复杂变换压进去对网络容量和训练策略要求极高。VAE靠重构损失和KL正则GAN靠对抗训练都是在逼一步变换逼近复杂分布。多步采样的模型扩散模型把变换拆成很多小步每一步只学一个简单的去噪任务。这样每步的学习难度低整体质量高。代价是推理慢采样步数多。后来的一系列加速方法DDIM、蒸馏、一致性模型本质上都是在压缩采样轨迹试图用更少的步数逼近多步的效果。我自己的经验是如果你的场景对延迟不敏感扩散模型是首选如果必须实时VAE或轻量GAN更合适如果既要质量又要速度可以考虑蒸馏后的扩散模型或者一致性模型。2.3 训练稳定性为什么GAN最难伺候从统一图景看训练稳定性差异的根源在于优化目标是否良定义。VAE的ELBO是一个明确的下界最大化它就完事了。虽然下界可能松但至少方向明确不会来回震荡。扩散模型的反向过程也是一个明确的条件密度估计问题每一步都是监督学习目标清晰。GAN的优化目标是博弈均衡不是单一损失的最小化。生成器和判别器在互相追理论上存在纳什均衡但实际训练中经常出现震荡、模式崩溃、梯度消失。这不是调参能根治的而是对抗框架的固有特性。理解了这一点你就不会在GAN训练崩了的时候一味怪学习率或者网络结构。很多时候问题出在判别器太强或太弱导致生成器拿到的梯度信号不对。这时候要调的是两者的平衡而不是单方面的超参。3. 从密度到轨迹采样环节的实操细节3.1 采样步数与噪声调度的匹配回到开头那个坑。扩散模型的采样步数和噪声调度是绑定的。训练时用的是某个噪声调度比如线性、余弦采样时如果换了步数但没同步调整调度轨迹就会偏。具体来说训练时模型学的是在特定噪声水平下如何去噪。采样时如果步数变了每一步对应的噪声水平就变了模型没见过这些水平自然去噪去不好。解决办法是采样步数变化时重新计算每一步的噪声水平保证和训练时的调度一致。我现在的习惯是把噪声调度参数和采样步数写在一个配置文件里改一个就自动联动另一个。这样就不会出现改了步数忘了调度的低级错误。3.2 采样轨迹的数值稳定性扩散模型的采样是迭代积分数值稳定性很关键。常见的问题是步长太大轨迹震荡步长太小累积误差大。DDIM采样通过确定性积分缓解了随机性带来的方差但步长选择依然重要。我的经验是先用较多步数比如100步跑通确认质量没问题再逐步减少步数观察质量下降的拐点。拐点之前是安全区拐点之后就要谨慎。另外采样时的数值精度也值得注意。混合精度训练能省显存但采样时如果用半精度累积误差可能让轨迹偏掉。我一般采样时用全精度训练时用混合精度。3.3 隐空间采样的边界问题VAE的采样是从先验里采隐变量。如果先验是标准正态采样范围理论上是无界的但实际训练时隐空间的有效区域是有限的。如果你采到了边缘区域解码出来的东西可能就很怪。解决办法有两个一是用更紧的先验比如稍微小一点的方差二是采样时截断只采高概率区域。后者会损失多样性但能提升单样本质量。具体怎么选看你的应用场景。4. 概率密度视角下的损失函数设计逻辑4.1 VAE的ELBO下界为什么这么设计ELBO的推导其实很直观。你想最大化数据对数似然log p(x)但直接算不了因为要对隐变量积分。于是引入一个变分分布q(z|x)用Jensen不等式得到一个下界log p(x) E_q[log p(x|z)] - KL(q(z|x) || p(z))第一项是重构项鼓励解码器从隐变量还原出原数据。第二项是正则项鼓励编码器输出的分布贴近先验。这个设计的巧妙之处在于它把不可解的最大似然问题转化成了可解的优化问题。代价是下界可能松也就是ELBO和真实对数似然之间有gap。gap越小训练越充分。实操中KL项容易塌缩——编码器直接输出先验隐变量不携带信息解码器只能靠自身能力硬还原。这时候生成质量会下降。缓解方法包括KL退火、free bits等本质都是控制KL项的权重别让它太早主导。4.2 GAN的对抗损失JS散度的陷阱GAN的原始损失在判别器最优时等价于优化JS散度。JS散度的问题前面提过两个分布没重叠时它是个常数梯度为零。这在训练早期特别致命。生成分布和真实分布几乎肯定没重叠判别器轻松区分真假生成器拿不到有效梯度学不动。WGAN用Wasserstein距离替换JS散度即使分布没重叠也能提供有意义的梯度。这是GAN训练稳定性的一大进步。后来的 hinge loss、least squares loss 等本质上都是在找更好的距离度量。4.3 扩散模型的去噪目标为什么是预测噪声扩散模型训练时常见的目标是预测加入的噪声而不是直接预测干净图像。这个选择有讲究。从密度角度看预测噪声等价于估计score函数对数密度的梯度。score函数指向密度增加的方向沿着它走就能从低密度区走到高密度区。这正是采样时需要的。从数值角度看预测噪声比预测干净图像更稳定。因为噪声的尺度是已知的就是加进去的那个而干净图像的尺度变化大。预测已知尺度的东西网络更容易学。后来也有预测速度场velocity或直接预测x0的变体各有优劣。但预测噪声是最经典、最稳的选择。5. 采样轨迹加速从多步到少步的工程取舍5.1 DDIM确定性采样的第一步DDIM的核心洞察是扩散模型的采样不一定要随机。原始DDPM的采样是随机的每步都加噪声。DDIM把它改成确定性的只要保持边缘分布一致采样轨迹可以重新参数化。好处是可以用更少的步数质量下降不明显。而且确定性采样意味着同一个噪声输入总是生成同一张图可复现性好。代价是多样性略降。因为随机性少了样本的覆盖范围会窄一些。但在很多应用里这个代价可以接受。5.2 蒸馏与一致性模型把轨迹压到极致如果DDIM还不够快就得上蒸馏。思路是让一个少步的学生模型去模仿多步老师模型的输出。学生模型一步到位老师模型跑几十步训练目标是让两者输出一致。一致性模型更进一步它要求轨迹上任意两点都能直接映射到同一个终点。这样采样时可以从任意噪声水平一步出结果。这些方法的共同点是用训练时间换推理时间。训练更复杂但推理快很多。适合部署场景。5.3 加速的边界什么时候不能再压了采样轨迹不能无限压缩。每压一步学生模型要拟合的变换就更复杂误差就更大。压到一定程度质量会崩。我的经验是蒸馏到4步左右通常还能保持不错的质量再少就要看具体任务。有些简单任务2步也行复杂任务可能8步才稳。这个拐点只能实测没有通用公式。6. 实际项目中的选型与排错经验6.1 选型决策表需求维度VAEGAN扩散模型生成质量中高很高多样性中低易模式崩溃高推理速度快快慢可加速训练稳定性高低高密度估计支持不支持支持适合场景压缩、重建实时生成高质量生成这张表是我自己项目里总结的不一定通用但能帮你快速定位方向。6.2 排错清单质量差时先查什么生成质量差按这个顺序查采样步数和噪声调度是否匹配采样时的数值精度是否够训练是否充分loss曲线是否收敛隐空间或噪声空间采样是否越界数据预处理和归一化是否一致这五条覆盖了我遇到的大部分问题。按顺序查基本能定位。6.3 一个容易被忽略的点训练和推理的一致性最后强调一个坑训练和推理时的预处理必须一致。我见过有人训练时图像归一化到[-1,1]推理时忘了反归一化出来的图颜色全错。这种低级错误在赶项目时特别容易犯。建议把预处理和后处理封装成函数训练和推理共用同一套。这样就不会出现不一致。生成模型的统一图景说到底就是一句话所有模型都在把简单分布变换成复杂分布区别只在变换的方式和路径。抓住概率密度和采样轨迹这两个视角选型、调参、排错都会清晰很多。我在实际项目里最大的体会是不要孤立地看某个模型的某个技巧而是把它放回统一框架里问它解决的是密度估计的问题还是采样轨迹的问题。想清楚这个很多困惑就自然解开了。