Stable Diffusion概要讲解

🌺系列文章推荐🌺

扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新)


SD模型原理:

  1. Stable Diffusion概要讲解
  2. Stable diffusion详细讲解
  3. Stable Diffusion的加噪和去噪详解
  4. Diffusion Model
  5. Stable Diffusion核心网络结构------VAE
  6. Stable Diffusion核心网络结构------CLIP Text Encoder
  7. Stable Diffusion核心网络结构------U-Net
  8. Stable Diffusion中U-Net的前世今生与核心知识
  9. SD模型性能测评
  10. Stable Diffusion经典应用场景
  11. SDXL的优化工作

微调方法原理:

  1. DreamBooth
  2. LoRA
  3. LORA及其变种介绍
  4. ControlNet
  5. ControlNet文章解读
  6. Textual Inversion 和 Embedding fine-tuning

Stable Diffusion模型分类

参考:关于Stable diffusion的各种模型,看这篇就可以了!

模型后缀

在Stable diffusion中,有两种比较常见的模型后缀,分别是 .ckpt/.pt 和 .safetensors 。

.ckpt

.ckpt 的全称是 checkpoint,中文翻译就是检查点,这是 TensorFlow 中用于保存模型参数的格式,通常与 .meta 文件一起使用,以便恢复训练过程。简单理解的话,.ckpt 模型就好比我们打游戏时,每通过一关时对这一关的一个"存档 "。.ckpt 保存了比较多的训练信息 ,比如模型的权重优化器的状态 还有一些Python代码。以便可以从这个点位重新开始训练。

.ckpt这种做法有两个问题:

  1. 可能包含恶意代码,因此不建议从未知或不信任的来源下载并加载.ckpt 模型文件;
  2. 模型的体积较大,一般真人版的单个模型的大小在7GB左右,动漫版的在2-5GB之间。

.pt、.pth 和.pkl

.pt 则是 PyTorch 保存模型参数的格式。TensorFlow 和 PyTorch都是比较出名的深度学习框架,只不过一个是Google发布的,另外一个是Facebook发布的。PyTorch 保存模型的格式除了.pt 之外,还有 .pth 和.pkl。.pt 和 .pth 之间并没有本质的差别,而.pkl 只是多了一步用Python的 pickle 模块进行序列化

.safetensors

.safetensors 模型则是 huggingface 推出的新的模型存储格式,专门为Stable Diffusion模型设计 。这种格式的文件只保存模型的权重,而不包含优化器状态或其他信息,这也就意味着它通常用于模型的最终版本,当我们只关心模型的性能,而不需要了解训练过程中的详细信息时,这种格式便是一个很好的选择。

优点

  1. 只保存模型的权重 ,没有代码,所以会更安全
  2. 由于保存的信息更少,所以它的体积也比 .ckpt 小,加载也更快,所以目前是比较推荐使用 .safetensors 的模型文件。

使用场景

如果想在某个SD模型上进行微调,那还是得用 .ckpt 模型;但如果你只关心出图结果,那么使用 .safetensors 模型会更好!

模型剪枝

下载模型的时候,可能还会看到两个版本,一个版本带 pruned,另外一个版本是带 pruned-emaonly,比如下面这个:

在深度学习模型训练的过程中,模型的参数(或称为"权重")会在每一次迭代(或训练步)中根据损失函数(loss function)对数据的拟合情况进行调整。当训练结束时,模型所拥有的权重就是经过所有训练样本反复教导后的最终状态。

这是因为大模型在训练的时候会保存两组不同类型的权重:

pruned 模型

pruned 的模型取的是最后一次的权重,这部分权重代表了模型在训练数据上学习到的知识,没有经过额外的平滑处理,直接反映了最后一次更新的结果

【保留了所有原始训练过程中的权重 (即未经 EMA 平滑的权重),并且还包含了 EMA(Exponential Moving Average)权重

pruned-emaonly 模型

只保留EMA权重。 最近几次迭代**【** 对整个训练过程中的所有迭代】的权重进行加权平均 ,加权平均即EMA(Exponential Moving Average),使用加权平均主要是减少短期波动的影响,这样得到的模型泛化性更好,也更稳定,也就是带 pruned-emaonly 的模型。

【EMA(Exponential Moving Average)权重是在训练过程中对模型参数进行滑动平均计算得到的。相比于原始权重,EMA 权重更平滑,能够提高推理时的模型稳定性,尤其是在深度学习生成模型中。】

