Stable Diffusion 是如何运行的(二)

简介: Stable Diffusion 是如何运行的(二)

{条件控制|Conditioning}

如果没有文本提示,{稳定扩散|Stable Diffusion}就不是一个文本到图像的模型。你将只会得到一张猫或狗的图片,没有任何控制它的方法。

这就是{条件控制|Conditioning}的作用。

条件控制的目的是引导噪声预测器,使得在从图像中减去预测的噪声后,我们可以得到我们想要的结果。


文本调节(文本到图像)

下面是一个概述,说明了文本提示是如何被处理并输入到噪声预测器中的。

  • 首先,分词器将提示中的每个单词转换为一个称为标记(token)的数字。
  • 然后,每个标记被转换为一个包含768个值的向量,称为{嵌入|embedding}。这些嵌入向量接着被文本转换器处理,并准备好供噪声预测器使用。

image.png


Tokenizer

image.png

文本提示首先通过CLIP分词器进行分词。CLIPOpenAI开发的一个深度学习模型,用于生成任何图像的文本描述。{稳定扩散|Stable Diffusion}v1 使用了CLIP的分词器。

分词是计算机理解单词的方式。我们人类可以读取单词,但计算机只能读取数字。这就是为什么文本提示中的单词首先被转换为数字。

分词器只能对其在训练期间见过的单词进行分词。例如,CLIP模型中有“dream”“beach”,但没有“dreambeach”。分词器会将单词“dreambeach”分割为两个标记“dream”“beach”。因此,一个单词并不总是对应一个标记!

另一个需要注意的细节是空格字符也是标记的一部分。在上述情况中,短语“dream beach”产生了两个标记“dream”“[space]beach”。这些标记与“dreambeach”产生的标记“dream”“beach”(beach之前没有空格)不同。

{稳定扩散|Stable Diffusion}模型限制了文本提示中使用的标记数量为75个。


{嵌入|embedding}

image.png

{稳定扩散|Stable Diffusion}v1 使用了OpenAIViT-L/14 CLIP模型。{嵌入|embedding}是一个包含768个值的向量。每个标记都有其自己独特的{嵌入|embedding}向量。{嵌入|embedding}是由CLIP模型固定的,在训练过程中学习得到。

为什么我们需要{嵌入|embedding}?这是因为某些单词彼此之间密切相关。我们希望利用这些信息。例如,man(男人)、gentleman(绅士)和guy(家伙)的嵌入几乎相同,因为它们可以互换使用。


将嵌入投喂给噪声预测器

image.png

在输入嵌入向量到噪声预测器之前,嵌入需要经过文本变换器的进一步处理。这个变换器就像一个通用的适配器,用于条件控制。在这种情况下,它的输入是文本嵌入向量,但它也可以是其他东西,比如类别标签、图像和深度图。变换器不仅进一步处理数据,还提供了一种包含不同条件模态的机制。


{交叉注意|Cross-attention}

文本变换器的输出在整个U-Net中被噪声预测器多次使用。U-Net通过{交叉注意|Cross-attention} 机制来利用它。这就是prompt与图像相遇的地方。

以提示“一个有蓝眼睛的男人”为例。{稳定扩散|Stable Diffusion}将“蓝”和“眼睛”这两个词进行配对(在提示内部进行自我注意),这样它就生成了一个有蓝眼睛的男人,而不是一个穿着蓝色衬衫的男人。然后,它利用这个信息来引导{逆向扩散|Reverse Diffusion}朝着包含蓝眼睛的图像方向进行。(prompt和图像之间的交叉注意)


{稳定扩散|Stable Diffusion}优化处理

到目前为止,我们对{前向扩散|Forward Diffusion}中的训练过程以及如何根据文本输入在{逆向扩散|Reverse Diffusion}过程中生成图像有了更好的理解。但这只是个开始,更有趣的部分是我们如何根据我们的需求调整这个过程,以产生更高质量的图像。研究人员和爱好者提出了许多不同的技术来改善稳定扩散的结果。

这些方法中的大多数是在已经训练好的稳定扩散模型的基础上进行的。训练好的模型意味着它已经看到并学会了如何使用其模型权重(指导模型工作的数字)生成图像。

优化{文本编码器|Text Encoder}

