最近在学习 Stable Diffusion 相关的内容,看到这篇文章,感觉不错所以翻译一下。
原文地址:How does Stable Diffusion work?
原文作者:Andrew
Stable Diffusion 是一个深度学习模型,让咱们深化了解下 Stable Diffusion 在底层是怎么工作的。
为什么你需求知道?除了问题本身是一个诱人的主题外,对内部机制的一些了解会使你成为一个更好的艺术家。你能够更正确地运用这个工具,到达更精确、更想要的效果。
text-to-image(文字转图画) 和 image-to-image(图画转图画)之间有什么不同? CFG 值是什么? 什么是去噪强度? 你将会在本文中找到答案。
咱们开端吧。
Stable Diffusion 能做什么?
以最简单的办法来了解,Stable Diffusion 是一种 text-to-image 的模型。给它一个文本提示,它将会回来一个与文本相匹配的图画。
分散模型(Diffusion model)
Stable Diffusion 归于一类被称为分散模型的深度学习模型。它们是生成类模型,这意味着它们被规划用来生成与它们在练习中所看到的相似的新数据。在 Stable Diffusion 的场景下,这些数据便是图画。
为什么它被称为 Diffusion 模型?因为它的数学原理看起来十分像物理学中的分散。让咱们来看看什么是分散。
假设我只用两种图画练习了一个分散模型:猫和狗。鄙人图中,左边的两组代表了猫和狗的图画组。
前向分散(Forward diffusion)
前向分散进程将噪声增加到练习图画中,逐渐将其变成非特征性的噪声图画。前向进程将把任何猫或狗的图画变成一个噪声图画。终究,你将无法分辩它们开端是狗仍是猫。(这很重要)
这就像一滴墨水掉进了一杯水里,这滴墨水在水中分散。几分钟后,它随机地分布在水里,你就再也无法分辩它开端是落在中心仍是靠近边缘。
下面是一个正在进行前向分散的图画的比方,猫的图画变成了随机噪音。
反向分散(Reverse diffusion)
激动人心的部分来了,假如咱们能逆转分散呢?就像倒放视频相同,回到过去,咱们将能看到开端增加墨滴的方位。
从一个嘈杂的、无意义的图画开端,反向分散以康复一个猫或一个狗的图画。这便是中心思维。
从技能上讲,每个分散进程都有两个部分:
- 漂移或定向运动
- 随机运动
反向分散会向猫或狗的图画漂移,但没有任何中心的东西。这便是为什么成果或许是一只猫或一只狗。
练习是怎么进行的
反向分散的想法无疑是聪明且高雅的。可是,最重要又最困难的问题是,“怎么才能做到这一点?”
为了反向扭转分散,咱们需求知道有多少噪音被增加到图画中。答案便是教一个神经网络模型来猜测增加的噪声。它被称为 Stable Diffusion 中的 noise predictor(噪声猜测器)。它是一个 U-Net 模型。练习的进程如下:
- 选一张练习图片,比方一张猫的相片。
- 生成随机噪声图画。
- 通过一定次数的增加噪声图画的进程来损坏这个练习图画。
- 教 noise predictor 来告知咱们增加了多少噪音,通过调整它的权重和告知它正确答案来完结。
通过练习,咱们就拥有了一个能够预估图画中所增加的噪音的 noise predictor。
反向分散
现在咱们有了 noise predictor。该怎么运用它呢?
咱们首先生成一个彻底随机的图画,要求噪声猜测器告知咱们噪声。然后咱们从原始图画中减去这个估量的噪声。重复这个进程数次,你将得到一个猫或狗的图画。
你或许注意到咱们无法操控的生成猫或狗的形象。咱们将在议论调理(Conditioning)时解决这个问题。现在,图画生成是无条件的。
您能够在 这篇文章 中阅览有关反向分散采样和采样器的更多信息。
Stable Diffusion 模型
现在我需求告知你一些坏消息:咱们刚才谈到的并不是 Stable Diffusion 的工作办法!因为上述分散进程是在图画空间中进行的!原因是,上述分散进程是在图画空间中进行的。它的计算速度十分、十分慢。你将无法在任何单一的 GPU 上运行,更不用说你笔记本电脑上的糟糕 GPU 了。
图画空间是巨大的。想一想:一个有三个色彩通道(红、绿、蓝)的 512512 图画是一个 786,432 维的空间!(你需求为一个图画指定这么多的值。)
像谷歌的 Imagen 和 Open AI 的 DALL-E 这样的分散模型是在像素空间中。他们运用了一些技巧来使模型更快,但仍然不行。
潜分散(Latent diffusion)模型
Stable Diffusion 是为了解决速度问题而规划的。具体办法如下。
Stable Diffusion 是一个潜分散模型。它不是在高维图画空间中操作,而是首先将图画压缩到潜空间。潜空间小了 48 倍,所以它获得的好处是计算的数字少了很多。这便是为什么它的速度要快得多。
变量主动编码器(Variational Autoencoder)
它是通过一种叫做变量主动编码器的技能完结的。是的,这便是 VAE 文件是干什么用的,但我将在后面更具体的解释。
变量主动编码器(VAE)神经网络有两个部分:
- 编码器
- 解码器
编码器将图画压缩到潜空间中的低维表明。解码器从潜空间康复图画。
Stable Diffusion 模型的潜空间是 4x64x64,比图画像素空间小 48 倍。咱们谈到的一切正向和反向分散实际上都是在潜空间中完结的。
因而,在练习期间,它不是生成一个有噪声的图画,而是在潜空间中生成一个随机张量(潜噪声)。它不是用噪声损坏图画,而是用潜噪声损坏图画在潜空间的表明。这样做的原因是因为潜空间较小,所以速度会快很多。
图画分辩率
图画分辩率反映在潜像张量的巨细上。潜像的巨细是 4x64x64,只适用于 512512 的图画。关于 768512 的肖像图画,它是 4x96x64。这便是为什么生成一个更大的图画需求更长的时刻和更多的 VRAM。
因为 Stable Diffusion v1 是在 512512 的图画上进行微调的,所以生成大于 512512 的图画或许会导致重复的目标,例如,臭名远扬的两个头。假如你一定要这样做,至少要把一面保持在 512 像素,并运用 AI 升频器来进步分辩率。
为什么潜空间是可行的?
你或许想知道为什么 VAE 能够将图画压缩到一个更小的潜空间而不丢掉信息。原因是,果然如此,自然图画并不是随机的。它们具有很高的规律性:一张脸遵从眼睛、鼻子、脸颊和嘴巴之间的特定的空间关系;一只狗有四条腿,并且是一个特定的形状。
换句话说,图画的高维度是人为的。自然图画能够很容易地被压缩到更小的潜空间而不损失任何信息。这被称为机器学习中的流形假说。
潜空间中的反向分散
下面是 Stable Diffusion 中的潜反向分散是怎么工作的:
- 生成一个随机潜空间矩阵。
- 噪声猜测器预算潜矩阵的噪声。
- 然后从潜矩阵中减去预算的噪声。
- 重复进程 2 和进程 3 直到特定的取样进程。
- VAE 的解码器将潜矩阵转化为终究图画。
什么是 VAE 文件?
VAE 文件在 Stable Diffusion v1 中用于改善眼睛和面部。它们便是咱们刚才谈到的主动编码器的解码器。通过对解码器的进一步微调,模型能够画出更精密的细节。
你或许认识到我之前说到的状况并不彻底正确。将图画压缩到潜空间的确会丢掉信息,因为原来的 VAE 没有康复精密的细节。相反,VAE 解码器担任绘制精密的细节。
调理(Conditioning)
上面咱们的了解是不完好的:文字提示在哪里进入图片呢?没有它,Stable Diffusion 就不是一个文本转图画的模型。你要么得到一个猫的图画,要么得到一个狗的图画,而没有任何办法来操控它。
这便是调理的效果。调理的意图是引导噪声猜测器,使猜测的噪声在从图画中减去后能给咱们带来咱们想要的东西。
文本调理(文本转图画)
以下是文本提示怎么被处理并送入噪声猜测器的概述。符号器(Tokenizer)首先将提示中的每个词转化为一个称为符号(token)的数字。然后,每个符号都会被转化为一个 768 值的向量,称为嵌入(embedding)。(是的,这与你在 AUTOMATIC1111【译注:即 Stable Diffusion WebUI】 中运用的嵌入相同)然后嵌入被文本转化器处理,并预备被噪声猜测器运用。
现在让咱们仔细看看每个部分。假如上面的高层次概述对你来说现已满足了,你能够跳到下一节。
符号器(Tokenizer)
文本提示首先由 CLIP 符号器进行符号。CLIP 是一个由 Open AI 开发的深度学习模型,用于发生任意图画的文本描述。Stable Diffusion v1 运用 CLIP 符号器。
符号化(Tokenization)是计算机了解单词的办法。咱们人类能够阅览文字,但计算机只能阅览数字。这便是为什么文本提示中的单词首先被转化为数字。
一个符号化器只能对它在练习中看到的词进行符号化。例如,在 CLIP 模型中有 “dream” 和 “beach”,但没有 “dreambeach”。符号器会把 “dreambeach” 这个词分解成两个符号: “dream “和 “beach”。因而,一个单词并不总是意味着一个符号!
另一个细节是空格字符也是一个符号的一部分。在上面的比方中,”dream beach” 这个短语发生了两个符号 “dream” 和 “[空格]beach”。这些符号与 “dreambeach” 发生的符号不相同,后者是 “dream” 和 “beach”(beach 前没有空格)。
Stable Diffusion 模型被约束在一个提示中运用 75 个符号(现在你知道为什么它和 75 个单词不相同了!)。
嵌入(Embedding)
Stable Diffusion V1 运用 Open AI 的 ViT-L/14 编排模型。嵌入是一个 768 值的向量。每个符号都有它自己共同的嵌入向量。嵌入是由 CLIP 模型固定的,它是在练习中学习的。
为什么咱们需求嵌入?这是因为有些词彼此之间密切相关。咱们想运用这一信息。例如,man、gentleman 和 guy 的嵌入几乎是相同的,因为它们能够互换运用。Monet、Manet 和 Degas 都以印象派风格作画,但办法不同。这些姓名有挨近但不彻底相同的嵌入。
这与咱们评论的用关键字触发款式的嵌入相同。嵌入能够创造奇观。科学家们现已证明,找到适当的嵌入能够触发任意的目标和风格,这种微调技能被称为文本反转(textual inversion)。
向噪声猜测器运送嵌入
嵌入需求由文本转化器进一步处理,然后再送入噪声猜测器。变换器就像一个通用的调理适配器(a universal adapter for conditioning)。在这种状况下,它的输入是文本嵌入向量,但它也能够是其它东西,如类标签、图画和深度图。变换器不仅进一步处理数据,并且还供给了一个机制来包括不同的调理形式。
穿插重视(Cross-attention)
文本转化器的输出会被整个 U-Net 的噪声猜测器多次运用。U-Net 通过一个穿插重视机制来耗费它。这便是提示与图画相遇的地方。
让咱们以 “A man with blue eyes” 的提示为例。Stable Diffusion 将 “blue” 和 “eyes” 这两个词配对在一起(提示中的自我重视(self-attention)),这样它就会生成一个有蓝色眼睛的男人,但不是一个穿蓝色衬衫的男人。然后它运用这一信息将反向分散引向含有蓝眼睛的图画。(提示和图画之间的穿插重视)
题外话:Hypernetwork 是一种对 Stable Diffusion 模型进行微调的技能,它劫持了穿插重视网络来插入风格。LoRA 模型修正穿插重视模块的权重来改动风格。仅仅修正这个模块就能够对 Stable Diffusion 模型进行微调,这一现实告知你这个模块有多么重要。
其它条件
文字提示并不是 Stable Diffusion 模型的唯一条件。
文字提示和深度图画都被用来调理深度图转图画(depth-to-image)模型。
ControlNet 用检测到的轮廓、人的姿态等对噪声猜测器进行调理,并完成了对图画生成的超卓操控。
Stable Diffusion 逐步分解讲解
现在你知道了 Stable Diffusion 的一切内部机制,让咱们通过一些比方来了解下在内部发生的工作。
文本转图画(Text-to-image)
在文本转图画中,你给 Stable Diffusion 一个文本提示,然后它回来一个图画。
第一步: Stable Diffusion 在潜空间中生成一个随机张量。你通过设置随机数发生器的种子来操控这个张量。假如你把种子设置为某个值,你将总是得到相同的随机张量。这便是你在潜空间的图画。但现在它仍是噪音。
第二步:噪声猜测器 U-Net 将潜噪声图画和文本提示作为输入,并猜测噪声,操作也都是在潜空间(4x64x64 张量)。
第三步:从潜图画中减去潜噪音。这就成为你的新潜像。
重复进程 2 和 3 一定数量的采样进程,例如 20 次。
第四步:终究,VAE 的解码器将潜像转化回像素空间。这便是你运行 Stable Diffusion 后得到的图画。
以下是图画在每个采样进程中的演化状况。
噪音表(Noise schedule)
图画从嘈杂变为干净。你是否置疑噪声猜测器在开端的进程中没有很好地工作?现实上,这仅仅部分现实。真实的原因是咱们试图在每个采样进程中到达一个预期的噪声。这便是所谓的噪声时刻表。下面是一个比方。
噪声时刻表是咱们定义的东西。咱们能够挑选在每一步减去相同数量的噪声。或者咱们能够在开端时减去更多,就像上面那样。采样器(sampler)在每一步减去满足的噪声,以到达下一步的预期噪声。这便是你在分步图中看到的状况。
图画转图画(Image-to-image)
图画转图画是 SDEdit 办法中首次提出的办法。SDEdit 能够应用于任何分散模型。因而,咱们的 Stable Diffusion(一种潜在的分散模型)有图画转图画功用。
在 “图画转图画” 中,一个输入图画和一个文本提示被供给作为输入。生成的图画将由输入的图画和文字提示决议。例如,用这幅业余绘画著作和提示 “photo of perfect green apple with stem, water droplets, dramatic lighting”(带有茎、水滴、戏剧性灯火的完美绿苹果的相片)作为输入,图画转图画能够把它变成一幅专业绘画:
这是它的进程:
第一步:输入图画被编码到潜空间。
第二步:噪声被增加到潜像中。去噪强度(Denoising strength)操控参加多少噪音。假如它是 0,就不增加噪音。假如它是 1,则增加最大数量的噪声,使潜像成为一个完好的随机张量。
第三步:噪声猜测器 U-Net 将潜噪声图画和文本提示作为输入,并猜测潜空间(4x64x64 张量)中的噪声。
第四步:从潜像中减去潜噪音。这就成为你的新潜像。
重复进程 3 和 4 到达一定数量的采样进程,例如 20 次。
第五步:终究,VAE 的解码器将潜像转化回像素空间。这便是你在运行图画转图画后得到的图画。
所以现在你知道什么是图画转图画了:它所做的便是用一点噪声和一点输入图画来设置初始潜像。假如将去噪强度设置为 1,就彻底相当于文本转图画,因为初始潜像彻底是随机的噪声。
修图(Inpainting)
修图实际上仅仅图画转图画的一个特殊状况。噪声被增加到你想去画的图画部分,噪声的数量同样是由去噪强度操控的。
深度图转图画(Depth-to-image)
深度图转图画是一种增强型的图画转图画;它运用深度图生成具有额定条件的新图画。
第一步:输入图画被编码为潜状况
第二步:MiDaS(一个人工智能深度模型)从输入图画中估量出深度图。
第三步:噪声会被增加到潜像中。去噪强度操控参加多少噪音。假如去噪强度为 0,则不增加任何噪声。假如去噪强度为 1,则参加最大的噪声,使潜像成为一个随机张量。
第四步:噪声猜测器以文本提示和深度图为条件估量潜空间的噪声。
第五步:从潜图画中减去潜噪音。这就成为你的新潜像。
第六步:VAE 的解码器对潜像进行解码。现在你就从深度图转图画中得到了终究的图画。
什么是 CFG 值?
假如不解释一下无分类器指引(Classifier-Free Guidance – CFG),这篇文章就不完好,这是人工智能艺术家们每天都在修补的一个价值观。为了了解它是什么,咱们需求先谈谈它的前身 – 分类器指引(classifier guidance)。
分类器指引(Classifier guidance)
分类器指引是将图画标签纳入分散模型的一种办法。你能够运用标签来辅导分散进程。例如,标签 “猫” 引导反向分散进程,生成猫的相片。
分类器指引标准(classifier guidance scale)是一个参数,用于操控分散进程应多大程度地遵从标签。
下面是我从这篇论文中偷出来的一个比方。假设有 3 组图画,标签分别是 “猫”、”狗 “和 “人”。假如分散是无指引的,模型将从每组的总人口中抽取样本,但有时它或许会抽取或许契合两个标签的图画,例如,一个男孩抚摸着一只狗。
在高分类器指引下,分散模型发生的图画会倾向于极点或不明确的比方。假如你让模型寻觅一只猫,它就会回来一张毫不含糊的猫的图画,而不是其他图画。
分类器指引标准操控着指引的严厉程度。在上图中,右边的采样比中心的采样有更高的分类器指引标准。在实践中,这个份额值便是对具有该标签的数据的漂移项的乘数。
无分类器指引(Classifier-free guidance)
虽然分类器指引取得了破纪录的表现,但它需求一个额定的模型来供给这种指引,这给练习带来了一些困难。
无分类器指引,用其作者的话说,是一种完成 “不实用分类器的分类指引” 的办法。他们没有运用分类标签和独自的模型进行指引,而是提议运用图画标题并练习一个条件分散模型(conditional diffusion model),与咱们在文本转图画中评论的模型彻底相同。
他们把分类器部分作为噪声猜测器 U-Net 的条件,完成了图画生成中所谓的 “无分类器”(即没有独自的图画分类器)辅导。
在文字转图画中文字提示供给了这种辅导。
CFG 值
现在咱们有一个可调理的无分类分散进程,咱们怎么操控应该遵从多少指引?
无分类指引(CFG)标准是一个操控文本提示对分散进程的影响程度的值。当它被设置为 0 时,图画生成是无条件的(也便是说,提示会被忽略)。
Stable Diffusion v1 和 v2
这现已是一篇很长的文章了,但假如不比较 V1 和 V2 版别之间的差异,这篇文章就不完好。
模型差异
Stable Diffusion v2 运用 OpenClip 进行文本嵌入。Stable Diffusion v1 运用 Open AI 的 CLIP ViT-L/14 进行文本嵌入。这一改变的原因是:
- OpenClip 大了五倍。更大的文本编码器模型进步了图画质量。
- 虽然 Open AI 的 CLIP 模型是开源的,但这些模型是用专有数据练习的。切换到 OpenClip 模型,让研究人员在研究和优化模型时有更透明度。将更有利于长期发展。
练习数据差异
Stable Diffusion v1.4 的练习数据:
- 在分辩率为 256256 的 laion2B-en 数据集上,练习了 23.7 万步。
- 在分辩率为 512512 的 laion-high-resolution 上练习了 19.4 万步。
- 在分辩率为 512512 的 “Laion-aesthetics v2 5+” 上,练习了 22.5 万步,并降低了 10% 的文本调理。
Stable Diffusion v2 的练习数据:
- 在分辩率为 256×256 的 LAION-5B 子集上,运用 LAION-NSFW 分类器 通过 punsafe=0.1 和审美评分>=4.5 的过滤了一些显露素材后,执行了 55 万步。
- 在分辩率 >=512×512 的同一数据集上,运用分辩率 512×512 的图画练习了 85 万步。
- 在同一数据集上运用 v-objective 练习了 15 万步。
- 在 768×768 的图画上又练习了 14 万步。
Stable Diffusion v2.1 在 v2.0 基础上进行了微调:
- 在同一数据集上增加 5.5 万步(punsafe=0.1)。
- 又用 punsafe=0.98 多练习了 15 万步
所以基本上,他们在终究的练习进程中封闭了 NSFW 过滤器。
成果不同
用户普遍认为运用 Stable Diffusion v2 操控风格和生成名人更难。虽然 Stability AI 没有明确地过滤掉艺术家和名人的姓名,但他们的效果在 v2 中要弱得多。 这或许是因为练习数据的不同。Open AI 的专有数据或许有更多的艺术品和名人相片,他们的数据或许是通过高度过滤的,所以一切的东西和人看起来都很好,很漂亮。
译者说
第一次翻译文章,如有问题多多包涵,最近在学习各种 Stable Diffusion 相关的内容,发现这篇文章,感觉回答了很多我自己这几天运用 Stable Diffusion 的困惑。
因为之前没有接触过相关常识,在运用进程中经常会冒出各种疑问:
- Stable Diffusion 是怎么生成图画的?
- WebUI 中的各种 mode 是做什么用的?
- 采样办法、采样步数、CFG 是干什么的?
- 图生图是怎么完成的?
等等问题,然后看完这篇文章大脑中对很多问题都有了一些清晰的头绪,所以才想翻译出来。
不过没想到翻译的进程仍是蛮痛苦的,这篇英文原文有点长,加上里边太多的没触及的专业词汇(没接触过人工智能相关的常识)让我彻底不知道怎么翻译,比方 Latent Space、Latent Image、Latent Diffusion 等等,就算是运用了各种翻译软件,得到的内容也是奇奇怪怪,终究就凭感觉全都翻译成了 “潜”。
所以各位假如以后看到优秀的翻译著作,无妨点个赞,背面的辛苦或许比想象的要多得多。