StableDiffusionPipeline原理解读——引导尺度是如何调整噪声残差的
引导尺度(Guidance Scale)在分类器自由引导(Classifier-Free Guidance, CFG)中起着关键作用,用于调整噪声残差,从而在生成过程中平衡无条件生成和有条件生成的影响。
背景知识
在扩散模型中,生成过程是通过逐步去除噪声来实现的。在每个时间步 t,模型需要预测当前潜变量中的噪声成分。这个噪声成分被称为噪声残差(noise residual)。通过逐步去除噪声,模型最终生成高质量的图像。
分类器自由引导(CFG)是一种技术,允许模型在生成过程中同时考虑无条件生成和有条件生成。也就是说,模型会生成两个噪声预测:
-
无条件噪声预测(Unconditional Noise Prediction, ϵuncond):不依赖于任何条件信息的噪声预测。
-
有条件噪声预测(Conditional Noise Prediction, ϵcond):依赖于条件信息(如文本提示)的噪声预测。
引导尺度的作用
引导尺度 guidance_scale 用于调整条件信息的影响程度。具体来说,引导尺度通过以下公式调整噪声残差:
公式解析
-
无条件噪声预测 ϵuncond:
这是模型在不考虑任何条件信息的情况下预测的噪声残差。 -
有条件噪声预测 ϵcond:
这是模型在考虑条件信息(如文本提示)的情况下预测的噪声残差。 -
引导尺度 guidance_scale:
这是一个标量,表示条件信息的影响程度。值越大,生成的图像越接近条件信息(如文本提示)。 -
调整后的噪声残差 ϵfinal:
这是最终用于生成过程的噪声残差,结合了无条件和有条件噪声预测。
具体步骤
这里的latent_model_input参数是包含2份潜变量的,所以在unet模型中会生成一个无条件的噪声残差和一个有条件的噪声残差,通过一次调用 UNet 模型,同时生成两份噪声预测
noise_pred = self.unet(latent_model_input,t,encoder_hidden_states=prompt_embeds,timestep_cond=timestep_cond,cross_attention_kwargs=self.cross_attention_kwargs,added_cond_kwargs=added_cond_kwargs,return_dict=False,)[0]
-
分割噪声预测:
noise_pred_uncond, noise_pred_text = noise_pred.chunk(2)
-
将
noise_pred
分成两部分,分别对应无条件噪声预测和有条件噪声预测。
-
-
计算条件信息的影响:
noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_text - noise_pred_uncond)
-
计算有条件噪声预测与无条件噪声预测之间的差异 ϵcond−ϵuncond。
-
将这个差异乘以引导尺度 guidance_scale。
-
将调整后的差异加到无条件噪声预测上,得到最终的噪声残差 ϵfinal。
-
作用
通过这种方式,引导尺度 guidance_scale 调整了条件信息的影响程度:
-
当 guidance_scale=1 时:
-
ϵfinal=ϵuncond+(ϵcond−ϵuncond)=ϵcond。
-
最终的噪声残差完全等于有条件噪声预测,生成的图像完全依赖于条件信息。
-
-
当 guidance_scale=0 时:
-
ϵfinal=ϵuncond。
-
最终的噪声残差完全等于无条件噪声预测,生成的图像不依赖于条件信息。
-
-
当 guidance_scale>1 时:
-
条件信息的影响被放大,生成的图像更接近条件信息。
-
-
当 0<guidance_scale<1 时:
-
条件信息的影响被减弱,生成的图像在无条件和有条件之间进行平衡。
-