信阳网站建设公司汉狮排名,网站建设帮助中心,wordpress手机底部导航栏设置,徐州圣道网络科技有限公司在2022年#xff0c;midjourney、DALL-E以及Stable Diffusion三个文生图模型引爆了机器生产文生图领域#xff0c;他们的模型能够在可控条件#xff08;标签、文本描述#xff09;下生成高分辨率、细节丰富的多样性图像#xff0c;这在视觉上往往难以与真实图像区分。本文…在2022年midjourney、DALL-E以及Stable Diffusion三个文生图模型引爆了机器生产文生图领域他们的模型能够在可控条件标签、文本描述下生成高分辨率、细节丰富的多样性图像这在视觉上往往难以与真实图像区分。本文发布的两周前FLUX.1 成了文生图领域的当红辣子鸡配套视频 以下是他们几个简单的效果对比图。 学术和工业界对他们采用的 Diffusion 模型兴趣迅速增长导致了大量的研究、改进和创新。这推动了技术的发展和成熟进一步扩大了它们的应用范围和影响力。
本篇文章通过一个汽车图片生成的无条件Diffusion模型阐述这一原理。
本篇所述的Diffusion模型基于2020年12月的论文《Denoising Diffusion Probabilistic Models》其是比较基础无条件的Diffusion 模型简称为DDPM模型。
其生成图片是从一个高斯白噪声图片一步一步去噪通常可能要100~1000步以获得高质量、细节丰富的图片其过程如下。
Diffusion生成图的过程
上面gif动图显示的是图像生成过程下面是一组静态图首先 X T ′ X_T XT′是一个纯高斯白噪声图片然后逐步去噪直到 X 0 ′ X_0 X0′逼近原始数据集效果的图片这里的 X 0 ′ X_0 X0′并不是原始训练集里图片。 生成的过程是一步步去噪每一步只去一点点那么问题来了如何估计每一步噪声量呢使用Diffusion模型来估计所以Diffusion模型输入应该是前一步的带噪图片 X t − 1 X_{t-1} Xt−1以及所在步数 t ∈ 1 , . . . T t \in {1,...T} t∈1,...T然后模型算出噪声 ϵ θ \epsilon_{\theta} ϵθ这样就可以得到噪声稍微少一点的图片 X t X t − 1 − ϵ θ X_tX_{t-1}-\epsilon_{\theta} XtXt−1−ϵθ了迭代去做直到得到 X 0 ′ X_0 X0′基本和训练集差不多。
这里有一个问题需要解决就是上面提到的模型算出噪声 ϵ θ \epsilon_{\theta} ϵθ模型好理解MLP、CNN、RNN、Transformer、Diffusion等不论使用哪个模型如何得到模型的参数集 θ \theta θ又称权重呢 θ \theta θ表示的可能有几千万~几十亿的参数量即几十亿个float值。要同时调节这几十亿个float值以使每一步的 ϵ θ \epsilon_{\theta} ϵθ逼近真实的情况显然乱试是不可能的。
这样好了我们先针对不同的 t t t对图片加噪声然后将带噪声的图片和时间 t t t送入模型让模型预测我们所加的噪声值根据模型预测的噪声和实际所加的噪声的差距来调节模型的参数只要数据量和样本足够多理论上参数集 θ \theta θ里的参数就可以调整到符合生成逼真图片的要求。权重参数收敛的过程使用的是梯度下降法梯度下降法在信号处理领域早就使用了。
接下来的问题是如何生成带噪的图片呢这个过程在DDPM里称为Diffusion process这里的 X 0 X_0 X0没有上标这是因为这个图片是来自数据集里的是模型训练之前就存在的图片。然后一步步加噪得到 X T X_T XT这里的 X 1 X_1 X1和Sampling的 X 1 ′ X_1 X1′在时间上是相同的但是因为噪声是随机的所以两张图片并不完全相同但是噪声量的差不多的。
通过这个过程对每一个图片都可以生成一系列的带噪图片每一个时间 t ∈ 1 , 2 , ⋯ , T t \in {1,2,\cdots,T} t∈1,2,⋯,T所加的噪声量由噪声调度器控制noise schedule原paper是t越大加的噪声越多到T的时候 x T \mathbf x_T xT和随机生成的噪声是没有差别的。
但是这里有一个问题就是在训练模型的时候并不是按照 X 1 , X 2 , ⋯ , X T X_1,X_2,\cdots,X_T X1,X2,⋯,XT的顺序给模型的 t t t是随机的所以假如 t 8 t8 t8要生成 X 8 X_8 X8我们需要生成 X 1 , X 2 , ⋯ , X 7 X_1, X_2,\cdots,X_7 X1,X2,⋯,X7显然这样生成训练所需要的带噪图片效率太低了这会浪费大量的算力。 从 t − 1 t-1 t−1时刻加噪得到 t t t时刻带噪图片的计算如下 q ( x t ∣ x t − 1 ) N ( x t ; 1 − β t x t − 1 ; β t I ) , ∀ t ∈ 1 , ⋯ , T q(\mathbf x_t|\mathbf x_{t-1}) N(\mathbf x_t;\sqrt{1-\beta_t}\mathbf x_{t-1}; \beta_t I), \forall t \in {1, \cdots,T} q(xt∣xt−1)N(xt;1−βt xt−1;βtI),∀t∈1,⋯,T X t ∣ X t − 1 X_t|X_{t-1} Xt∣Xt−1表示从 t − 1 t-1 t−1时刻图片 X t − 1 X_{t-1} Xt−1得到t时刻图片 X t X_t Xtq表示后验概率即观察到 X t X_t Xt时输入是 X t − 1 X_{t-1} Xt−1的概率 β t \beta_t βt是超参数事先定义好的公式1对应的图片表示如下 从时刻0到时刻T的这一加噪过程称为noise schedule噪声就是独立同分布的高斯白噪声只需要均值和方差这两个值就可以确定一个高斯分布也称正态分布确实比较简单还有拉普拉斯、泊松分布、狄拉克分布等等在Diffusion模型中更简单只使用了方差 β \beta β这一个参数因为均值是0。
上面的步骤可以生成任意时刻的带噪图片但是效率有些低有没有办法一次性生成任意时刻的图片而不用迭代呢这样效率会高很多根据公式1即从 x 0 x_0 x0可以生成 x 1 x_1 x1从 x 1 x_1 x1再生成 x 2 x_2 x2通过一步步迭代计算 q ( x t ∣ x 0 ) q(x_t|x_0) q(xt∣x0)看看有没有规律。 从上面的图示可以看到可以从 X 0 X_0 X0一步生成 X 2 X_2 X2那按照递推公式应该是可以一步生成 X t X_t Xt这里不再详细推导感兴趣可以自行推导这里直接给出公式 X t α ‾ t X 0 1 − α ‾ t ϵ X_t\sqrt{\overline \alpha_t}X_0 \sqrt{1-\overline \alpha_t}\epsilon Xtαt X01−αt ϵ α t \alpha_t αt α ‾ t \overline \alpha_t αt以及 β t \beta_t βt三者之间的关系。 α t 1 − β t \alpha_t1-\beta_t αt1−βt α ‾ t α 1 α 2 ⋯ α t \overline \alpha_t\alpha_1 \alpha_2\cdots\alpha_t αtα1α2⋯αt
前面说了 β t \beta_t βt是noise schedule的参数通常T选择比较大如1000然后就可以确定所有的 β \beta β,然后 α t \alpha_t αt α ‾ t \overline \alpha_t αt也就确定了。
到这里我们已经了解了Diffusion生成图片的过程以及训练时带噪图片是怎么生成的了。接下来结合paper上的公式讲一下算法。
训练和推理
paper给出的两个公式如下traning使用的Diffusion一次生成带噪图片Sampling就是应用的时候生成图片。
Algorithm 1 训练过程
Training算法过程
首先这个是一个大的循序直到模型收敛之后才会停止收敛的标准就是训练时步骤5~6loss为判断依据。
第二行 x 0 \mathbf x_0 x0是一个干净的图就是训练集中的图
第三行从{1,T}中选择一个值通常T是一个比较大的值比如1000为了训练方便这里选择了300
第四步首先 N ( 0 , I ) N(0,I) N(0,I)是一个标准正态分布其均值是0标准差是1这一步是计算一个和汽车图大小一样的噪声图片是对每一个像素RGB加随机一个标准正态分布的噪声这种生成的噪声图被称为独立同分布的没有考虑像素点之间的关系但是效果好且简单所以一直都是用的独立同分布的噪声。
第五步$\sqrt{\overline \alpha_t} \mathbf x_0 \sqrt{1-{\overline \alpha_t}}\mathbf {\epsilon} 该式表示将训练集中的图 该式表示将训练集中的图 该式表示将训练集中的图\mathbf x_0 和图片尺寸大小相等的噪声 和图片尺寸大小相等的噪声 和图片尺寸大小相等的噪声\mathbf \epsilon 做一个 w e i g h t e d s u m 这里的 w e i g h t 是事先已经定好的 做一个weighted sum这里的weight是事先已经定好的 做一个weightedsum这里的weight是事先已经定好的{\overline {\alpha}_1,\overline {\alpha}_2, \cdots, \overline {\alpha}_T} 当第三步中的 t 取哪个值这里的 当第三步中的t取哪个值这里的 当第三步中的t取哪个值这里的\overline {\alpha} 就取哪一个通常 就取哪一个通常 就取哪一个通常\overline {\alpha}_t$取值随着t的增加而减少即t越大加的噪声就越多权重相加之后得到的是带噪图片 ϵ θ ( α ‾ t x 0 1 − α ‾ t ϵ , t ) \mathbf \epsilon_{\theta}(\sqrt{\overline \alpha_t} \mathbf x_0 \sqrt{1-{\overline \alpha_t}}\mathbf {\epsilon} ,t) ϵθ(αt x01−αt ϵ,t)这是噪声预测器就是Diffusion模型即给定带噪图片和该时刻时间值预测图片加的噪声是多少很明显理想情况下模型预测的就是t时刻加的噪声 ϵ \mathbf {\epsilon} ϵ但是由于模型参数一开始是随机的所以预测值和真实值之间必然存在差异所以就用这个差异来做为loss的基准直到误差足够小即图中的converged条件满足。
Sampling算法过程
因为是从纯噪图片里面生成图片所以每一步都是一个去噪的过程那噪声是多少呢这个是Diffusion model做的事Diffusion model去预测噪声然后一步步迭代去减掉噪声。 1.首先生成一个独立同分布的噪声 x T \mathbf x_T xT
2.2~5这几行是一个T次的循环循环的目的是逐步去噪声第三行是再次生成一个独立同分布的噪声 z \mathbf z z作用后面再讲。 x t \mathbf x_t xt是上一步生产的图对于第一步就是 x T \mathbf x_T xT ϵ θ ( x t , t ) \mathbf \epsilon_{\theta}(\mathbf x_t, t) ϵθ(xt,t)这步就是调用前面训练得到的Diffusion模型根据上一步产生的图和t预测图片的噪声
背后的数学原理
对于一个训练好的模型(一般用 θ \theta θ表示其参数集其得到一张训练集中的图片的概率可以表示成如下公式 P θ ( x 0 ) ∫ x 1 : x T P ( x T ) P θ ( x T − 1 ∣ x T ) ⋯ P θ ( x t − 1 ∣ x t ) ⋯ P θ ( x 0 ∣ x 1 ) d x 1 : x T P_{\theta}(x_0) \int \limits_{x_1:x_T}P(x_T)P_{\theta}(x_{T-1}|x_T)\cdots P_{\theta}(x_{t-1}|x_t)\cdots P_{\theta}(x_{0}|x_1)dx_1:x_T Pθ(x0)x1:xT∫P(xT)Pθ(xT−1∣xT)⋯Pθ(xt−1∣xt)⋯Pθ(x0∣x1)dx1:xT 模型最优的参数应该是使得所有图片的概率最高这样得到的模型输出的分布最接近原始数据集的分布这可以表示为 θ ∗ arg max θ ∏ i 1 m P θ ( x i ) \theta^*\arg \max \limits_{\theta}\prod_{i1}^mP_{\theta}(x^i) θ∗argθmax∏i1mPθ(xi) arg max θ log ∏ i 1 m P θ ( x i ) \arg \max \limits_{\theta}\log\prod_{i1}^mP_{\theta}(x^i) argθmaxlog∏i1mPθ(xi) a r g max θ ∑ i 1 m log P θ ( x i ) arg \max \limits_{\theta}\sum_{i1}^m \log P_{\theta}(x^i) argθmax∑i1mlogPθ(xi) q ( x 1 ∣ x 0 ) q(x_1|x_0) q(x1∣x0)表示在有原图时得到第一步带噪图片 x 1 x_1 x1的概率则一直加噪得到带噪 x T x_T xT图的概率可以表示为 q ( x 1 : x T ∣ x 0 ) q(x_1:x_T|x_0) q(x1:xT∣x0)这也是加噪过程其表达的式是 q ( x 1 : x T ∣ x 0 ) q ( x 1 ∣ x 0 ) q ( x 2 ∣ x 1 ) ⋯ q ( x T ∣ x T − 1 ) q(x_1:x_T|x_0)q(x_1|x_0)q(x_2|x_1)\cdots q(x_T|x_{T-1}) q(x1:xT∣x0)q(x1∣x0)q(x2∣x1)⋯q(xT∣xT−1)
噪声 σ t z \sigma_t \mathbf z σtz作用 σ t z \sigma_t \mathbf z σtz前面说了sampling的过程实际是去噪声的过程Diffusion model就是预测噪声用的为什么这里反而要额外加一个微小的噪声呢这是因为每一步模型生成的都是概率最高的噪声经过一步步的迭代强化之后得到最终会是概率最高的唯一图片从大语言模型的最后的temp值就是控制生成过程的随机性。对于一句话如果每一个字的概率都是最高的反而是不好的比如这一段的内容并不是每一个字的概率都是最高的。
模型中的t
positional Embedding
UNet
Diffusion模型结够采用UNet结构主要是CNN算子 [1] DDPM https://arxiv.org/abs/2006.11239
模型细节这里不展开了在代码实例中再展开。
欢迎大家点赞、关注以便及时收到更新提醒。 对应讲解视频https://www.bilibili.com/video/BV18pWieTEDP/ 代码地址https://github.com/shichaog/AI_model_explained
接下来看简单的例子后续在这个简单例子上继续深入包括
自己的数据集怎么处理多GPU训练标签、文本控制图片生成图片修复以及开源比较火的Stable Diffusion 1.5/3模型的部署推理等
下一篇还是先看代码和实例代码可以完全在CPU上训练这意味着即使没有GPU也可以跑代码理清里面的原理但训练的时间上会比较长。