昨天的选择,决定了今天的结局
大家好,我是柒八九。
前言
许久未见,是否有点想念。
最近,更文速度有点慢,不是说创作到了瓶颈,(放心,原来的各种系列文章都有准备和更文计划
,当然,如果大家有想了解的技术方向也可以评论和私聊。我可以和大家一起学习研究)而是,最近新公司业务比较多,每天下班回来了,有点心力交瘁
了。熟悉博主的都知道,平时的学习和更文都是利用下班时间。
其实,这篇文章的雏形早在3周前
就定了,只是有些地方的行文有点拖沓,本着质量优先的原则。宁愿不发也不想发一些半成品来混文章数量。所以,就一直拖着没有发布。而今天正好空闲了,所以乘热打铁。
本文主要讲述{稳定扩散|Stable Diffusion}的实现原理。
如果,想了解该系列(AI相关)的文章,可以参考我们已经发布的文章。如下是往期文章。
文章list
你能所学到的知识点
- 什么是{稳定扩散|Stable Diffusion}推荐阅读指数 ⭐️⭐️⭐️⭐️
- {稳定扩散|Stable Diffusion}的组件 推荐阅读指数 ⭐️⭐️⭐️⭐️
- 条件控制 推荐阅读指数 ⭐️⭐️⭐️
- {稳定扩散|Stable Diffusion}优化处理 推荐阅读指数 ⭐️⭐️⭐️⭐️
- {扩散模型|Diffusion model}的运作方式 推荐阅读指数 ⭐️⭐️⭐️⭐️⭐️
- CFG 值 推荐阅读指数 ⭐️⭐️⭐️⭐️
- {稳定扩散|Stable Diffusion}
v1
vsv2
推荐阅读指数 ⭐️⭐️⭐️⭐️
好了,天不早了,干点正事哇。
什么是{稳定扩散|Stable Diffusion}
{稳定扩散|Stable Diffusion}是由StabilityAI
、CompVis
和RunwayML
团队开发的一系列图像生成模型,最初于2022
年发布。它的主要功能是基于文本输入生成具有美感和细节的图像,但它还可以执行其他任务,如修复图像缺失部分(inpainting
)、扩展图像(outpainting
)和图生图。
简而言之,{稳定扩散|Stable Diffusion}是一个文本到图像的模型。给它一个文本提示。它将返回一个与文本相匹配的图像。
{扩散模型|Diffusion model}
{稳定扩散|Stable Diffusion}属于一类称为{扩散模型|Diffusion model}的深度学习模型。它们是生成模型,意味着它们被设计用来生成类似于在训练中所见到的新数据。在稳定扩散的情况下,数据是图像。
为什么它被称为 {扩散模型|Diffusion model}?因为它的数学模型非常类似于物理中的扩散过程。
{前向扩散|Forward Diffusion}
{前向扩散|Forward Diffusion}过程会向训练图像添加噪声,逐渐将其转化为不具特征的噪声图像
。前向过程
会将任何猫或狗
图像转化为噪声图像。最终,你将无法确定它们最初是一只狗还是一只猫。
就像一滴墨水掉进了一杯水中一样。墨水在水中扩散。几分钟后,它会随机分布在整个水中。你无法再判断它最初是掉在中心还是靠近边缘。
下面是一个图像经过{前向扩散|Forward Diffusion}的示例。猫的图像变成了随机噪声。
{逆向扩散|Reverse Diffusion}
{逆向扩散|Reverse Diffusion} 就像倒着播放一段视频。在时间上往回走。我们将看到墨滴最初被添加的地方。
从一个
噪声、无意义的图像
开始,{逆向扩散|Reverse Diffusion} 过程可以恢复出一只猫或一只狗的图像。
从技术上讲,每个扩散过程都有两个部分:
- 漂移或定向运动
- 随机运动
{逆向扩散|Reverse Diffusion} 过程朝着猫或狗图像的方向漂移,但没有中间状态。这就是为什么结果只能是猫或狗的原因。
历史回顾
在我们深入探讨{稳定扩散|Stable Diffusion}的架构和机制之前,让我们快速回顾一下图像生成的历史以及稳定扩散的演变。
2015
年:多伦多大学提出了alignDRAW
。这是一个文本到图像
模型。该模型只能生成模糊的图像,但展示了通过文本输入生成模型“未见过”的图像的可能性。2016
年:Reed、Scott
等人提出了使用生成对抗网络(GAN
,一种神经网络结构)生成图像的方法。他们成功地从详细的文本描述中生成了逼真的鸟类和花卉图像。在这项工作之后,一系列基于GAN
的模型被开发出来。2021
年:OpenAI
发布了基于Transformer
架构(另一种神经网络架构)的DALL-E
,引起了公众的关注。2022
年:Google Brain
发布了Imagen
,与OpenAI
的DALL-E
竞争。2022
年:{稳定扩散|Stable Diffusion}被宣布为潜在空间扩散模型的改进。由于其开源性质,基于它的许多变体和微调模型被创建,并引起了广泛的关注和应用。2023
年:出现了许多新的模型和应用,甚至超出了文本到图像的范畴,扩展到文本到视频或文本到3D等领域。
从时间线上可以看出,文本到图像实际上是一个相当年轻的领域。{稳定扩散|Stable Diffusion}的出现是一个重要的里程碑,作为一个开源模型,它需要比之前的模型更少的资源,促进了该领域的指数增长。
{稳定扩散|Stable Diffusion}的组件
{稳定扩散|Stable Diffusion}并不是一个简单的AI模型,它是将不同的神经网络
组合起来的一个过程。我们可以将{稳定扩散|Stable Diffusion}的整个文本到图像生成过程分解为不同的步骤,并逐步解释这些步骤。
让我们从文本到图像生成过程的概述开始。
- {图像编码器|Image Encoder}:将训练图像转换为潜在空间中的向量,以便进一步处理。
- 潜在空间是一个数学空间,图像信息可以表示为向量(即
数字数组
)。 - {文本编码器|Text Encoder}:将文本转化为高维向量(可以将其视为代表文本含义的数字数组),以便机器学习模型理解。
- {扩散模型|Diffusion model}:以
文本
为条件,在潜在空间中生成新的图像。(即输入文本引导了在潜在空间中图像的生成)。 - {图像解码器|Image Decoder}:将潜在空间中的图像信息转换为由像素构成的实际图像。
每个步骤都使用自己的神经网络完成。
{文本编码器|Text Encoder}将文本输入转换为嵌入向量
想象一下,你想让一个外国艺术家为你画一幅画,但你不懂他们的语言,你可能会使用谷歌翻译或找一个人来帮助你将你想要表达的内容翻译给他们。
对于图像生成模型来说,情况也是如此——机器学习模型无法直接理解文本,因此它们需要一个{文本编码器|Text Encoder}将你的文本指令转换为它们可以理解的数字。这些数字不是随机的数字,它们被称为文本嵌入,是能够捕捉文本的语义含义(即词与其上下文之间的关系)的高维向量。
将文本转换为嵌入向量
可以有多种方法。{稳定扩散|Stable Diffusion}使用了一个Transformer
大型语言模型来完成这个任务。如果你对语言模型有所了解,你可能对Transformer
这个术语感到熟悉——它是GPT
的基础架构。如果想了解更多的关于ChatGPT
的相关原理。可以参考ChatGPT:你应该知道的知识
事实上,{稳定扩散|Stable Diffusion}v1
使用了CLIP
,这是OpenAI
基于GPT
开发的模型。{稳定扩散|Stable Diffusion}V2
使用了OpenClip
,一个更大的CLIP
版本。
这些编码器模型在包含数十亿个文本和图像对的大型数据集上进行训练,以便学习我们用来描述图像的单词和短语的含义。数据集来自于网络上的图像,以及我们用来描述这些图像的图像标签(alt
标签)。
{扩散模型|Diffusion model}通过扩散过程绘制图像
{扩散模型|Diffusion model}是稳定扩散的核心组成部分,它是综合图像的组件。
为了训练扩散模型,有两个过程:
- {前向扩散|Forward Diffusion}过程用于准备训练样本
- {逆向扩散|Reverse Diffusion} 过程用于生成图像
在{稳定扩散|Stable Diffusion}中,这两个过程都在潜在空间中进行,以提高速度。
在{前向扩散|Forward Diffusion}过程中,模型逐渐向图像添加
高斯噪声
,将清晰的图像转变为噪声图像。在每个步骤中,图像都会添加少量的噪声,并在多个步骤中重复此过程。
正如“扩散”一词所暗示的那样,这个过程就像是将一滴墨水滴入水中,墨水逐渐在水中扩散,直到你无法再看到它最初是一滴墨水的痕迹。添加到图像中的噪声模式是随机的,就像墨水颗粒随机扩散到水颗粒中一样,但可以控制噪声的数量。此过程在LAION
数据集的许多图像上进行,每个图像都添加不同数量的噪声,以创建大量噪声样本来训练{逆向扩散|Reverse Diffusion}模型。
在{逆向扩散|Reverse Diffusion} 过程中,训练了一个{噪声预测器|Noise Predictor},用于预测添加到原始图像的噪声,以便模型可以从噪声图像中去除预测的噪声,得到一个更清晰的图像(在
潜在空间
中)。你可以将这个过程想象成观察部分扩散的墨水滴在水中,并试图预测它之前所在的位置。
{噪声预测器|Noise Predictor}是基于ResNet
骨干结构的U-Net
(一种神经网络架构)。
{噪声预测器|Noise Predictor}训练过程如下所示:
- 选择一张训练图像,比如一张猫的照片。
- 生成一个随机的噪声图像。
- 通过将这个噪声图像添加到训练图像中一定数量的步骤来破坏(corrupt)训练图像。
- 教授{噪声预测器|Noise Predictor}告诉我们添加了多少噪声。这是通过
调整其权重
并向其展示正确答案来完成的。
经过训练,我们有一个能够估计添加到图像中的噪声的{噪声预测器|Noise Predictor}。
它在之前通过{前向扩散|Forward Diffusion}准备的训练数据集上进行训练,其目标是尽可能准确地估计噪声,以使去噪后的图像尽可能接近原始图像。一旦训练完成,它将在其权重中“记住”图像表示,并可以用于从随机的初始噪声图像张量“生成”图像。实际的图像和图像质量在很大程度上取决于原始图像数据集,因为它试图回到原始图像。这个逆向扩散过程逐步进行多个步骤,以去除噪声。进行更多的去噪步骤,图像变得越来越清晰。
在获取更清晰图像的{逆向扩散|Reverse Diffusion}过程中,研究人员希望通过一种称为条件化的过程来控制图像的外观。如果我们使用文本,这个过程被称为文本条件化。它通过将文本编码步骤中的文本嵌入
传递给U-Net
,并通过交叉注意机制进行操作。
交叉注意机制
基本上将文本嵌入
与{逆向扩散|Reverse Diffusion}每个步骤的结果进行合并。例如,如果你有一个输入提示“猫”,你可以将条件化
理解为告诉{噪声预测器|Noise Predictor}:“对于下一个去噪步骤,图像应该更像一只猫。现在进行下一步。”条件化也可以通过除文本以外的其他指导方式进行,例如图像、语义地图、表示等。
{图像解码器|Image Decoder}将图像从潜伏空间翻译成像素
由于我们进行的扩散
和条件化
都是在潜在空间中进行的,所以我们无法直接查看生成的图像。我们需要将潜在图像转换回我们可以看到的像素。这个转换是通过{图像解码器|Image Decoder}完成的。
在{稳定扩散|Stable Diffusion}中,这个转换器是一个变分自动编码器(VAE
)。在早期的{前向扩散|Forward Diffusion}过程中,我们使用VAE
的编码器部分将原始的训练图像从像素转换为潜在空间,以添加噪声。现在,我们使用VAE
的解码器部分将潜在图像转换回像素。
何为VAE
{变分自编码器|Variational Autoencoder}(VAE
)神经网络包含两个部分:
- 编码器:将图像压缩为潜在空间中的较低维表示
- 解码器:从潜在空间中恢复图像
{稳定扩散|Stable Diffusion}模型的潜在空间是4x64x64
,比图像像素空间小48倍。所有前向和逆向扩散实际上都是在潜在空间中进行的。
因此,在训练过程中,它不是生成一个带有噪声的图像,而是在潜在空间中生成一个随机{张量|Tensor}(潜在噪声)。它不是用噪声破坏图像,而是用潜在噪声破坏图像在潜在空间中的表示。这样做的原因是速度更快,因为潜在空间更小。
在深度学习里,
Tensor
实际上就是一个多维数组。而
Tensor
的目的是能够创造更高维度的矩阵、向量。{稳定扩散|Stable Diffusion}将所有的处理、扩散和条件化都在潜在空间中进行,而不是在像素空间中进行的原因是潜在空间更小。这样我们可以更快地进行这个过程,而不需要消耗大量的计算资源。