Stable Diffusion算法、结构全流程概述

本文全面介绍了Stable Diffusion算法,包括其基于latent扩散模型的整体流程,采样器如DDPM和DDIM的工作原理,以及补充概念如CFG Scale和负面提示词。此外,文章详细阐述了微调方法如LoRA和ControlNet,并列举了多个SD常用模型和插件,如VAE、DreamBooth和多种风格的插件,展示了SD在AI绘画可控性方面的进展。

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

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、其他采样器介绍

其他采样器使用的介绍链接

  1. 如果只是想得到一些较为简单的结果,选用欧拉(Eular)或者Heun,并可适当减少Heun的步骤数以减少时间
  2. 对于侧重于速度、融合、新颖且质量不错的结果,建议选择:
    DPM++ 2M Karras, Step Range:20-30
    UniPc, Step Range: 20-30
  3. 期望得到高质量的图像,且不关心图像是否收敛:
    DPM ++ SDE Karras, Step Range:8-12
    DDIM, Step Range:10-15
  4. 如果期望得到稳定、可重现的图像,避免采用任何祖先采样器。
    名称中带有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为什么能够生成不同形状的图片

  1. 首先原始的Unet支持一部分可变尺寸输入,如下图所示
    在这里插入图片描述
  2. 其次StableDiffusionWebUI中会对图片进行像素范围限制,每8个像素生成的图
### Stable Diffusion算法实现 Stable Diffusion是一种基于扩散模型的生成式人工智能技术,其核心在于通过逐步去噪过程来生成高质量图像。该方法采用预训练网络,在推理阶段执行反向扩散过程以创建新样本。 #### 扩散过程概述 在训练期间,扩散模型会逐渐向数据中添加高斯噪声,并学习如何逆转这一加噪流程。具体来说,给定初始干净图片$x_0$,经过$t$步迭代后变为含噪版本$x_t$: \[ q(x_{t}|x_{t-1})=N(\sqrt{1-\beta_t}x_{t-1},\beta_tE) \] 其中$\beta_t$表示每一步增加的方差大小[^1]。 #### 反向生成机制 为了从纯噪音恢复原始信号,需定义条件概率分布$p_\theta (x_{t-1}|x_t)$并对其进行优化。实践中常用U-Net架构作为预测器,估计当前时刻下的均值项$\mu_\theta(x_t,t)$: \[ p_\theta (x_{t-1}|x_t)= N (\mu_\theta(x_t,t),Σ_tI ) \] 此过程中涉及到的时间步数$t$通常设定为数百至数千不等,取决于应用场景需求。 #### 训练目标函数 整个系统的训练旨在最小化变分下界(VLB),即重构误差加上KL散度惩罚项: \[ L_{VLB}=E_q[\log {p_\theta}(x_T)]+\sum^{T}_{t=2}\left[E_q[D_{KL}[q(x_{t−1}|x_t,x_0)||p_\theta(x_{t−1}|x_t)]]\right]+E_q[\log(q(x_0|x_1)/p_\theta(x_0|x_1))] \] 简化形式常用于实际编程实现中,例如DDPM提出的$替代方案。 ```python import torch.nn as nn from torchvision import transforms class UNet(nn.Module): def __init__(self, in_channels, out_channels): super().__init__() self.encoder = Encoder(in_channels) self.decoder = Decoder(out_channels) def forward(self, x, timesteps): encoded_features = self.encoder(x) output = self.decoder(encoded_features, timesteps) return output def train_step(model, optimizer, criterion, batch_data, noise_schedule): model.train() noisy_images, targets = add_noise(batch_data, noise_schedule) predictions = model(noisy_images, get_time_embedding(timesteps)) loss = criterion(predictions, targets) optimizer.zero_grad() loss.backward() optimizer.step() return loss.item() ``` 上述代码片段展示了UNet结构及其对应的单次训练更新逻辑。注意这里省略了一些细节处理部分,比如时间嵌入层的设计以及具体的编码解码模块构建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值