Classifier guidance与Classifier free diffusion的简单理解

文章介绍了两种方法来控制预训练的diffusion模型生成图片:一是利用分类器进行监督学习,二是通过添加文本prompt的condition。方法一涉及分类器梯度的应用,而方法二则展示了如何通过condition前后差异影响生成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:Classifier Guidance 和 Classifier Free Guidance,一堆公式不如两行代码 - 蓟梗的文章 - 知乎
https://zhuanlan.zhihu.com/p/660518657
Classifier Guidance和Classifier-free Guidance 总结 - 走遍山水路的文章 - 知乎
https://zhuanlan.zhihu.com/p/675387002


场景:首先,有一个训好的diffusion模型,可以从高斯分布的噪声生成图片。
现在,你希望对生成的图片加以控制,让它生成你想要的图片。

方法一:使用一个训练好的分类器来监督,辅助diffusion生成

eg. 在diffusion的每个时间步,将生成好的图像放进分类器分类,然后将分类损失对于噪声图片的梯度与生成的图片相加,使得生成的图片向正确图片迈进

方法二:使用condition前后的差值作为辅助

eg. condition是指文本prompt。将输入空文本时的去噪输出+scale*(输入prompt后的输出-空文本去噪输出),即可得到输出
注意,因为原本diffusion是不接收文本输入的,现在要加上文本condition,自然需要重新训练
另外,文本输入的编码器是clip encoder


简单理解就是上面这样,接下来看看推导:

方法一

在这里插入图片描述
如图所示,y是类别,比如猫、狗之类,xtx_txt是生成的图像。现在我们要在已知y的情况下得到图像,也就是左上角最原始的式子

  1. 第一行,通过贝叶斯公式将概率公式转化
  2. 第二行,通过log函数的公式将乘除拆分为加减
  3. 第三行,第一部分是p(x)p(x)p(x),也就是图像的概率(全概率),也就是直接用diffussion推导得到的下个时间步的图像;第二部分是已知图像,y的概率,可以看作一个分类器,将生成的图像分类,然后求对应类别y的梯度;第三部分,本来还应该一个东西,但由于y固定,所以p(y)p(y)p(y)也是确定的,不会有梯度,因此省略。

综上来说,最终的结果就是当前生成的图像+分类器的梯度

方法二

我们已经得到了condition下的图像概率:
在这里插入图片描述
上面把分类器的公式进行了进一步推导,到最后变成了套娃,“要求我自己时,还需要我自己参与”
有条件的输出 = 无条件时的输出+γ\gammaγ(有条件的输出-无条件的输出)
无条件的输出相当于diffusion的一张正常图片,右边这部分相当于加上condition的特征

<think>嗯,用户现在在找关于Classifier-Free Diffusion Guidance的实现代码示例。首先,我需要确认用户的需求是什么。Classifier-Free Diffusion Guidance是一种在扩散模型中常用的技术,用于提高生成样本的质量和条件控制。用户可能已经了解了一些基础概念,现在需要具体的代码示例来参考。 接下来,我应该回忆一下相关的资源和引用。用户提供的引用中,引用[1]提到了motion-diffusion-model的PyTorch实现,引用[2]是DiT(Diffusion with Transformers)的代码教程,引用[3]则涉及蒸馏和ProgressiveDistillation。虽然这些引用中没有直接提到Classifier-Free Guidance,但可能相关的代码库中会有实现。 首先,我应该考虑常见的扩散模型代码库,比如Hugging Face的Diffusers库,或者OpenAI的代码。Classifier-Free Diffusion Guidance通常通过在条件嵌入和无条件嵌入之间插值来实现。具体来说,在训练时,随机丢弃条件信息,使模型同时学习有条件和无条件的生成。在推理时,通过调整guidance_scale参数来控制条件的影响。 然后,我需要检查Diffusers库是否有相关实现。例如,在Stable Diffusion或DDPM中,通常会使用guidance_scale。用户可能需要一个简单的代码示例,展示如何在采样过程中应用Classifier-Free Guidance。 另外,用户可能对PyTorch实现更感兴趣,因为引用中提到的项目如motion-diffusion-model和DiT都是基于PyTorch的。需要确保代码示例使用正确的框架,并符合常见的实践方式。 还需要注意代码的正确性,比如在计算噪声预测时,如何组合有条件和无条件的预测。通常的做法是计算两个预测值,然后进行加权组合,公式类似:noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_cond - noise_pred_uncond)。 同时,应该提醒用户安装必要的依赖库,比如diffusers和transformers,并可能提供训练和推理的代码片段。如果用户需要更详细的实现,可能需要参考具体的GitHub仓库,比如lucidrains的denoising-diffusion-pytorch,或者Hugging Face的文档。 最后,生成相关问题,帮助用户进一步了解如何调整参数、优化性能,以及其他方法的比较。这有助于用户全面理解Classifier-Free Guidance的应用和实现细节。</think>### Classifier-Free Diffusion Guidance 代码实现示例 Classifier-Free Diffusion Guidance 的核心是通过调节条件嵌入和无条件嵌入的加权差值来控制生成过程[^3]。以下是基于 PyTorch 的实现框架: #### 1. 关键代码逻辑 ```python # 条件无条件嵌入的插值计算 def guided_noise_pred( model, x, t, cond_input, guidance_scale=7.5, unconditional_prob=0.1 ): # 生成无条件嵌入(随机丢弃条件) if random.random() < unconditional_prob: cond_input = None # 模型预测噪声 noise_pred = model(x, t, cond_input) # 分离条件无条件预测(推理时) if cond_input is not None and guidance_scale > 1: # 无条件分支 uncond_pred = model(x, t, None) # 线性插值 noise_pred = uncond_pred + guidance_scale * (noise_pred - uncond_pred) return noise_pred ``` #### 2. 完整训练流程(简略版) ```python from diffusers import DDPMScheduler, UNet2DConditionModel model = UNet2DConditionModel(...) scheduler = DDPMScheduler(...) for batch in dataloader: clean_images, conditions = batch noise = torch.randn_like(clean_images) timesteps = torch.randint(0, 1000, (clean_images.shape[0],)) # 应用Classifier-Free训练策略:随机丢弃条件 mask = torch.rand(len(conditions)) < 0.1 # 10%概率丢弃 conditions[mask] = None noisy_images = scheduler.add_noise(clean_images, noise, timesteps) noise_pred = model(noisy_images, timesteps, conditions) loss = F.mse_loss(noise_pred, noise) loss.backward() optimizer.step() ``` #### 3. 依赖安装 ```bash pip install diffusers transformers torch ``` #### 扩展实现参考 - **Hugging Face Diffusers 库**:提供官方实现的 `StableDiffusionPipeline`,通过 `guidance_scale` 参数直接控制[^2] - **lucidrains/denoising-diffusion-pytorch**:包含基础条件扩散模型实现(GitHub) - **Google Resarch 发布的 Imagen**:使用Classifier-Free Guidance进行文本到图像生成
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值