其中一组技术是针对{稳定扩散|Stable Diffusion}{文本编码器|Text Encoder}部分的,包括文本反演DreamArtist

  • 文本反演通过为你想要生成的每个新概念或风格学习一个新的关键词嵌入来工作。你可以将文本反演视为告诉翻译器 “记住这个新对象叫做'猫狗',下次我说'猫狗'的时候,你应该告诉艺术家画这个对象”
  • DreamArtist通过学习正面和负面关键词来描述参考图像。这就像是告诉翻译器“这是一张图片,记住它的样子,并称呼它为你认为最能描述它的名字”。

优化U-Net(噪声预测器部分)

另一组技术主要针对U-Net,即图像生成组件,包括DreamBoothLoRAHypernetworks

  • DreamBooth通过使用新图像数据集对扩散模型进行微调,直到它能理解新概念。
  • LoRA通过在交叉注意模型中添加一小组额外的权重,并仅训练这些额外的权重。
  • Hypernetworks使用一个辅助网络来预测新的权重,并利用{噪声预测器|Noise Predictor}中的交叉注意部分插入新的样式。

这些方法基本上是告诉艺术家学习一些新的绘画方式,要么是自己学习(DreamBooth),要么是调整现有的样式(LoRA),要么是通过外部帮助(Hypernetworks)。DreamBooth非常有效,但需要更多的存储空间,而LoRAHypernetworks的训练相对较快,因为它们不需要训练整个稳定扩散模型。


控制噪声来改善生成图像

另一个技术是通过控制噪声来改善生成图像的方法,包括DALL-E 2Diffusion Dallying

  • DALL-E 2是对原始的DALL-E模型的改进,通过对噪声进行控制来生成更具指导性的图像。
  • Diffusion Dallying则是在{逆向扩散|Reverse Diffusion}过程中加入额外的迭代步骤,使模型有更多的时间去学习并生成更高质量的图像。

这些方法通过更好地控制噪声的引入和图像生成的迭代过程来改善稳定扩散的结果。

除了上述方法外,还有其他一些技术可用于改进稳定扩散的结果,例如使用更大的模型,优化训练策略,调整超参数等。这些技术的目标是通过不断改进稳定扩散的各个组件和流程,以获得更高质量、更符合预期的图像生成结果

总而言之,稳定扩散的结果可以通过改进文本编码器U-Net噪声控制以及其他技术来提升。这些技术可以根据具体需求选择和应用,以实现更好的图像生成效果。


{扩散模型|Diffusion model}的运作方式

刚才我们从上帝视角审视{扩散模型|Diffusion model}的内部机制,让我们来看一些具体的示例,了解其运作方式。

文本到图像

在文本到图像的过程中,你给{扩散模型|Diffusion model}一个文本提示,它会返回一张图像。

第一步:{稳定扩散|Stable Diffusion}潜在空间中生成一个随机{张量|Tensor}

你可以通过设置随机数生成器的种子来控制这个张量。如果你将种子设置为特定的值,每次都会得到相同的随机张量。这个张量代表了潜在空间中的图像,但目前只是一片噪声。


image.png

第二步:{噪声预测器|Noise Predictor} 也就是 U-Net 接收潜在噪声图像文本提示作为输入,并预测出潜在空间中的噪声(一个4x64x64的张量)。

image.png

第三步:从潜在图像中减去潜在噪声。这将成为你的新潜在图像。

image.png

第二步和第三步将重复进行一定次数的采样步骤,例如20次。

第四步:最后,VAE的解码器将潜在图像转换回像素空间。这就是在运行{稳定扩散|Stable Diffusion}之后得到的图像。

image.png

以下是图像在每个采样步骤中的演变情况。

image.png


噪声调度

图像从嘈杂变为清晰。真正的原因是我们在每个采样步骤中尝试得到预期的噪声。这就是噪声调度

下面是一个例子。

image.png

噪声调度是我们自己定义的。我们可以选择在每个步骤中减去相同数量的噪声。或者我们可以在开始时减去更多的噪声,就像上面的例子。采样器在每个步骤中减去恰好足够的噪声,以达到下一个步骤中的预期噪声。这就是你在上面图像中看到的过程。


图生图

图生图是首次在SDEdit方法中提出的一种方法。SDEdit可以应用于任何扩散模型。因此,我们可以使用图生图方法来进行稳定扩散

图生图的输入包括输入图像和文本提示。生成的图像将同时受到输入图像和文本提示的约束

例如,使用左侧的简单图片和{提示|Prompt}为“拍摄完美绿色苹果带茎、水滴和戏剧性灯光”的输入,图生图可以将其转换为专业绘画:

image.png

下面是详细的处理过程。

第一步:将输入图像{编码|Encoder}潜在空间中。

image.png


第二步:向潜在图像中添加噪声。去噪强度控制添加了多少噪声。如果去噪强度为0,不会添加任何噪声。如果去噪强度为1,将添加最大量的噪声,使潜在图像变成完全随机的张量。

image.png

第三步:{噪声预测器|Noise Predictor} 也就是 U-Net以潜在的噪声图像和文本提示作为输入,并预测潜在空间中的噪声(一个4x64x64的张量)。

image.png

第四步:从潜在图像中减去潜在噪声。这成为你的新潜在图像。

image.png

第三步和第四步会重复执行一定数量的采样步骤,例如,重复20次。

第五步:最后,VAE的解码器将潜在图像转换回像素空间。这就是在运行图像到图像的过程中得到的图像。

image.png

图生图的含义:它的主要作用是在初始潜在图像中添加一些噪声和一些输入图像。将去噪强度设置为1等同于文本到图像text-to-image)的过程,因为初始潜在图像完全是随机噪声。


{修复|Inpainting}

{修复|Inpainting}实际上只是图生图的一个特殊情况。噪声被添加到需要修复的图像部分。噪声的量同样由去噪强度控制。


{深度到图像|Depth-to-image}

{深度到图像|Depth-to-image}是对图生图的增强,它利用深度图进行附加的条件约束生成新的图像。

步骤1:将输入图像编码为{潜在状态|latent state}

image.png

第2步。MiDaS(一种AI深度模型)从输入图像中估计深度图。

image.png

第3步。向潜在图像添加噪声。去噪强度控制添加的噪声量。如果去噪强度为0,则不添加噪声。如果去噪强度为1,则添加最大噪声,使潜在图像成为随机张量。

image.png

第4步。{噪声预测器|Noise Predictor}根据文本提示和深度图来估计潜在空间的噪声。

image.png

第5步。从潜在图像中减去潜在噪声,得到新的潜在图像。

image.png

第4步和第5步在采样步骤中重复进行。

第6步。VAE的解码器将潜在图像解码。现在你从深度到图像得到了最终的图像。

image.png


CFG 值

CFG是{无需分类器辅助|Classifier-Free Guidance}的简称。为了理解CFG是什么,我们需要首先了解它的前身,分类器辅助

分类器辅助

分类器辅助是在{扩散模型|Diffusion model}中将图像标签纳入考虑的一种方式。你可以使用标签来指导扩散过程。例如,标签“猫”将引导{逆向扩散|Reverse Diffusion} 过程生成猫的照片。

分类器辅助尺度是一个参数,用于控制扩散过程应该多大程度上遵循标签。

假设有3组带有标签“猫”、“狗”和“人类”的图像。如果扩散是未引导的,模型将从每个组的总体中抽取样本,但有时可能会生成适合两个标签的图像,例如一个男孩抚摸一只狗的图像。

image.png

在高分类器辅助下,{扩散模型|Diffusion model}生成的图像会偏向极端或明确的示例。如果你要求模型生成一只猫的图像,它将返回一张明确是猫而不是其他东西的图像。

分类器辅助尺度控制着辅助的紧密程度。在上面的图中,右侧的采样比中间的采样具有更高的分类器辅助尺度。在实践中,这个尺度值只是对朝着具有该标签数据的漂移项的乘法因子。


CFG value

无分类器辅助(CFG)尺度是一个值,用于控制文本提示对扩散过程的影响程度。当该值设为0时,图像生成是无条件的(即忽略了提示)。较高的值将扩散过程引导向提示的方向。


Stable Diffusion v1 vs v2

模型差异

Stable Diffusion v2使用OpenClip进行文本嵌入,而Stable Diffusion v1使用Open AICLIP ViT-L/14进行文本嵌入。这个改变的原因如下:

  1. OpenClip的模型比CLIP模型大五倍。更大的文本编码器模型可以提高图像质量。
  2. 虽然Open AICLIP模型是开源的,但这些模型是使用专有数据进行训练的。切换到OpenClip模型使研究人员在研究和优化模型时拥有更多的透明度,有利于长期的发展。

