赞
踩
在Stable Diffusion诞生之前,计算机视觉和机器学习方面最重要的突破是 GAN(Generative Adversarial Networks 生成对抗网络)。GAN让超越训练数据已有内容成为可能,从而打开了一个全新领域——现在称之为生成建模。
然而,在经历了一段蓬勃发展后,GAN开始暴露出一些瓶颈和弊病,大家倾注了很多心血努力解决对抗性方法所面临的一些瓶颈,但是鲜有突破,GAN由此进入平台期。GAN的主要问题在于:
另外,还有一条基于似然(例如,马尔可夫随机场)的技术路线,尽管已经存在很久,但由于对每个问题的实施和制定都很复杂,因此未能产生重大影响。
近几年,随着算力的增长,一些过去算力无法满足的复杂算法得以实现,其中有一种方法叫“扩散模型”——一种从气体扩散的物理过程中汲取灵感并试图在多个科学领域模拟相同现象的方法。该模型在图像生成领域展现了巨大的潜力,成为今天Stable Diffusion的基础。
Stable Diffusion是stability.ai开源的图像生成模型,可以说Stable Diffusion的发布将AI图像生成提高到了全新高度。Stable Diffusion 作为一款高性能模型,它生成的图像质量更高、运行速度更快、消耗的资源以及内存占用更小,是 AI 图像生成领域的里程碑。
Stable Diffusion不是一个整体模型,它由几个组件和模型组成。
图像信息创建者这一组件运行多步以生成对象,这是stable diffusion接口和库中的步长参数,通常默认为50或者100。图像信息创建者完全在图像信息空间(隐藏空间)中工作,此特性比在像素空间中工作的扩散模型更快。
图像解码器根据从图像信息创建者哪里获得信息绘制图片,它仅仅在生成最终图像的结束阶段运行一次。
上图是stable diffusion的一个流程图,包含了上述描述的三个组件,每个组件都有相应的神经网络。
文本理解组件:Clip Text为文本编码器。以77 token为输入,输出为77 token 嵌入向量,每个向量有768维度
图像信息创建者:UNet+Scheduler,在潜在空间中逐步处理扩散信息。以文本嵌入向量和由噪声组成的起始多维数组为输入,输出处理的信息数组。
图像解码器:**自动编码解码器,使用处理后的信息数组绘制最终的图像。以处理后的维度为 4×64×64的信息数组为输入,输出尺寸为3×512×512的图像。
扩散是发生在粉色区域图像信息创建器组件中的过程。这一部分有一个表示输入文本的 token embeddings 和一个随机初始化的图像信息数组,这些数组也被称为 latents,在这个过程中会产生一个信息数组,图像解码器(Image Decoder)使用这个信息数组生成最终图像。
扩散是循序渐进逐步发生的,每一步都会增加更多的相关信息。为了更加直观地了解这个过程,我们可以检查随机 latents 数组,看它是否转化为了视觉噪音(visual noise)。在这种情况下,视觉检查(Visual inspection)是通过图像解码器进行的。
扩散分为多个 step,每个 step 都在输入的 latents 数组上运行,并且会产生另一个 latents 数组,这个数组更类似于输入文本以及模型在模型训练时的所有图像中获取的所有视觉信息。
我们可以对一组这样的 latents 数组执行可视化,看看每一步都添加了什么信息。这一过程令人叹为观止。
在这种情况下,步骤 2 和 4 之间发生了一些特别有意思的事情,就好像轮廓是从噪音中浮现出来的。
扩散模型图像生成的核心是强大的计算机视觉模型。在足够大的数据集的基础上,这些模型可以学会很多复杂运算。扩散模型通过如下方式建构问题来实现图像生成:
假设我们有一个图像,我们首先生成一些噪音(noise),然后将这些噪音添加到图像上。
我们可以将这看成是一个训练示例。之后我们使用同样的公式去创建更多的训练示例,然后用这些示例去训练图像生成模型的中心组件。
虽然这个例子展示了从图像(总量 0,没有噪音)到总噪音(总量 4,总噪音)的一些噪音值,但是我们可以轻松控制向图像中添加的噪音,因此我们可以将其分为数十个 step,为数据集中的每个图像创建数十个训练示例。
有了这个数据集,我们可以训练噪音预测器(noise predictor),并最终得到一个在特定配置下运行时可以创建图像的预测器。接触过 ML 的人会觉得训练步骤非常熟悉:
接下来我们来看看 Stable Diffusion 是如何生成图像的。
经过训练的噪音预测器可以对噪音图像进行降噪处理,并且可以预测噪音。
因为样本噪音(sampled noise)被预测,所以如果我们从图像中去掉这个样本,我们得到的图像就会更接近模型训练的图像。(这个图像不是确切的图像本身,而是图像分布,也就是图像的像素排列,在像素排列中天空通常是蓝色的,高于地面,人有两只眼睛,猫有尖耳朵并且总是懒洋洋的)。
如果训练数据集中的图像比较美观,比如说 Stable Diffusion 训练的 LAION Aesthetics,那么训练出来的图像的可观赏性也会更高。如果我们在 logo 图像上对其进行训练,那么我们最终会得到一个 logo 生成模型。
这里总结了扩散模型处理图像生成的过程,主要如论文 Denoising Diffusion Probabilistic Models 所述。相信你对扩散的含义有了一定的了解,知道了 Stable Diffusion、Dall-E 2 和谷歌 Imagen 的主要组件。
值得注意的是,到目前为止我们所描述的扩散过程,没有使用任何文本数据,只需运行模型就能生成精美图像。不过我们无法控制图像的内容,它可能是一座金字塔,也可能是一只猫。接下来,我们将讨论如何将文本信息融入扩散过程以控制图片类型。
为了加快图像生成过程,Stable Diffusion 论文没有在像素图像上进行运行,而是在图像的压缩版本上运行。论文将这称为前往潜在空间(Departure to Latent Space)。
压缩(随后是解压缩/绘图)通过编码器完成。自动编码器使用 Image Encoder 将图像压缩进潜空间,然后使用 Image Decoder 再对压缩信息进行重构。
正向扩散在潜空间上完成。噪声信息应用于潜空间,而不是应用于像素图象。因此,训练噪声预测器(noise predictor)实际上是为了预测压缩表示(compressed representation)上的噪音,这个压缩表示也被称为潜空间(latent space)。
正向扩散是使用 Image Encoder 生成图像数据,来训练噪声预测器。训练一旦完成,就可以执行反向扩散,使用 Image Decoder 生成图像。
LDM/Stable Diffusion 论文的图 3 中提及了这两个过程:
上图还显示了“conditioning”组件,这个组件在本例中是描述模型生成图像的文本提示词(text prompts)。接下来,我们继续探讨文本组件。
Transformer 语言模型作为语言理解组件,能够接受文本提示词,生成 token embeddings。Stable Diffusion 模型使用的是 ClipText(基于 GPT 的模型),而论文中采用的是 BERT。
Imagen 论文表明,语言模型的选择相当重要。相较于较大的图像生成组件,较大的语言模型组件对生成图像的质量影响更大。
较大的/更好的语言模型对图像生成模型的质量有巨大的影响。资料来源:Saharia 等人所著论文 Google Imagen 中的图 A.5。
早期的 Stable Diffusion 模型仅使用了 OpenAI 发布的预训练模型 ClipText。未来模型可能转向新发布的更大的 CLIP 变体 OpenCLIP。(更新于 2022 年 11 月,详情见 Stable Diffusion V2 uses OpenClip。与仅含有 630 万文本模型参数的 ClipText 相比,OpenCLIP 文本模型参数多达 3.54 亿。)
CLIP 模型是在图像和图像说明数据集上训练的。我们可以设想这样一个数据集,它里面有 4 亿张图像以及这些图像说明的材料。
实际上,CLIP 是在网络上抓取的带有“alt”标签的图像上训练的。CLIP 是图像编码器和文本编码器的结合。简单来说,训练 CLIP 就是分别对图像和图像文本说明进行编码。
然后,使用余弦相似度来比较生成的 embeddings。刚开始训练时,即使文本正确描述了图像,相似度也会很低。
我们更新了这两个模型,这样下次嵌入它们时就可以得到相似的 embeddings。
通过在数据集上重复此操作并使用大的 batch size,最终使编码器能够生成图像和文本说明相似的 embeddings。如 word2vec,训练过程也需要包含不匹配的图像和文本说明作为负样本,以得到较低的相似度分数。
为了使文本融入图像生成,我们须调整噪声预测器来输入文本。
现在,在数据集中加入文本。因为我们是在潜空间中运行,所以输入的图像和预测的噪声都处于潜空间中。
为了更好地理解 UNet 中文本 tokens 的使用方式,下面我们将进一步探究 UNet 模型。
首先来看没有使用文本的 UNet,其输入和输出如下:
可以看到:
UNet 是一系列用于转换 latents 数组的 layers
每一 layer 都对前一个 layer 的输出进行操作
Some of the outputs are fed (via residual connections) into the processing later in the network
通过残差连接(residual connections),将网络前面的 layer 输出送入到后面的 layer 进行处理
时间步长被转化为 embedding 向量,在网络层中使用
现在让我们看看如何改变该系统以增加对文本的关注度。
为了给文本输入提供支持,也就是专业上所说的文本条件(text conditioning),我们需要在系统的 ResNet blocks 之间添加一个注意力层(attention layer)。
文本信息不直接由 ResNet 处理,而是通过注意力层将这些文本表示融入到 latents 中。这样,下一个 ResNet 就能在处理过程中利用融入的文本信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。