前言
有了前面教程的概念之后,本文再来聊一下原理,多少会提到底层的技术,如果觉得无聊看不懂懒得看,可以跳过本文。如果你坚持看完,恭喜你,成为AI绘画高手就差实操了。
一、Stable Diffusion 是如何工作的?
大家都知道了使用Stable Diffusion绘画,只要输入一段文字描述(Prompt),它就能返回与文本匹配的图像。Stable Diffusion将文本提示转换为图像。
1、Stable Diffusion本质
从第一章节我就了解了Stable Diffusion 本身不是一个模型,而是一套图像生成框架。它包含了图像编码器、文本编码器、Diffusion模型以及图像解码器等组件。
具体来说,Stable Diffusion 使用了以下几个模型:
(1)、图像编码器
使用预训练的CLIP模型来编码输入图像,将其映射为latent vector。
(2)、文本编码器
也使用CLIP模型来编码输入文本,将其映射为latent vector。
(3)、Diffusion(扩散模型)
这是Stable Diffusion的核心,它将图像的latent vector通过噪声不断扩散,然后再通过图像解码器还原,实现图像生成的过程。
(4)、图像解码器
使用一个反卷积网络将Diffusion模型输出的latent vector还原为图像。
(6)、训练目标
使用CLIP模型中图像编码器和文本编码器得到的latent vector之间的相似度,作为Diffusion模型训练的目标,使其生成的图像与输入文本的相关性最大化。
所以,Stable Diffusion其实是一套将CLIP、Diffusion模型和解码器整合在一起的图像生成框架。CLIP模型提供了图像和文本的语义理解能力,Diffusion模型实现了通过噪声生成图像的功能,解码器则将其输出转换为可视图像。这三个模块的配合使得Stable Diffusion可以根据文本描述生成与之相关的图像。
“latent vector”是指在机器学习和人工智能中使用的一种概念,用于表示数据的低维度表示。这个概念通常与神经网络相关,因为它们可以将输入数据转换为潜在向量,然后使用这些向量进行分类、聚类或生成新的数据。这些向量被称为“潜在”,因为它们不是直接从数据中提取出来的,而是通过神经网络学习得到的。这个过程被称为“编码”,因为它将原始数据编码成向量形式。潜在向量通常具有一些有用的属性,例如可以进行算术操作,从而生成类似的但不完全相同的数据。这种技术被广泛应用于图像生成、自然语言处理和推荐系统等领域。
2、扩散模型(Diffusion Model)的缺点
扩散模型(Diffusion Model)有一个主要的缺点:就是去噪过程的时间长和内存消耗大。这会使进程变慢,并消耗大量内存。主要原因是它们在像素空间中运行,特别是在生成高分辨率图像时。您甚至无法在任何单个GPU上运行,更不用说笔记本电脑上蹩脚的GPU了。
3、扩散模型(Diffusion Model)为什么慢
图像空间是非常巨大的,想一想具有三个颜色通道(红色、绿色和蓝色)的 512×512 图像是一个 786,432 维的空间!谷歌的imagen和Open AI的dall-e这样的扩散模型都在像素空间中。他们使用了一些技巧来使模型更快,但仍然不够。
对,你没看错,Stable Diffusion Model它的出现就是为了解决扩散模型(Diffusion Model)速度非常慢的问题!
所以Stable Diffusion引入了“潜在扩散模型”(Latent Diffusion Model) 来解决速度慢的问题,大概逻辑是这样的:它不是在高维图像空间中操作,而是首先将图像压缩到潜空间(latent space)中。对比原像素空间,潜空间(latent space)小了 48 倍,因此它获得了处理更少数字的好处,这就是为什么它要快得多的原因。这样,也降低了用户使用的成本,毕竟最新版在一台3060显卡的电脑上也能较好的生成图片。
为什么叫扩散模型?因为它的数学看起来很像物理学中的扩散。
4、认识潜在扩散(Latent Diffusion Model)
接下来科普一点技术,认识一下潜在扩散(Latent Diffusion)“潜在扩散模型”(Latent Diffusion Model) 三个主要组成部分。
(1)、变分自编码器(Variational Autoencoder)
Stable Diffusion使用一种称为变分自编码器(Variational Autoencoder)的技术来实现图像潜空间压缩。这正是我们在使用Stable Diffusion时设置的VAE文件的内容。
自动编码器(VAE)的神经网络由两部分组成:编码器和解码器。
编码器:将把图像转换成低维的潜在表示形式,该表示形式将作为下一个组件U_Net的输入。
解码器:将做相反的事情,它将把潜在的表示转换回图像。
在Latent diffusion训练过程中,利用编码器获得正向扩散过程中输入图像的潜表示(latent)。而在推理过程中,VAE解码器将把潜信号转换回图像。
Stable Diffusion模型的潜空间为4x64x64,比图像像素空间小48倍。
我们谈到的所有正向和反向扩散实际上是在潜在空间中完成的。因此,在训练过程中,它不会生成噪声图像,而是在潜在空间中生成随机张量(潜在噪声)。它不是用噪声破坏图像,而是用潜在噪声破坏图像在潜在空间中的表示。这样做的原因是它的速度要快得多,因为潜在空间更小。
(2)、U-Net
U-Net是在低维空间上,U-Net也包括编码器和解码器两部分,两者都由ResNet块组成。编码器将图像表示压缩为低分辨率图像,解码器将低分辨率解码回高分辨率图像。
为了防止U-Net在下采样时丢失重要信息,通常在编码器的下采样的ResNet和解码器的上采样ResNet之间添加了捷径的连接。
在Stable Diffusion的U-Net中添加了交叉注意层对文本嵌入的输出进行调节。交叉注意层被添加到U-Net的编码器和解码器ResNet块之间。
(3)、Text-Encoder
文本编码器将把输入文字提示转换为U-Net可以理解的嵌入空间,这是一个简单的基于transformer的编码器,它将标记序列映射到潜在文本嵌入序列。从这里可以看到使用良好的文字提示以获得更好的预期输出。
为什么Latent Diffusion快速有效
Latent Diffusion之所以快速有效,是因为它的U-Net是在低维空间上工作的。与像素空间扩散相比,这降低了内存和计算复杂度。例如,一个(3,512,512)的图像在潜在空间中会变成(4,64,64),内存将会减少64倍。
5、Stable Diffusion 文字生成图片过程
上图是一个基本的文生图流程,把中间的 Stable Diffusion 结构看成一个黑盒,那黑盒输入是一个文本串“天堂、广阔的、海滩”,利用这项技术,输出了最右边符合输入要求的生成图片,图中产生了蓝天白云和一望无际的广阔海滩。
Stable Diffusion 的核心是,由于每张图片满足一定规律分布,利用文本中包含的这些分布信息作为指导,把一张纯噪声的图片逐步去噪,生成一张跟文本信息匹配的图片。它其实是一个比较组合的系统,里面包含了多个模型子模块,接下来把黑盒进行一步步拆解。stable diffusion 最直接的问题是,如何把人类输入的文字串转换成机器能理解的数字信息。这里就用到了文本编码器 text encoder(蓝色模块),可以把文字转换成计算机能理解的某种数学表示,它的输入是文字串,输出是一系列具有输入文字信息的语义向量。有了这个语义向量,就可以作为后续图片生成器 image generator(粉黄组合框)的一个控制输入,这也是 stable diffusion 技术的核心模块。图片生成器,可以分成两个子模块(粉色模块 黄色模块)来介绍。下面介绍下 stable diffusion 运行时用的主要模块: