
最近在调一步生成模型的时候被朋友问到一个很实际的问题你用的训练方案是哪一类CFG 蒸馏、DMD还是 GAN 判别器我回答说这些都没直接上。他有点意外毕竟一步生成模型的论文里这些关键词出现得太频繁了。但换个角度想如果不靠这些越来越复杂的方案只用最朴素的“教师模型给目标学生网络做回归”能不能训练出一个能看的一步生成模型这篇文章就是我沿着这条路做的一次完整梳理。这里的“不靠”不是否定这些研究方向而是想证明在你决定引入 GAN、DMD 这类复杂组件之前其实有一条更简单、更容易调试的路径可以先把流程跑通。它不适合所有场景但非常适合作为学习、实验和基线构建的起点。1. 一步生成模型真正的难点不是“少跑几步”扩散模型把图像生成过程拆成了几百步去噪每一步只做相对轻量的修正预测噪声、减去噪声、再加入一点随机性。这个过程在数学上很合理但在工程上确实慢。一步生成模型的目标是让网络从同一个随机噪声出发只用一次前向传播就得到最终图像。很多人以为这只是一个“把步数从 50 改成 1”的问题。真正做一次就会发现这更像是在让一个只做过局部去噪的网络突然学会全局规划。难点至少有两个。第一信息压缩比太高。扩散模型去噪轨迹中每一步都在处理不同频率成分和结构信息。训练一个网络一步完成等于让它在单次前向传播里处理整条轨迹的知识。第二训练信号不稳定。如果只用回归损失学生网络很容易学到“所有可能图像的平均值”结果就是模糊。为了克服模糊研究者才引入 GAN、DMD 一类方法用对抗损失或分布匹配损失把学生输出推到真实分布上。这些方法解决了一部分问题但也带来新麻烦。GAN 训练本质上是一个双层博弈调判别器和生成器的学习率、损失权重很费时间。DMD 需要维护分布匹配梯度对实现细节要求高。至于 Drifting、MeanFlow它们各自有很强的假设换一个数据集和网络架构就可能需要重新调。也正因如此我才想回到一个更小、更可控的起点先用教师模型提供监督信号让学生网络做回归看看能走到哪一步。1.1 一步生成模型在压缩什么扩散模型的采样过程可以理解为一个随机微分方程或马尔可夫链。从纯噪声开始模型逐步预测噪声并修正最终落到数据流形上。多步采样的好处是每一步只需要做小范围修正网络推理压力小坏处是用户必须等待一串串行计算。一步生成模型把整个采样轨迹压缩成一次函数映射。输入是某个固定分布下的噪声向量输出是图像。它要求网络不仅知道“图像长什么样”还要知道“从当前噪声到最终图像的最短路径在哪里”。这不是简单的步数缩减而是在学习一条更直接的传输路径。从成本上看一步模型把采样时的 50 次网络推理降成 1 次延迟优势非常明显。但从优化角度看它把原来分布在不同时间步的错误信号全部集中到了同一个前向传播里。模型必须同时处理好全局结构、局部纹理、颜色一致性和多样性。这就是为什么直接训练一步模型很容易坍缩或模糊。1.2 为什么“模糊”是绕不开的第一个坎如果学生网络只接收噪声 z目标图像是真实图像 x使用简单的 MSE 损失那么最优解在期望意义下就是给定噪声的条件均值。由于 z 到 x 的映射在训练数据里不是单射同一个 z 可能对应多张合理图像回归结果会倾向于它们平均的模糊结果。这里的关键在于一张真实图像作为硬标签是不够的因为学生不知道教师模型内部的去噪轨迹。它只能看到离散的输入输出对却看不到“为什么这个噪声会走向这张图”。所以训练一步生成模型不能只依赖“噪声-真实图像”配对。更好的做法是让教师模型先提供一个软标签这个软标签可以是一张教师生成图也可以是一段采样轨迹上的中间状态。换句话说你需要教给学生的不是最终答案而是教师的思考过程。2. 不靠GAN和DMD教师蒸馏是最稳的起点要训练学生网络一步生成最简单的做法就是拿一个训练好的扩散模型做教师把它多步采样的结果当作目标让学生网络在相同随机噪声下直接预测这个目标。整个过程中没有判别器也没有分布匹配梯度只有最普通的监督学习。这种做法的理论支撑很直接。教师模型已经学到一个从噪声分布到图像分布的映射无论它内部展开多少步最终输出都是合法图像。学生需要学习的就是把教师的“多步展开”压缩成“一步函数”。从输入输出看这正是回归问题。实际落地时需要解决两个问题一是配对数据怎么来二是损失函数怎么选。2.1 用教师多步采样结果做目标本质是软标签回归教师采样结果比真实图像更适合作为学生目标原因是它包含了教师对“什么样的图像合理”的理解。同样一组噪声教师多步采样后得到的图像可能不是训练集里任何一张图但它在视觉上合理分布上也更接近教师模型内部的生成分布。训练时学生输入和教师使用相同的初始噪声。这样可以保证输入输出配对是确定的减少学生需要学习的映射复杂度。你不需要额外标注只需要一个预训练扩散模型和一个随机数生成器。如果教师采样步数足够得到的目标图质量通常不错。学生只需要学习“从 z 到 x_teacher”的映射。这看起来很朴素但在小数据集上往往已经能得到可用的结果。2.2 不能让学生一步学完全部轨迹要渐进式压缩直接让学生在一步内学习教师 50 步采样的完整结果依然会面临目标多峰的问题。这是因为教师从同一个噪声出发多次采样可能因为重采样步内的随机性而产生不同结果。学生网络拿到的输入相同目标却不同它就只能学平均。解决办法是渐进式蒸馏。先不让学生一步走到最终步而是让它模仿教师两步合一步的行为。一个阶段完成后把学生当作新的教师继续做下一轮。整个流程可以是从 128 步蒸馏到 64 步再到 32、16、8、4、2最后到 1。这样设计的核心原因是每一步的知识只压缩一半学生需要处理的不确定性更小。训练难度和最终生成的视觉质量之间有一个更平滑的权衡曲线。2.3 损失函数MSE是底线LPIPS按需加入在朴素蒸馏里最基本的损失是均方误差。它能保证输出在像素层面接近目标但会倾向于保留低频结构、抹掉高频细节。另一个常用选择是 LPIPS一种基于深度特征的感知损失它更关注人眼敏感的结构差异但训练稳定性略差。建议从 MSE 开始先把流程跑通。如果发现输出过于平滑再尝试加入 LPIPS 或其他感知损失。加入感知损失时权重不要一开始就拉满可以从 0.1 左右的相对比例开始对比效果。损失类型优点缺点适合阶段MSE稳定、实现简单、梯度干净容易模糊、忽略高频细节初期验证流程LPIPS视觉质量更接近感知需要额外特征网络、训练波动中期优化细节MSE LPIPS稳定性与清晰度兼顾需要调权重最终精调3. 一条不依赖复杂算法的完整训练路径这里给一个可以照着跑的流程。目标是在小规模图像数据集上训练一个 32×32 的一步生成模型。整个过程不会用到 CFG、DMD、GAN也不需要额外的判别器网络。3.1 环境准备和前置条件你需要一张至少 8GB 显存的 GPU深度学习框架使用 PyTorch 即可。预训练教师模型可以选一个小型 DDPM UNet比如在 CIFAR-10 或类似数据集上训练好的模型。如果没有教师模型需要先训练一个或者直接使用开源社区放出的权重。学生网络可以复用教师网络结构但通道数可以减半。因为学生要做的事情是压缩整条轨迹容量太大不一定好太小又学不会。一个经验值是学生参数量控制在教师的 1/2 到 1/4 之间。还要注意学生网络的结构需要支持“时间步条件”。即使最终是一步生成训练早期仍需要使用时间步信息。这样网络可以逐步学习不同噪声强度下的去噪行为。3.2 阶段一把教师从 128 步蒸馏到 8 步不要直接挑战一步。第一次实验可以从 128 步开始先把教师蒸馏到 64 步再蒸馏到 32、16、8。每个阶段都是一次独立的训练训练完成后替换教师模型。这样的好处是每个阶段的任务都很明确学生网络输入噪声和时间步输出教师网络两步后的去噪结果。当采样步数从 128 降到 8 时网络已经学会了横跨多个噪声尺度去预测最终结构。实际操作中教师采样需要消耗一定时间。如果不希望采样代价太高可以离线预生成配对数据。也就是先固定一组随机噪声用教师采样得到目标图再把“噪声-目标图”保存为一个数据集。学生在这个数据集上跑多轮训练。3.3 阶段二从 8 步压缩到 1 步从 8 步往 1 步压是所有阶段里最困难的。8 步的时候模型还能依赖不同的时间步信息做逐步修正到 1 步时时间步信息基本只剩一个起点。你可以通过以下伪代码来理解核心流程# teacher: 预训练扩散模型 # student: 待训练的学生网络 # current_num_steps: 当前阶段教师采样步数 # dataloader: 图像数据加载器 for epoch in range(num_epochs): for images, _ in dataloader: z torch.randn_like(images) # 教师从同一噪声 z 开始走 current_num_steps 步采样 with torch.no_grad(): x_teacher teacher.sample(z, stepscurrent_num_steps) # 学生一步输出 x_student student(z) loss F.mse_loss(x_student, x_teacher.detach()) optimizer.zero_grad() loss.backward() optimizer.step()这个示例没有包含时间步对齐和重采样细节但核心训练思路就是这样学生从相同的起始噪声出发预测教师多步采样的最终结果。实际工程中如果需要更高质量可以参考渐进式蒸馏论文中的时间步对齐方法但阶段一已经能帮你跑通主线流程。3.4 关键参数参考参数项建议值说明优化器AdamW比 Adam 更容易配合 weight decay学习率1e-4 到 5e-4从低开始稳定优先Batch Size32 到 64取决于显存训练步数10k 到 50k小数据集可以更短EMA 衰减0.999提升采样稳定性归一化层GroupNorm避免 BatchNorm 在采样时出现问题不要一上来就把采样步数从 128 直接压到 1。先跑完 128→64→32→16→8再考虑 4→2→1。每个阶段都要保存关键 checkpoint。4. 不靠CFG时教师采样质量怎么补CFG 在扩散模型里非常常见主要用来增强条件信息。如果完全不使用 CFG教师模型在类别条件生成上的语义一致性可能会下降。学生模型的上限由教师样本质量决定所以这个问题不能忽略。解决方案有三类。第一换用更强的教师模型。第二增加教师采样步数。第三构造训练数据时使用无条件模型来避免依赖 CFG。如果你希望整个训练流程都不出现 CFG那么选择无条件模型最省事。这里想强调一点核心目标是让学生最终推断时不依赖 CFG训练过程中教师采样用什么样的辅助手段可以单独考虑。如果教师采样因为去掉 CFG 而质量下降学生蒸馏出来的效果也会变差这很容易被误判为学生网络设计问题。4.1 教师采样步数和随机种子需要认真记录训练可复现性非常关键。同一组噪声教师采样两次如果因为随机性导致目标不同学生就会困惑。建议固定种子并使用确定性采样器。另外记录教师采样步数、噪声调度、指导尺度这些设置。它们不属于学生模型本身但会直接影响训练数据质量。4.2 如果教师样本质量不够先别调学生先提升教师侧很多人在学生输出变差时第一反应是调学习率、改损失、换网络结构。但在蒸馏场景下更高效的做法是检查教师采样结果。你可以单独保存一批教师样本用肉眼判断是否清晰、多样、符合数据分布。如果教师样本本身就模糊学生无论如何都没法学出细节。这时候应该增加教师采样步数或者换一个容量更大的教师模型。这比花大量时间调学生网络有效得多。5. 训练失败按这条链路排查朴素蒸馏的失败通常不是单一原因而是目标、输入、网络结构、损失相互叠加的结果。下面给出一个排查顺序每步都先看现象再定位原因。5.1 排查输入与目标首先要确认学生输入和目标输出的形状是否匹配。常见错误包括图像取值范围不一致例如教师输出在 [-1,1]学生输出却用了 Sigmoid噪声分布不一致例如训练用标准正态采样时却用了均匀噪声目标没有正确停止梯度导致学生反向传播到教师或目标数据上。一个简单的测试是固定一个 batch让学生过拟合这一批数据。如果 loss 能明显下降说明模型和输入输出没问题如果连一个 batch 都拟合不了问题通常出在数据和模型结构上。5.2 排查学生网络与训练配置如果输入输出正确loss 却长时间不降需要检查学生网络。优先检查归一化层。BatchNorm 在训练时依赖 batch 统计量但一步生成模型在推断时可能以 batch size 1 运行统计量会漂移。建议使用 GroupNorm。另外学习率过大或过小都会让训练失衡。建议用模型默认学习率先跑 1000 步观察 loss 曲线变化。loss 陡降随后发散通常是学习率太大loss 平稳不变可能是学习率太小或梯度被目标影响。5.3 常见失败现象对照现象可能原因处理方式输出全部是灰色模糊图多对一映射学生学成均值改用渐进蒸馏减少单阶段压缩比高频噪声残留教师目标不清晰或损失只用了 MSE增加教师采样步数尝试 LPIPS多样性差生成图像雷同噪声输入分布太窄或训练 epoch 过长检查噪声范围早停评估多样性训练不稳定loss 震荡学习率过大或目标未 detach降低学习率确认 detach单图能拟合新图失败学生容量不足或噪声空间覆盖不够增加模型容量扩充训练噪声样本训练时如果发现 loss 一直降但采样结果很怪问题大概率出在教师目标和学生输入之间的对齐关系上而不是网络结构本身。6. 朴素蒸馏适合什么场景又在哪里力不从心把整个流程跑通之后我对朴素蒸馏的边界有了更清晰的判断。它非常适合两个场景一是教学和实验用来理解一步生成模型的训练逻辑二是快速构建一个可用的基线之后再决定是否引入更复杂模块。但在高分辨率、复杂文本条件、需要极高细节多样性的任务中它会显得有些吃力。原因是回归损失没有显式的分布对抗压力学生网络会把有限容量优先放在平均结构上牺牲极端细节和多峰多样性。6.1 适合的场景与前置条件适合场景包括小尺寸图像例如 32×32、64×64无条件和类别条件生成需要快速验证新想法没有大量精力调对抗网络和分布匹配模块。前置条件很简单一个质量够好的教师扩散模型一组数据一块可以训练小模型的 GPU。6.2 不适合的场景与原因高分辨率图像生成对细节非常敏感朴素蒸馏容易输出平滑、缺少纹理的结果。文本到图像生成需要模型理解复杂语义不使用 CFG 或任何引导手段语义对齐会变得困难。此时 DMD、GAN 蒸馏等方法的优势就体现出来了它们能通过额外损失或对抗判别器把学生输出推向真实细节分布。另外如果目标是追求当前 SOTA 性能朴素蒸馏通常不够。因为 SOTA 往往需要结合多种损失和采样技巧。但仍然可以把它作为一块结实的底座帮助判断后续每个复杂组件究竟带来了多少收益。6.3 我的建议先跑通最小流程再决定要不要加东西经过这个实验我最大的感受是一步生成模型的训练并不一定需要从 DMD、GAN 这些复杂方案起步。朴素蒸馏的每一步都可解释出现问题也更容易定位。当你已经能稳定训练一个学生网络从 32 步蒸馏到 1 步并且生成了像样的样本时你才算真正理解了“压缩采样轨迹”这件事。到那时再引入 GAN 或 DMD你会知道它们到底在解决什么问题而不是盲目堆模块。如果现在问我要如何训练一步生成模型我的答案不变先用教师蒸馏把最基础的路线跑通再在它上面思考下一步优化。这个方法听起来不够炫酷但它足够诚实也足够好用。