SD 训练过程主要包括加噪和去噪两个环节,具体步骤如下:
在训练过程中,我们首先对干净样本进行加噪处理,采用多次逐步增加噪声的方式,直至干净样本转变成为纯噪声。接着,让 SD 模型学习去噪过程,最后抽象出一个高维函数,这个函数能在纯噪声中不断“优化”噪声,得到一个干净样本。其中,将去噪过程具像化,就得到使用 U-Net 预测噪声,并结合 Schedule 算法逐步去噪的过程。
整个训练过程在最高维度上可以看成是如何加噪声和如何去噪声的过程,并在针对噪声的“对抗与攻防”中学习到生成图片的能力。具体来说,训练过程包括以下几个步骤:
通过不断迭代训练,SD 模型可以学习到如何生成高质量的图片。
我们了解了训练中的加噪和去噪过程,SD训练的具体过程就是对每个加噪和去噪过程进行计算,从而优化SD模型参数,如下图所示分为四个步骤:从训练集中选取一张加噪过的图片和噪声强度(timestep),然后将其输入到U-Net中,让U-Net预测噪声(下图中的Unet Prediction),接着再计算预测噪声与真实噪声的误差(loss),最后通过反向传播更新U-Net的参数。完成U-Net的训练,我们就可以用U-Net对噪声图片进行去噪,逐步重建出有效图像的Latent Feature了!在噪声图上逐步减去被U-Net预测出来的噪声,从而得到一个我们想要的高质量的图像隐特征,去噪流程如下图所示:【3】语义信息对图片生成的控制SD模型在生成图片时,需要输入prompt,那么这些语义信息是如何影响图片的生成呢?答案非常简单:注意力机制。在SD模型的训练中,每个训练样本都会对应一个标签,我们将对应标签通过CLIP Text Encoder输出Text Embeddings,并将Text Embeddings以Cross Attention的形式与U-Net结构耦合,使得每次输入的图片信息与文字信息进行融合训练,如下图所示:
Time Embedding由Timesteps(时间步长)编码而来,引入Timesteps能够模拟一个随时间逐渐向图像加入噪声扰动的过程。每个Timestep代表一个噪声强度(较小的Timestep代表较弱的噪声扰动,而较大的Timestep代表较强的噪声扰动),通过多次增加噪声来逐渐改变干净图像的特征分布。下图是一个简单的加噪声流程,可以帮助大家更好地理解SD训练时数据是如何加噪声的。首先从数据集中选择一张干净样本,然后再用random函数生成0-3一共4种强度的噪声,然后每次迭代中随机一种强度的噪声,增加到干净图片上,完成图片的加噪流程。SD训练集的加噪声流程【2】SD训练中加噪与去噪具体地,在训练过程中,我们首先对干净样本进行加噪处理,采用多次逐步增加噪声的方式,直至干净样本转变成为纯噪声。SD训练时的加噪过程接着,让SD模型学习去噪过程,最后抽象出一个高维函数,这个函数能在纯噪声中不断“优化”噪声,得到一个干净样本。其中,将去噪过程具像化,就得到使用U-Net预测噪声,并结合Schedule算法逐步去噪的过程。SD训练时的去噪过程
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的训练过程中。