要使用 Stable Diffusion 给一张图像添加噪音,以下是相关的原理和过程:
在 Stable Diffusion 中,与 GAN 等生成式模型一样,它学习拟合训练集分布,并能够生成与训练集分布相似的输出结果。但与 GAN 相比,SD 模型训练过程更稳定,且具备更强的泛化性能,这归功于其核心的前向扩散过程和反向扩散过程。
在前向扩散过程中,SD 模型持续对一张图像添加高斯噪声直至变成随机噪声矩阵。而在反向扩散过程中,SD 模型进行去噪声过程,将一个随机噪声矩阵逐渐去噪声直至生成一张图像。
Stable Diffusion 的整个训练过程在最高维度上可以看成是如何加噪声和如何去噪声的过程,并在针对噪声的“对抗与攻防”中学习到生成图片的能力。
其训练逻辑为:
在训练时,需要把加噪的数据集输入模型中,每一次迭代用 random 函数生成从强到弱各个强度的噪声,通常会生成 0 - 1000 一共 1001 种不同的噪声强度,通过 Time Embedding 嵌入到训练过程中。Time Embedding 由 Timesteps(时间步长)编码而来,引入 Timesteps 能够模拟一个随时间逐渐向图像加入噪声扰动的过程。每个 Timestep 代表一个噪声强度(较小的 Timestep 代表较弱的噪声扰动,而较大的 Timestep 代表较强的噪声扰动),通过多次增加噪声来逐渐改变干净图像的特征分布。
以下是一个简单的加噪声流程示例:首先从数据集中选择一张干净样本,然后再用 random 函数生成 0 - 3 一共 4 种强度的噪声,然后每次迭代中随机一种强度的噪声,增加到干净图片上,完成图片的加噪流程。
在训练过程中,首先对干净样本进行加噪处理,采用多次逐步增加噪声的方式,直至干净样本转变成为纯噪声。接着,让 SD 模型学习去噪过程,最后抽象出一个高维函数,这个函数能在纯噪声中不断“优化”噪声,得到一个干净样本。其中,将去噪过程具像化,就得到使用 U-Net 预测噪声,并结合 Schedule 算法逐步去噪的过程。加噪和去噪过程都是逐步进行的,假设进行 K 步,那么每一步,SD 都要去预测噪声,从而形成“小步快跑的稳定去噪”。与此同时,在加噪过程中,每次增加的噪声量级可以不同,假设有 5 种噪声量级,那么每次都可以取一种量级的噪声,增加噪声的多样性。
在传统深度学习时代,凭借生成器与判别器对抗训练的开创性哲学思想,GAN(Generative adversarial networks)可谓是在生成式模型中一枝独秀。同样的,在AIGC时代,以SD模型为代表的扩散模型接过GAN的衣钵,在AI绘画领域一路“狂飙”。与GAN等生成式模型一致的是,SD模型同样学习拟合训练集分布,并能够生成与训练集分布相似的输出结果,但与GAN相比,SD模型训练过程更稳定,而且具备更强的泛化性能。这些都归功于扩散模型中核心的前向扩散过程(Forward Diffusion Process)和反向扩散过程(Reverse Diffusion Process)。在前向扩散过程中,SD模型持续对一张图像添加高斯噪声直至变成随机噪声矩阵。而在反向扩散过程中,SD模型进行去噪声过程,将一个随机噪声矩阵逐渐去噪声直至生成一张图像。具体流程与图解如下所示:前向扩散过程(Forward Diffusion Process)→ \rightarrow图片中持续添加噪声反向扩散过程(Reverse Diffusion Process)→ \rightarrow持续去除图片中的噪声SD模型的加噪和去噪图解【1】扩散模型的基本原理在Stable Diffusion这个扩散模型中,无论是前向扩散过程还是反向扩散过程都是一个参数化的马尔可夫链(Markov chain),如下图所示:扩散模型的前向扩散过程和反向生成过程
Stable Diffusion的整个训练过程在最高维度上可以看成是如何加噪声和如何去噪声的过程,并在针对噪声的“对抗与攻防”中学习到生成图片的能力。Stable Diffusion整体的训练逻辑也非常清晰:1.从数据集中随机选择一个训练样本2.从K个噪声量级随机抽样一个timestep t t3.将timestep t t对应的高斯噪声添加到图片中4.将加噪图片输入U-Net中预测噪声5.计算真实噪声和预测噪声的L2损失6.计算梯度并更新SD模型参数下图是SD训练过程Epoch迭代的图解:下图是SD每个训练step的详细图解过程:SD每个训练step的详细图解过程下面Rocky再对SD模型训练过程中的一些关键环节进行详细的讲解。【1】SD训练集加入噪声SD模型训练时,我们需要把加噪的数据集输入模型中,每一次迭代我们用random函数生成从强到弱各个强度的噪声,通常来说会生成0-1000一共1001种不同的噪声强度,通过Time Embedding嵌入到SD的训练过程中。Time Embedding由Timesteps(时间步长)编码而来,引入Timesteps能够模拟一个随时间逐渐向图像加入噪声扰动的过程。每个Timestep代表一个噪声强度(较小的Timestep代表较弱的噪声扰动,而较大的Timestep代表较强的噪声扰动),通过多次增加噪声来逐渐改变干净图像的特征分布。
下图是一个简单的加噪声流程,可以帮助大家更好地理解SD训练时数据是如何加噪声的。首先从数据集中选择一张干净样本,然后再用random函数生成0-3一共4种强度的噪声,然后每次迭代中随机一种强度的噪声,增加到干净图片上,完成图片的加噪流程。SD训练集的加噪声流程【2】SD训练中加噪与去噪具体地,在训练过程中,我们首先对干净样本进行加噪处理,采用多次逐步增加噪声的方式,直至干净样本转变成为纯噪声。SD训练时的加噪过程接着,让SD模型学习去噪过程,最后抽象出一个高维函数,这个函数能在纯噪声中不断“优化”噪声,得到一个干净样本。其中,将去噪过程具像化,就得到使用U-Net预测噪声,并结合Schedule算法逐步去噪的过程。SD训练时的去噪过程我们可以看到,加噪和去噪过程都是逐步进行的,我们假设进行K K步,那么每一步,SD都要去预测噪声,从而形成“小步快跑的稳定去噪”,类似于移动互联网时代的产品逻辑,这是足够伟大的关键一招。与此同时,在加噪过程中,每次增加的噪声量级可以不同,假设有5种噪声量级,那么每次都可以取一种量级的噪声,增加噪声的多样性。多量级噪声