具体计算方式

EMA 权重的更新公式如下:

原理说明

  • 由于 EMA 使用指数加权平均,EMA 权重在训练过程中对所有过去的权重都有影响。
  • 这种加权方式会对越早的权重赋予较低的权重 ,而对最近的权重赋予较高的权重 。随着训练迭代次数增多,EMA 权重主要受到近期权重的影响,但早期的权重也不会被完全舍弃。

由于带 pruned-emaonly 的模型体积更小,所以占用的显存(VRAM)也更少,适合用于直接出图;带 pruned 的模型体积更大,占用的显存也更多,更适合对其进行微调,如下图:

Stable Diffusion概要讲解

转录至:https://www.youtube.com/watch?v=F6ApJH5xuVo

相关知识

这里讲解Stable Diffusion的生成原理,应该说Stable Diffusion算法是AIGC浪潮崛起的基础,无数的AIGC工具都在此基础上衍生出来的,本文主要会分为三个部分

  1. 介绍Stable Diffusion的原理

什么是Diffusion? 如何稳定的控制扩散? 以及介绍CLIP和UNET的原理,理解VAE的编解码过程。

  1. 第二部分介绍模型训练的相关原理

包括机器是如何认识图片的以及如何训练模型

  1. 第三部分介绍大模型的微调技术

包括为什么要进行微调,微调要解决的问题以及常见的微调技术及其相关原理。

什么是扩散 Diffusion?CLIP、UNET、VAE的原理

首先,需要明确一下 Stable Diffusion 是一个算法,Stable 是稳定的,Diffusion 是扩散,所以Stable Diffusion就是一种稳定的扩散的算法。

在图像领域中,扩散算法 指的是通过一定规则去噪 或者加噪 的过程,其中去噪也称为反向扩散,加噪也称为正向扩散

拿提示语 a red flower 为例,当要生成一朵红色的花时,扩散过程会从最开始的灰色噪点块、逐渐去噪,直到最终清晰显示一朵红色的花。那么对于Stable Diffusion算法来说,这个扩散过程。怎么能够被稳定的控制住呢?

我们以文生图为例,展示一下Stable Diffusion的原理。这里大家可以把它抽象理解为一个大的函数 函数名称是Fsd,函数的参数是prompt,输入一段自然语义prompt经过一系列的函数运算和变化 最终输出一张图的过程。

这个过程中会经过CLIP、UNET、VAE三部分,拆解开来讲解一下。

CLIP

第一个部分,我们输入了一段prompt,这段prompt是如何起作用的呢?

实际上,让prompt能够起作用的是一个叫做CLIP的算法。CLIP是Text Encoder 算法的一种,Text Encoder 大家从字面意思也能够理解,是把文字转化为编码 的一种算法。他的主要功能是【CLIP模型根据训练中的学到的经验,感知这个prompts的事物有哪些特征】把自然语义prompt 转变为77x768维度的词特征向量Embedding 。比如我们输入了一个prompt cute girl,也就是可爱的女孩,CLIP算法在进行自然语义处理的时候,会根据之前被程序员调教的经验,大概感知到可爱的女孩可能具有哪些特征,比如她们可能有"大大圆圆的眼睛", 可能有"白皙的肌肤", 可能有"可爱的神态"等等,然后这些可能的特征,会被转化为77个等长的token词向量 ,其中每个词向量包含768个维度。这就是我们说的Embedding。

同样的一个关键词,为啥有的生成出来就这么好看,有的生成出来就很丑? 那是因为,当输入同一个prompt时,Text encoder过程是一样,也就是得到的词向量是一致的,但是后面的去噪算法依赖的模型不同,所以生成的效果千差万别。接下来我们就来讲一下Stable Diffusion里面,最重要的UNET算法。

UNET

UNET是一种基于词向量的扩散算法 。之前的CLIP算法,会根据输入的prompt输出对应机器能识别的词特征向量Embedding。 这个Embedding只需要把它粗浅的理解成是一个函数,【转换为】包含(Q、K、V)三个参数就好了,这三个参数会根据我们输入的对应的扩散步长,在UNET去噪算法的每一步发生作用 ,比如设置了去噪步长为20步,大家能看到这张图逐渐扩散生成的效果如下图。

