Stable Diffusion能力强、功能多、插件广,本文拟概述SD的全流程,方便梳理算法各结构的关系
SD发展的重点论文
- Denoising Diffusion Probabilistic Models(首次提出去噪扩散模型DDPM)
- Diffusion Models Beat GANs on Image Synthesis(OpenAI 改进UNet,DM超越GAN,Classifier Guidance)
- High-Resolution Image Synthesis with Latent Diffusion Models(提出隐变量扩散模型LDM,是SD的第一版)
- CLASSIFIER-FREE DIFFUSION GUIDANCE(Classifier-free Guidance)
- Scalable Diffusion Models with Transformers(一种基于Transformer架构的新型扩散模型DiT)
SD原理
SD整体流程
SD是一个基于latent扩散模型的文本生成图像模型。SD的核心来源于Latent Diffusion这个工作,常规的扩散模型是基于像素的生成模型,而Latent Diffusion是基于隐变量的生成模型。它先采用一个autoencoder将图像压缩到latent空间,然后用扩散模型来生成图像的latents,最后送入autoencoder的decoder模块就可以得到生成的图像。
基于latent的扩散模型的优势在于计算效率更高效,因为图像的latent空间要比图像pixel空间要小,这也是SD的核心优势。文生图模型往往参数量比较大,基于pixel的方法往往限于算力只生成64x64大小的图像,比如OpenAI的DALL-E2和谷歌的Imagen,然后再通过超分辨模型将图像分辨率提升至256x256和1024x1024;而基于latent的SD是在latent空间操作的,它可以直接生成256x256和512x512甚至更高分辨率的图像。
SD三大流程为
- 前向扩散过程:生成噪声图片训练集
- 后向训练过程:去噪训练DDPM等
- 后向推理过程:推理采样器生成AI图像,如DDIM、PLMS、Euler A、DPM++和UniPC等
SD模型的主体结构如下图所示,主要包括三个模型:
- Autoencoder:encoder将图像压缩到latent空间,而decoder将latent解码为图像;常用变分自编码器VAE
- CLIP text encoder:提取输入text的text embeddings,通过cross attention方式送入扩散模型中作为condition;
- UNet 或者 DiT:扩散模型的主体,用来实现文本引导下的latent生成。2024年初推出的Sora和SD3均使用DiT扩散模型。此外扩散模型还包含采样器等部件
采样器:采样器类型和采样步数(去噪步数)相匹配
1、DDPM:必须掌握的前向扩散过程与反向采样过程
DDPM参考链接
扩散模型包含两个过程:前向扩散过程和反向生成过程,前向扩散过程是对一张图像逐渐添加高斯噪音直至变成随机噪音,而反向生成过程是去噪音过程,我们将从一个随机噪音开始逐渐去噪音直至生成一张图像,这也是我们要求解或者训练的部分。
训练过程学习的是每一步的噪声预测函数,采样过程则从标准高斯分布开始采样,然后减去预测噪声,不断迭代生成新样本。
2、DDIM:改进DDPM的采样过程
DDPM与DDIM源码解读
在DDPM的实现中,一般会有一个类专门维护扩散模型的α这个加噪变量。我们这里把这个类称为DDPMScheduler。此外,DDPM会用到一个U-Net神经网络unet,用于计算去噪过程中图像应该去除的噪声eps。准备好这两个变量后,就可以用randn()从标准正态分布中采样一个纯噪声图像xt。它会被逐渐去噪,最终变成一幅图片。去噪过程中,时刻t会从总时刻T遍历至1(总时刻T一般取1000)。在每一轮去噪步骤中,U-Net会根据这一时刻的图像xt和当前时间戳t估计出此刻应去除的噪声eps,根据xt和eps就能知道下一步图像的均值。除了均值,我们还要获取下一步图像的方差,这一般可以从DDPM调度类中直接获取。有了下一步图像的均值和方差,我们根据DDPM的公式,就能采样出下一步的图像。反复执行去噪循环,xt会从纯噪声图像变成一幅有意义的图像。
DDIM对DDPM的采样过程做了两点改进:1) 去噪的有效步数可以少于T步,由另一个变量ddim_steps决定;2) 采样的方差大小可以由eta决定。
3、其他采样器介绍
- 如果只是想得到一些较为简单的结果,选用欧拉(Eular)或者Heun,并可适当减少Heun的步骤数以减少时间
- 对于侧重于速度、融合、新颖且质量不错的结果,建议选择:
DPM++ 2M Karras, Step Range:20-30
UniPc, Step Range: 20-30- 期望得到高质量的图像,且不关心图像是否收敛:
DPM ++ SDE Karras, Step Range:8-12
DDIM, Step Range:10-15- 如果期望得到稳定、可重现的图像,避免采用任何祖先采样器。
名称中带有a标识的采样器表示这一类采样器是祖先采样器。这一类采样器在每个采样步骤中都会向图像添加噪声,采样结果具有一定的随机性(如Euler a、DPM2 a、DPM++ 2S a、DPM++ 2S a Karras)。
补充概念
补充1:CFG Scale
理解:CFG Scale指的是classifier-free guidance,被称为提示词强度,相反的就是classifier guidance。如果CFG Scale越大,输出将更符合输入提示和/或输入图像,但会失真。另一方面,CFG Scale 值越低,越有可能偏离提示或输入图像,但质量也越好。
原理:Classifier-Free Guidance的核心是通过一个隐式分类器来替代显示分类器,且根据贝叶斯公式,分类器的梯度可以用条件生成概率和无条件生成概率表示。训练时,Classifier-Free Guidance需要训练两个模型,一个是无条件生成模型,另一个是条件生成模型。推理时,最终结果可以由条件生成和无条件生成的线性外推获得,生成效果可以用引导系数cfg scale调节,控制生成样本的逼真性和多样性的平衡。
补充2:负面提示词的原理
对于不想要的内容,请将其置于负面提示中,而不是在正向提示词中否定!!!
在Stable Diffusion中,负面提示词(Negative Prompt)是一种强大的工具,它能够指导模型生成符合用户需求的图像。其工作原理主要基于劫持无条件采样。
首先,让我们了解一下什么是无条件采样。在Stable Diffusion中,算法首先通过文本提示进行有条件采样,对图像进行轻微去噪。然后,采样器通过无条件采样对同一图像进行轻微去噪。这个过程是无引导的,就像不使用文本提示一样。这意味着无条件采样是独立于文本提示的,不受其影响。
然而,当使用Negative Prompt时,情况发生了变化。Negative Prompt的作用是告诉模型你不想要什么样的风格或元素。通过劫持无条件采样,Negative Prompt能够引导扩散远离它。这意味着在扩散过程中,模型会朝着正面提示的方向迈出一步,然后远离负面提示。这种原理使得Stable Diffusion能够实现高质量的图像生成,同时保持对文本提示的响应。
补充3:StableDiffusion为什么能够生成不同形状的图片
- 首先原始的Unet支持一部分可变尺寸输入,如下图所示
- 其次StableDiffusionWebUI中会对图片进行像素范围限制,每8个像素生成的图像都不同&