相关术语

1. 描述AI训练效果

不收敛:根本没学会。

欠拟合:是指模型不能在训练集上取得好的结果(获得足够低的loss)。学会了点,但是也没学会。模型在训练集、测试集上表现都很差。

过拟合:在训练集上表现很好,但是测试集上表现很差。简单来说,就是学过头了。比如说,学半天1+1=2然后只会这个了,到了1+2就不会算了。模型对训练集"死记硬背",没有理解背后的规律。

泛化能力:AI对未知样本的推理、适应能力。泛化能力差是过拟合的直接表现。

2. 模型

损失函数

描述AI学习到的东西和实际产生的东西的偏差值叫损失值loss,利用偏差值可以指导AI的学习方向,去优化AI模型中的参数。损失函数利用梯度下降逐渐向下走是AI学习的过程,走到图像最低点时是最优解。

梯度下降

指导AI学习走的方向/下坡方向,根据损失值给出的训练数据权值计算出来的,就涉及数据量的问题。

小批量梯度下降算法/ batch-size

一种梯度下降算法,小批量的计算也就是batch-size,决定了一次选取多少图来计算梯度,比如训练有1万张图,batch-size为3,计算一次梯度是从1万张里面选三张随机的图来计算,就不用一次计算全部图。调整batch-size值时要调整学习率,需要同时乘以相同值。

epoch

代表过了1遍训练集内所有的样本。

学习率

损失函数走的步数。学习率小,步子小容易找到最低点,但非常慢同时容易卡在图像上不同起伏里;学习率大,快速跑完,丢失最低点。 学习率最好是变动的,先大后小。

Stable Diffusion 原理

概述

Stable Diffusion 是由多个组件和模型组成的一个系统,一个 AI 绘画生成工具。以下简称 SD。

SD 的核心组件有:文本编码器(CLIP)图像生成器(U-Net + Scheduler)变分自动编码器(Variational Auto-Encoder, VAE)

Stable Diffusion 是一种在潜在扩散模型(Latent Diffusion Model)。它们是生成模型,这意味着它们的目的是生成与它们的原训练数据相似的新数据。对于 SD 来说,数据就是图像。

潜在扩散模型是什么?我们为什么要使用这个模型?这个模型又是如何处理图像的?

潜在扩散模型

介绍

首先,我们需要先知道扩散模型的概念。

扩散模型是一种生成模型,用于生成与训练数据相似的数据。简单的说,扩散模型的工作方式是通过迭代添加高斯噪声来“破坏”训练数据,然后学习如何消除噪声来恢复数据。

一个标准扩散模型有两个主要过程:前向扩散逆向扩散

前向扩散阶段,将噪声添加到训练图像中,逐渐将其转换为没有特点的噪声图像。前向过程会将任何图像变成噪声图像,最终将无法分辨它们最初是什么样子。

1.png

逆向扩散则相反,它将一个完全为噪声的图像,通过重复的降噪步骤,逐步恢复成一个完整、有意义的图像。

潜在扩散模型与标准扩散模型的区别是,潜在扩散模型不直接在像素空间上操作图像,而是在潜空间(Latent Space)中进行操作。通过将原始数据编码到更小的空间中,让 U-Net(用于图像降噪)可以在低维处理图像噪声。

潜空间(Latent Space)

潜空间简单的说是对压缩数据的表示。所谓压缩指的是用比原始表示更小的数位来编码信息的过程。比如我们用一个颜色通道(黑白灰)来表示原来由 RGB 三原色构成的图片,此时每个像素点的颜色向量由3维变成了1维度。维度降低会丢失一部分信息,然而在某些情况下,降维不是件坏事。因为我们只希望模型学习到图像的主要特性,比如边缘、角度、形状等。因此,通过降维我们可以过滤掉一些不太重要的信息,只保留最重要的信息。

5.png

接下来,将根据上图的结构,依次介绍 CLIPU-NetVAE

CLIP 介绍

简介

对一个相对复杂场景的文本描述,AI 需要能“理解”并匹配到对应的画面,大部分项目依赖的都是一个叫 CLIP 的模型。

CLIP 是一个非常先进的神经网络,可以将提示词文字转换为数字表示。神经网络在这种数值上工作得很好,这就是为什么 SD 的开发人员选择 CLIP 作为 Stable Diffusion 的文本编码器(TextEncoder)

作用