这里需要注意的是,实际上UNET去噪的原理比这里描述的复杂很多,它其实并不是一步一步去噪就能得到对应效果的,如果仅仅是一步一步的去噪,效果往往很差,并不能精确得到描述文本的图片。

【不看这段也罢,说的是将prompt加入随机噪声中,并学习如何对加入的噪声进行预测,在生成图像时候,根据训练时候学习到的噪声预测方法进行去噪,看我后面系列文章的解读,会更清晰】所以这里稍微讲得深入一些介绍一下Classifier Free Guidance引导方法。为了保证我们prompt最终的精确性,在UNET分步去噪的时候,比如我设置的去噪步长为20,他会在每一步都生成一个有prompt特征引导的图,和一个没有prompt特征引导的图,然后把两者相减,就得到了每一个去噪步骤中,单纯由文字引导的特征信号,然后将这个特征信号放大很多倍,这就加强了文本引导。同时,在第N+1步去噪结束后,它还会用第N+1步去噪的信息特征减去第N部的特征然后继续放大很多倍,这样可以保证prompt 在每一步都能有足够的权重比参与运算,用通俗的大白话来说就是这个方法加强了prompt的权重,这个方法在Stable Diffusion web UI中被直译为提示词相关性,是一个很常用的参数,他的数值决定了生成的图与提示词的相关程度。

说完了文生图,也说一下图生图,使用图生图功能的时候,往往是给一张图,和一段prompt。比如还是设置扩散步数N=20,它的原理是先把我们提供的图进行逐步加噪,逐步提取图片信息,使它变成一张完全的噪点图;再让prompt起作用,结合上面的UNET算法逐步去噪,得到既有素材图片特征、也有prompt特征的最终效果图。

注意:上面写的UNET算法不是直接在图片上进行的,而是在"负空间"进行的。

VAE

最后简单来理解一下VAE编解码的过程,VAE全称变分自编码器,他是一个在编码层面先压缩后解压的算法

VAE的原理是这样的,假如要生成的图是512x512的VAE算法在一开始的时候,会把它压缩 到八分之一,变成64x64,然后在经过UNET算法 的时候,会把图形数据带在噪点图中,这个过程叫Encoder;然后等走完UNET算法后,我们就得到了一个带有所有图片特征的噪点图,此时VAE再进行Decoder的过程,把这张图解压并放大成512x512。

Stable Diffusion的原理大致的过程就是这样。

模型训练

本部分包括:之前的机器识别图片是怎么做的?微调是什么?模型文件类型分类

首先我们先来介绍一下机器是如何认识图片的 ,最初计算机视觉训练认识物体的时候,采用的是成对训练 的方法,通过**"图"+"对应描述",成对得进行训练** ,然后运用图像识别、自然语义处理与卷积神经网络等一系列技术,让计算机能够识别这个图形。

打个比方。如果要识别狗。会不停的给计算机喂成千上亿张狗的图,然后告诉他,你看这是狗,然后机器会不断归纳狗的特征重复学习上亿遍后,它就认识狗了。假设经过成对训练,机器已经能够识别万物了,但是这时候由于学习的图片风格都不同,生成的图片有可能不满足我们的期望。举个例子,假设程序员经过十年的努力后,让机器正确认识了小女孩的特征,不会出现三个眼睛两个嘴巴。

当我们输入一个提示 a cute girl的时候生成的是图A ,但是A的风格与我们想要的完全不同,比如我们想要的是图B这种风格,这时候程序员们就会不断调整函数中的各种算法和参数,使得产出的图形A无限接近于图像B,然后停止训练。

此时整个Fsd(x) 函数的所有调整的参数,就被保存为一个 ckpt 的文件,这个叫checkpoint的文件 就是程序员训练好的、可供调用的AI绘图大模型,他能保证我们每次生成的图都偏向于某种特征集合。

Stable Diffusion可用的模型有两类:

  1. 一种是safetensors 这种文件是用numpy 保存的,这意味着它们只包含张量数据,没有任何代码,加载 safetensors 文件会更加安全和快速;
  2. 第二种是 ckpt 这种文件是用pickle序列化过的,这意味着它们可能包含恶意代码,如果你不信任模型的来源,加载 ckpt 文件可能会带来安全风险。

因此,下载模型的时候建议优先下载 safetensors。

大模型的微调技术

首先我们要确定为什么要进行大模型微调呢? 上文说过Unet模型是SD中最重要的模型网络,内部包含了上亿个参数,要训练这样一个超大的模型,大概需要15亿个图像文本,使用256张A100显卡 跑15万个GPU小时,大概成本是60万美元。一般的设计师也不能像程序员那样,动不动就调函数参数来训练模型,那怎么办呢?

因为UNET模型的泛化性极强,泛化性极强就会带来风格化不足,就可能无法满足特定风格的需要,所以往往会对UNET大模型进行微调,让它更符合需要的使用场景,那么接下来就要介绍一下模型微调技术了。所有的大模型微调技术都是为了要解决两个问题

  1. 如何减少训练参数,提高训练效率和生成图像的质量
  2. 如何解决模型泛化性差的问题

泛化性指的是模型对新数据的适应能力,他具体会表现为过拟合和欠拟合两种:

  1. 过拟合 (Overfitting)是指微调模型对原始模型的语义理解程度发生了变化,整体训练出现语义漂移的现象。比如有一只猫,名字叫 jojo 我拍了他的几十张照片,一直用a jojo cat这个名字来强化模型对这只猫的认知,等以后我输入a jojo cat的时候,确实能出现我想要的这只猫,但是我输入a cat的时候,出现的画面却很怪异,这就说明cat这个词被污染了,出现了过度拟合的现象。
  2. 欠拟合(Underfitting)是指无法识别这个特征,比如它就完全识别不出jojo和cat的关系,这往往是训练样本量不足,或者训练样本质量较差等因素导致,属于训练无效。

那么我们来看下常见的大模型微调技术都有哪些,以及他们是如何解决上面两个问题的。

常见的大模型微调技术大概有这四种 Dreambooth、LoRA、Embedding、Hypernetwork【还有其他的也很流行,只不过次视频中只涉及到了这四种】。

Dreambooth

Dreambooth要求我们在训练过程中**"特征词+类别"和"类别"要成对出现**,比如之前提到的,如果想训练这只叫JOJO的猫的模型,又不能让它跟"猫"这个词过度拟合,可以采用的这样的输入方法,这样的话AI就能识别到,JOJO cat is a cat named JOJO。

Dreambooth是google在2022年8月提出的一种新的图像算法。这种方法可以完整的获得你想要的模型的视觉特征,它的提出既不是为了训练人物也不是为了训练画风 ,而是为了能使用少量训练图像,完美的还原细节特征

在上面这张图上,大家注意原图闹钟右侧有一个"黄色的3", Dreambooth将他完整还原了,这说明使用Dreambooth确实可以完整的获得你想要的模型的视觉特征。

所以当时发布的时候还是很牛的,Dreambooth虽然叫大模型微调技术,但是实际上它调得一点都不微,他基本把UNET算法每一层的内部参数都调了一遍

就是图上红色的部分。

优点:可以将视觉特征完美融入。

缺点:需要调整UNet所有内部参数,训练时间长,模型体积也很大 。【"**所有内部参数"**并不准确,看后面系列文章的详细解读】

LoRA

LoRA中文名叫做大模型的低秩适配器,如果要讲清楚LoRA的原理,还是得回到之前的UNET算法,如下图就是Stable Diffusion核心算法UNET的工作原理。

其中UNET的神经网络运算结构是由很多很多的计算层叠加组成的,它内部的每一个计算层,大家可以把它看成是一个一个的小的函数,前一个函数的输出等于后一个函数的输入,随着层数的叠加整个模型就能够理解输入的数据的特征了,前面说到的Dreambooth相当于把unet里的每一层函数都要进行微调,所以我们说它计算量大训练时间长,模型体积大。

但是LoRA就不同了,LoRA的目的呢是减少模型的训练参数,提升模型的训练效率,因此LoRA建议冻结预训练模型的权重 ,并将训练参数注入到Transformer函数架构的每个层中【"每个层",其实也不是很准确, 看后面系列文章的详细解读**】**。

它的优点呢就是不破坏原有的模型即插即用,像图中红色部分所显示那样,正因为LoRA它的插入层较少,相较于Dreambooth,可以把训练参数降低1,000倍,而且对CPU的要求呢也会下降3倍,所以训练出来的LoRA模型就会非常小,一般只有几十M,而一个大模型呢往往有几个g,甚至十几个g。

