自学内容网 自学内容网

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的编解码过程。

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

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

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

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

什么是扩散 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算法以及相关内容的简单介绍,对算法原理和数学运算进行了一定的简化,内容也不可能面面俱到。


原文地址:https://blog.csdn.net/qq_42410605/article/details/143059982

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!