我们人类可以阅读单词,但计算机只能读取数字。我们需要将用户输入的提示词(Prompt)进行编码(Tokenize),将这些文本字符串转化为数字(称为 Token),才能使机器理解文本内容。

而 CLIP的作用,就是将文本提示词转化为 Token,进行一系列加工,然后生成条件(Condition),送入 SD 的下一层以供进一步处理。

注:条件(Condition)包含但不限于文本提示,它还可以包含图像(图生图会用到)等参数。

工作流程

分词器(Tokenizer)首先将 Prompt 转换为称为 Token 的数字。然后,这些 Token 会被送入 CLIP 模型中的 Text Transformer 部分,Text Transformer 将每个 Token 转换为称为 Embedding 的拥有 768 个维度的高维向量,这个向量包含了该 Token 在文本中的语义信息。

为什么需要 Embedding?

这是因为一些词彼此之间有着紧密的关系,我们可以利用这个特点。例如,mangentlemanguy 的 embeddings 几乎相同,因为它们可以相互替换。莫奈、马奈和德加都是印象派画家,但他们的风格各有不同,因此,这些名字的 embeddings 虽然接近,但并不完全相同。

3.png

U-Net 结构

介绍

对于噪声的估计和去除,最常使用的是 U-Net。该神经网络的架构看起来像字母 U,由此得名。U-Net 是一个全连接卷积神经网络,这使得它对图像处理非常有用。U-Net的特点在于它能够将图像作为入口,并通过减少采样来找到该图像的低维表示,这使得它更适合处理和查找重要属性,然后通过增加采样将图像恢复回来。

作用

U-Net 在潜空间(Latent Space)中工作,将图像进行去噪处理。

结构

unet.png

图中列出了 UNET 的核心组件和各组件的参数数量。其中主要的组件包括:

ResnetBlock (ResNet)

左下角小图展示了 ResnetBlock 的结构。Resnet 接受两个输入:latent 向量,和 timestep_embedding。latent 向量经过卷积变换后和经过全连接投影的 timestep_embedding 做加和,再和经过 skip connection 的原始 latent 向量做加和,送入另一个卷积层,得到经 Resnet 编码变换后的 latent 输出。

注意左侧的 ResnetBlock 和右侧的 ResnetBlock 的细微不同。左侧的 Resnet Block 接受的 latent 向量从 UNET 的上一层传入,而右侧的 ResnetBlock 除了接受 UNET 上一层的结果 latent 外,还需要接受左侧对应的 UNET 层的输出,两个 latent concat 起来作为 输入。所以,如果右侧的 ResnetBlock 上层的输出结果 shape 为 (64, 64, 320),左侧对应 UNET 层的输出结果为 (64, 64, 640),那么这个 ResnetBlock 得到的输入 latent 的 shape 为 (64, 64, 960)。

Spatial Transformer (实现交叉注意力机制 Cross Attention)

CLIP 输出的 embedding 在整个 U-Net 中被噪声预测器多次使用,U-Net 通过交叉关注机制消耗它,这是文本提示与图像产生交互的地方。

右下角小图展示了 Spatial Transformer 的结构。Spatial Transformer 同样接受两个输入:经过上一个网络模块(ResnetBlock/ResNet)处理和变换后的 latent 向量,及对应的 context embedding(即 CLIP 输出的 embedding)。latent 向量对应的是是图片 token,和 embedding 做 cross attention 之后,得到变换后的 latent 向量(通过注意力机制,将 token 对应的语义信息注入到模型认为应该影响的图片 patch 中)。 Spatial Transformer 输出的 shape 和输出的 shape 保持一致,但在对应的位置上融合了语义信息。

另一种简要理解

在没有文本输入的条件下,U-Net的输入和输出看起来是这样的:

355cf5220d1da49f62eb2e22a8c6c82c.png

在添加了对文本输入的支持后(Text Conditioning),系统的主要变化则体现在 ResNet 块之间添加一个 Attention 层:

fb7d45dd8d3f077aa6ab70addf427bc7.png

注意,ResNet 块不会直接查看文本内容。但是 Attention 层将这些文本特征合并到 Latent 空间中。然后下一个 ResNet 就可以在其处理过程中利用合并的文本信息。

例子:

以 "A man with blue eyes"(一个有着蓝色眼睛的男人)这个提示词为例。Stable Diffusion 将 blue 和 eyes 这两个词配对在一起(提示词中的自注意力机制),这样它就会生成一个蓝眼睛的男人,而不是一个蓝衬衫的男人。然后,它使用这个信息来引导逆向扩散向包含蓝色眼睛的图像靠近(提示词与图像之间的交叉注意力机制)。

Hypernetwork是一种微调Stable Diffusion的技术,它通过干预交叉注意力网络来插入样式。

LoRA 模型修改交叉注意力模块的权重以更改样式。仅修改此模块就可以微调 Stabe Diffusion模型这一事实说明了该模块的重要性。

ControlNet 通过检测到的轮廓、人体姿势等来调节噪声预测器,并实现对图像生成的出色控制。

DownSample/UpSample

DownSample 将 latent 向量的前两个轴的大小缩减 50%,而 UpSample 将 latent 向量的前两个轴的大小增大一倍。DownSample 使用一个步长为 2 的二维卷积来实现,同时将输入 latent 向量的 channel 数变化成输出 latent 向量的 channel 数;而 UpSample 使用插值算法来实现,在插值之后进行一个步长为 1 的卷积,同时通过一个步长为 1 的二维卷积来将输入 latent 向量的 channel 数变化成输出 latent 向量的 channel 数。

需要注意的是,在整个 UNET 执行一次的过程中,timestep_embedding 和 content embedding 始终保持不变。而在 UNET 反复执行多次的过程中,timestep_embedding 每次都会发生变化,而 content embedding 始终保持不变。在迭代过程中,每次 UNET 输出的 noise_slice 都原有的 latent 向量相减,作为下次迭代时,UNET 的 Latent 输入。

VAE 介绍

简介

VAE(Variational Auto-Encoder 变分自动编码器)模型分为解码器和编码器两部分。其中,编码器(encoder)被用于把图片转换成低维度的潜在表征,转换完成后的潜在表征将作为 U- Net 模型的输入。反之,解码器(decoder)将把潜在表征重新转回图片形式.

作用

在模型的训练过程中(或者图生图过程中),VAE 的编码器被用于取得图像在潜空间中的表现形式(潜在表征),这些潜在表征被用于前向扩散过程。

在推理生成图像时,由逆向扩散过程生成的图像被 VAE 的解码器转换回像素空间。

VAE在整个流程中所处的位置

Stable Diffusion 处理流程

接下来介绍两种流程:文本到图像(Text-to-Image)图像到图像(Image-to-Image)

1. 文本到图像

在文本到图像的过程中,你给Stable Diffusion一个文本提示,它会返回一张图像。

第 1 步

CLIP 将你输入的提示词转换为生成图片的条件(Condition)。

Stable Diffusion 在潜空间中,根据一个随机种子(Seed,每一个随机种子对应一张特定的噪声图),生成一张噪声图作为初始图像。如果将种子设置为特定值,噪声图将始终相同。这就是待处理的初始图像。

第 2 步

噪声预测器 U-Net 将噪声图和文本提示作为输入,并预测噪声

第 3 步

从潜在图像中减去潜在噪声,成为新的潜在图像

第2、3步重复一定次数的采样步骤(Step)

下面是图像在每个采样步骤中的变化:

cat_euler_15.webp

第 4 步

最后,VAE的解码器将潜在图像转换回像素空间。

用户可以通过调整采样器(Sampler)、采样步骤(Step)和 CFG(Classifier-Free Guidance)等参数,来影响图像生成的过程和结果。

2. 图像到图像

第 1 步

输入图像被 VAE 的编码器转换为潜在空间的图像。

第 2 步

噪点被添加到潜在图像中。降噪强度控制添加的噪声量。(为 0 则不添加噪声,为 1,则添加最大噪声量,图像变为完全的随机噪声图)

第 3 步

噪声预测器 U-Net 将潜在噪声图像和文本提示作为输入,并预测潜在空间中的噪声。

第 4 步

从潜在图像中减去潜在噪声。这将成为新的潜在图像

步骤 3 和 4 重复一定次数的采样步骤。

这个过程可以被看作是在潜在空间中,参考原始潜在图像,生成一系列新的潜在图像。

在每次迭代中,都会预测潜在空间中的噪声,并从当前的潜在图像中减去这个噪声,得到新的潜在图像,然后再用这个新的潜在图像作为下一次迭代的输入。

第 5 步

最后,VAE 的解码器将潜在图像转换回像素空间。

参考文章