训练数据的差异:

  • Stable Diffusion v1.4在以下数据集上进行训练:
  • laion2B-en数据集上进行了237,000个步骤,分辨率为256×256
  • laion-high-resolution数据集上进行了194,000个步骤,分辨率为512×512
  • 在“laion-aesthetics v2 5+”数据集上进行了225,000个步骤,分辨率为512×512,并且取消了10%的文本条件。
  • Stable Diffusion v2在以下数据集上进行训练:
  • 在经过过滤的LAION-5B子集上进行了550,000个步骤,分辨率为256x256,使用LAION-NSFW分类器进行筛选,设置punsafe=0.1,美学评分>=4.5。
  • 在相同数据集上进行了850,000个步骤,分辨率为512x512,并且限制了图像分辨率>=512x512。
  • 使用v-objective在相同数据集上进行了150,000个步骤。
  • 768x768的图像上再进行了额外的140,000个步骤。
  • Stable Diffusion v2.1在v2.0的基础上进行了微调,包括:
  • 在相同数据集上额外进行了55,000个步骤(punsafe=0.1)。
  • 另外进行了155,000个额外步骤(punsafe=0.98),最后关闭了NSFW过滤器。

要点总结

在本文中,我试图用简单的术语解释稳定扩散的工作原理。以下是一些要点:

  • 稳定扩散是一个主要从文本生成图像的模型(受文本约束),但也可以根据其他指令(如图像/表示)生成图像。
  • 稳定扩散的训练过程包括逐渐向图像中添加噪声(前向扩散)并训练{噪声预测器|Noise Predictor}逐渐去除噪声以生成更清晰的图像(逆向扩散)。
  • 生成过程(逆向扩散)从潜空间中的随机噪声图像(张量)开始,并逐渐扩散成一个清晰的图像,以提示为条件。
  • 有许多技术可以改善稳定扩散的结果,包括在嵌入层上进行的文本反演和DreamArtist,以及在扩散模型上进行的LoRADreamBoothHypernetworks。而这些技术列表还在不断增长。

后记

分享是一种态度

参考资料:

  1. How does Stable Diffusion work
  2. SD是如何运行的

全文完,既然看到这里了,如果觉得不错,随手点个赞和“在看”吧。

相关文章
|
8月前
|
机器学习/深度学习 编解码 人工智能
阿里云Stable Diffusion操作教程
阿里云Stable Diffusion操作教程
|
8月前
|
机器学习/深度学习 自然语言处理 算法
Stable Diffusion WebUI 从零基础到入门
Stable Diffusion WebUI 从零基础到入门
528 1
|
Serverless
使用ControlNet控制Stable Diffusion时
使用ControlNet控制Stable Diffusion时
158 3
|
7月前
|
算法 算法框架/工具 计算机视觉
Stable diffusion采样器详解
在我们使用SD web UI的过程中,有很多采样器可以选择,那么什么是采样器?它们是如何工作的?它们之间有什么区别?你应该使用哪一个?这篇文章将会给你想要的答案。
Stable diffusion采样器详解
|
5月前
|
人工智能 Linux 开发工具
Linux安装Taiyi stable-diffusion-webui
Linux安装Taiyi stable-diffusion-webui
|
7月前
|
机器学习/深度学习 人工智能 编解码
原来Stable Diffusion是这样工作的
初中生都能听懂的Stable Diffusion的工作原理,看完还不会你来找我
原来Stable Diffusion是这样工作的
|
7月前
|
关系型数据库 数据库 开发工具
Stable Diffusion 本地部署教程
Stable Diffusion 本地部署教程
215 0
|
8月前
|
Python
stable diffusion本地部署教程
stable diffusion本地部署教程
111 1
|
8月前
|
人工智能 异构计算
Stable Diffusion 3.0的特点
【2月更文挑战第5天】Stable Diffusion 3.0的特点
343 2
Stable Diffusion 3.0的特点
|
8月前
|
机器学习/深度学习 算法 PyTorch
Stable Diffusion 介绍与入门
Stable Diffusion 介绍与入门,简单的介绍
1626 2
Stable Diffusion 介绍与入门