通俗点来说,可以把LoRA理解成在原有的大模型上添加了一个滤镜,让这个底下的大模型往我们期望的效果走,比方说呢当我们的prompt不变的情况下,在一个偏动漫的底层模型revAnimated上

加了一个盲盒效果的LoRA,就相当于是给这个底层模型上了一个滤镜,让整个底层模型出来的效果往盲盒的方向上去靠。

Embedding

Embedding也叫Text inversion,它反映的是一个prompt与对应向量的映射记录关系的算法,可以用来训练特定的人或者是物体,前面我讲我们的prompt是如何起作用的时候,用到的下面这张图。

CLIP模型是text encoder算法的一种,text encoder主要是把自然语义prompt转变为词特征向量Embedding ,所以可以针对从prompt到向量这个映射过程进行训练,去修改它们之间的映射记录关系,从而达到训练特定的人或者物体的效果。由于它生成的是一套纯文字的映射记录,所以体积非常小,一般呢只有几百k。

举个实际的例子,比如说下面这个人物,是游戏守望先锋里的Dva,如果要通过描述她的特征,去把她完整的描绘出来,可能就需要几千个prompt tag才行,那如果我们每次想生成Dva的时候都要再输入一次这么多的prompt,肯定是不科学的,所以这个时候呢,可以把这一串的tag打包映射成一个新的词汇 叫做OW_Dva【让Embeeding模型理解这个词对应的向量应该有什么样的特征】。由于这个词呢是自创的,在CLIP映射集合里是找不到对应的映射关系的,所以CLIP会默认给他创建一个新的映射空间,经过一系列的训练之后,后续就可以通过输入一个简单的词汇,来完成一系列tag的打包效果。

hypernetwork

hypernetwork是一种即将要被Lora淘汰了的技术,大概讲一下它的原理。

我们先来总结一下三种技术的原理和在UNET中的使用范围

其中Dreambooth调整了整个UNET的函数和参数,所以它体积最大适用范围最全,但是训练难度和训练耗时和成本也都最大;

LoRA 只是将训练参数注入到了部分的Transformer 函数中,所以它不改变原来的模型即插直用,模型大小也可控,

hypernetwork从图上可以看出,它是新建了一个单独的神经网络模型,插入到原来的UNET模型的中间层,在训练过程中啊他会冻结所有的参数,只训练插入的部分,从而使输出图像与输入指令之间产生关联关系,同时呢只改变原来模型的一小块内容。

从这个原理的描述上大家应该就能发现 Hypernetwork 这种方法更适合用于训练某种画风,比如说像素画之类的,当然了也不是说它不能训练别的,它也是可以训练人物的,就是比LoRA呢麻烦一点,总之呢它在国内几乎是一个要被LoRA淘汰的技术了,关于hypernetwork的相关paper也都是2022年以前的了,所以我们也就把它当做一个滤镜来理解就好了。

那以上呢就是对整个Stable Diffusion算法以及相关内容的简单介绍,对算法原理和数学运算进行了一定的简化,内容也不可能面面俱到。

相关推荐
wei_shuo1 天前
GpuGeek 实操指南:So-VITS-SVC 语音合成与 Stable Diffusion 文生图双模型搭建,融合即梦 AI 的深度实践
人工智能·stable diffusion·gpu算力·gpuseek
这是一个懒人3 天前
Stable Diffusion WebUI 插件大全:功能详解与下载地址
stable diffusion
浪淘沙jkp3 天前
AI大模型学习十八、利用Dify+deepseekR1 +本地部署Stable Diffusion搭建 AI 图片生成应用
人工智能·stable diffusion·agent·dify·ollama·deepseek
Icoolkj4 天前
深入了解 Stable Diffusion:AI 图像生成的奥秘
人工智能·stable diffusion
这是一个懒人5 天前
mac 快速安装stable diffusion webui
macos·stable diffusion
璇转的鱼5 天前
Stable Diffusion进阶之Controlnet插件使用
人工智能·ai作画·stable diffusion·aigc·ai绘画
AloneCat20126 天前
stable Diffusion模型结构
stable diffusion
西西弗Sisyphus6 天前
Stable Diffusion XL 文生图
stable diffusion
霍志杰7 天前
stable-diffusion windows本地部署
windows·stable diffusion
昨日之日20067 天前
ACE-Step - 20秒生成4分钟完整歌曲,音乐界的Stable Diffusion,支持50系显卡 本地一键整合包下载
计算机视觉·stable diffusion·音视频