【没有哪个港口是永远的停留~论文解读】stable diffusion

了解整个流程:

  • 【第一部分】输入图像 x (W*H*3的RGB图像)
  • 【第一部分】x 经过编码器 \varepsilon 生成 z  (latent 空间的表示) h*w*c (具体设置多少有实验)
  • 【第二部分】z 逐步加噪得到 z_T,和噪声标签
  • 【第二部分】由 Unet( z_T ) 预测噪声与噪声标签得到loss, 训练
  • 【第三部分】由 Clip 得到 文本编码或者图像编码 。以改变K和V的方式添加到Unet
  • 【第二部分】训练后, Unet( 随机高斯 ,文本等条件)得到 z
  • 【第一部分】解码器D将 z  重建成RGB图像

本文将分为3个部分讲解生成模型全过程:

  • 第一部分:VAE 编码器
  • 第二部分:diffusion 扩散模型
  • 第三部分:多模态提示,微调

第一部分:VAE

代码:https://github.com/AntixK/PyTorch-VAE

论文:Auto-Encoding Variational Bayes

 

 如图所示是VAE部分的训练过程:

  • 图像编码得到 均值 (m1,m2,m3),方差(σ1,σ2,σ3),
  • exp(σi)的目的是为了保证这个预测的方差是个正值,
  • 按标准正态分布随机生成采样点(e1,e2,e3),重参数后相当于用预测出的高斯分布随机采样
  • VAE在encode层的输出结果(c1,c2,c3)。
  • 以(c1,c2,c3)重建原图
  • 重建原图和原图计算MSE loss
  • 外加惩罚项loss,使得预测分布接近标准正态分布

VAE的原理推导及代码

对于生成模型而言,主流的理论模型可以分为:

  1. 隐马尔可夫模型HMM
  2. 朴素贝叶斯模型NB
  3. 高斯混合模型GMM,而VAE的理论基础就是高斯混合模型。

什么是高斯混合模型呢?就是说,任何一个数据的分布,都可以看作是若干高斯分布的叠加。

 

代码实现 GMM 模型

VAE foreward:

def forward(self, input: Tensor, **kwargs) -> List[Tensor]:mu, log_var = self.encode(input)# mu : (B,128) 均值# log_var :(B,128) 方差z = self.reparameterize(mu, log_var) # 重参数return  [self.decode(z), input, mu, log_var]  # 解码

从代码可以看出来,mu 和 log_var 就是上图的若干个高斯分布,可以由均值和方差生成任意位置概率值

其中,重参数定义如下:

def reparameterize(self, mu: Tensor, logvar: Tensor) -> Tensor:std = torch.exp(0.5 * logvar)eps = torch.randn_like(std) # 返回与输入张量大小相同的张量,其中填充了均值为0 方差为1 的正态分布的随机值z = eps * std + mureturn z

可以看到,为每一对均值方差,都生成个随机采样

正态分布->标准正态分布: y = ( x - mu ) / std

标准正态分布-> 正态分布: x = y * std + mu

 

解码网络根据若干个高斯分布参数和 随机的样本 x 得到最终的原图

VAE decoder代码:

def decode(self, z: Tensor) -> Tensor:"""Maps the given latent codesonto the image space.:param z: (Tensor) [B x D]:return: (Tensor) [B x C x H x W]"""result = self.decoder_input(z)result = result.view(-1, 512, 2, 2)result = self.decoder(result)result = self.final_layer(result)return result

 损失:两部分(重建损失和KL损失)

kld_weight = kwargs['M_N'] # Account for the minibatch samples from the datasetrecons_loss =F.mse_loss(recons, input)  
kld_loss = torch.mean(-0.5 * torch.sum(1 + log_var - mu ** 2 - log_var.exp()))loss = recons_loss + kld_weight * kld_loss

公式推导

通过本部分的学习可以明白以下问题:

  1. 为什么是随机采样高斯分布上的点重建原图?
  2. 为什么是kl loss?
  3. 为什么kl loss 复杂表达式怎么来的?

 如下图:

  • 隐变量 z, 观测数据 x ,\theta 是 生成模型参数 ,\phi是预测的分布参数;
  • 实线表示生成模型p_{\theta }(z)p_{\theta }(x|z)
  • 虚线表示难以处理的后验p_{\theta }(z|x) 的变分近似 q_{\phi }(z|x)
  • 变分参数φ与生成模型参数θ联合学习
  • 隐变量 z (z_1,z_2,z_3....)由一些先验分布 pθ 生成;
  • x(x_1,x_2,x_3...),从一些条件分布 pθ(x|z)  生成

 我们通过能观测到的数据x,预测实际的分布参数z,采用最大似然函数的方法:

最大似然函数:样本 x_i, i :1,2,3...n(公式省略参数\theta

L(p(x))=\prod_{i=1}^{n}p(x_i)

 取log:

log L(p(x))=\sum_{i=1}^{n}logp(x_i)

当似然函数取得最大值时,\theta=\theta^{*}为所求

实际网络中函数是非凸函数,通过解析的方式直接求解\theta^{*}非常困难,因此采用迭代的方法逐步逼近最大值。那么这个迭代的方法称为EM算法(最大化期望),给定的训练样本 x_1,x_2,x_3... 样例间独立,我们想找到每个样例隐含的类别z,能使得p(x,z)最大。因此表达式就变成如下:

EM是一种两步迭代的方法:

1、初始化对参数 \theta 进行一次猜测 \theta_t

2、通过这个 \theta_t 得到 最大似然 的新表达---期望步骤

3、对这个新表达,求解最大值---------------最大化步骤

当迭代的数据量是一张图时,n=1时:

log L(p(x))=log p(x_i)

初始化一个参数 \theta 。(为了表示方便就不按迭代取名了) 根据EM算法,最大似然 的新表达:

\begin{aligned} log p_\theta (x_i) &=E_{z\sim q_\phi (z|x_i))}[logp_\theta (x_i)] \\ &=\int q_{\phi }(z|x_i)\cdot logp_\theta (x_i) dz \\ &=\int q_{\phi }(z|x_i)\cdot log\frac{p_\theta (x_i|z)\times p_\theta(z)}{p_\theta (z|x_i)} dz \\ &=\int q_{\phi }(z|x_i)\cdot log\frac{p_\theta (x_i|z)\times p_\theta(z)}{p_\theta (z|x_i)} \ast \frac{q_\varphi (z|x_i)}{q_\varphi (z|x_i)}dz \\ \end{aligned}

 拆成3部分后:

\begin{aligned} log p(x_i) &=\int q_{\phi }(z|x_i)\ast p_\theta (x_i|z) dz-\int q_{\phi }(z|x_i)\ast log \frac{q_\varphi (z|x_i)}{ p_\theta(z)} dz + \int q_{\phi }(z|x_i)\ast log\frac{q_{\phi }(z|x_i)}{p_{\theta }(z|x_i)}dz \\ &=\int q_{\phi }(z|x_i)\ast p_\theta (x_i|z) dz-D_{kl} (q_{\phi }(z|x_i)|| p_\theta(z)) + D_{kl} (q_{\phi }(z|x_i) || p_{\theta }(z|x_i)) \\ \end{aligned}

最后最大似然函数,求\phi分布的参数。变成使得等式右边最大值时\phi分布的参数。

等号右边第三个等式D_{kl} (q_{\phi }(z|x_i) || p_{\theta }(z|x_i)),近似值与真实后验值的KL散度,KL散度大于0。剩余部分是下界,最大值问题又变成最大下界问题。

等号右边第一个等式\int q_{\phi }(z|x_i)\ast p_\theta (x_i|z) dz 反映自动编码器的(Auto-Encoder-Decoder)性能: xi→z→xi,即经过编码  q_{\phi }(z|x_i)  和  解码  p_\theta (x_i|z)  的概率最大化,如果能重建的越好说明这部分取值最大,因此这部分就是Loss1MSE。

等号右边第二个等式-D_{kl} (q_{\phi }(z|x_i)|| p_\theta(z)) 是两个分布的相似度,分布q是 预测的高斯分布 , 分布p是标准正态分布,这部分越小,两个分布越相似,最终的似然函数越大。这部分就是Loss2 kl惩罚项。

  • q~N(u,σ^2)
  • p~N(0,1)

\begin{aligned} D_{kl}(N(\mu, \sigma^2 )||N(0,1)) &=\int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}\left ( log\frac{\frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}}{\frac{1}{\sqrt{2\pi}}e^{\frac{ -x^2 }{2 }}}\right ) \\ &= \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}\left ( log \frac{1}{\sigma } \frac{ e^{\frac{ -(x-\mu)^2 }{ 2 \sigma^2 }}}{e^{ -x^2/2 }}\right ) \\ &= \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}\left ( log \frac{1}{\sigma } +log e^{\frac{ -(x-\mu)^2 }{ 2\sigma^2 }}-log e^{ -x^2/2 }\right ) \\ &= \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}\left ( log \frac{1}{\sigma } +\frac{ -(x-\mu)^2 }{ 2\sigma^2 }+ \frac{x^2}{2} \right) \\ &=\frac{1}{2} \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}\left ( log \frac{1}{\sigma^2 } +\frac{ -(x-\mu)^2 }{ \sigma^2 }+ x^2 \right) \\ &=\frac{1}{2} \left (\int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}log \frac{1}{\sigma^2 }+ \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}\frac{ -(x-\mu)^2 }{ \sigma^2 }+ \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}x^2 \right ) \\ \end{aligned}

等号右边第一个式子:是常数项,是概率积分×常数

\begin{aligned} \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}log \frac{1}{\sigma^2 }dx&=\int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}dx\ast log \frac{1}{\sigma^2 }\\ &=1\ast log \frac{1}{\sigma^2 }\\ &=log \frac{1}{\sigma^2 }\\ \end{aligned}

等号右边第二个式子:可以拆成三个不同的期望求解

\begin{aligned} \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}\frac{ -(x-\mu)^2 }{ \sigma^2 }dx &=E_x[\frac{ -(x-\mu)^2 }{ \sigma^2 }]\\ &= \frac{1}{\sigma ^2}E_x[-x^2+2\mu x -\mu^2]\\ &= \frac{1}{\sigma ^2}\left (-E_x[x^2]+2\mu E_x[x] -\mu^2 \right ) \\ \end{aligned}

由于高斯分布的一阶矩、二阶矩表达式如下:

E_z[x] = \mu \\E_z[x^2] = \mu ^2+\sigma ^2

代入上式:

\begin{aligned} &= \frac{1}{\sigma ^2}\left (-E_x[x^2]+2\mu E_x[x] -\mu^2 \right ) \\ &= \frac{1}{\sigma ^2}\left (-(\mu ^2+\sigma ^2)+2\mu *\mu -\mu^2 \right ) \\ &= \frac{1}{\sigma ^2}*(-\sigma ^2) \\ &= -1 \\ \end{aligned}

等号右边第三个式子:可以看到就是二阶矩,因此:

\int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}x^2=E_x[x^2]=\mu ^2+\sigma ^2

代入三部分的化简,最后KL散度的值为:

\begin{aligned} D_{kl}(N(\mu, \sigma^2 )||N(0,1)) &=\frac{1}{2} \left (\int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}log \frac{1}{\sigma^2 }+ \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}\frac{ -(x-\mu)^2 }{ \sigma^2 }+ \int \frac{1}{\sqrt{2\pi \sigma ^2}}e^{\frac{ -(x-\mu)^2 }{2 \sigma^2 }}x^2 \right ) \\ &=\frac{1}{2}\left ( log\frac{1}{ \sigma^2 }-1+ \mu ^2+\sigma ^2\right ) \end{aligned}

到此,KL散度的loss推导结果:\frac{1}{2}\left ( log\frac{1}{ \sigma^2 }-1+ \mu ^2+\sigma ^2\right )

对比代码部分:完全一致

kld_loss = torch.mean(-0.5 * torch.sum(1 + log_var - mu ** 2 - log_var.exp()))

-----------------------------------------------------vae end----------------------------------------

第二部分:扩散模型

论文:https://arxiv.org/abs/2112.10752

代码:GitHub - CompVis/latent-diffusion: High-Resolution Image Synthesis with Latent Diffusion Models

本部分分两个模块讲解

  1. 训练阶段
  2. 推理生成阶段
  3. 网络结构

2.1 训练阶段

由VAE编码器得到高维特征z,扩散模型训练、推理的维度都在这个空间进行

如下图所示,是把z逐渐加噪的过程

有加噪系数 \beta 随着加噪次数增多加噪力度也越来越大,实际代码 \beta 取值范围[0.00001,0.002]

\alpha =1-\beta

z 加噪到第 t 次 ,特征变成 Xt,它是由Xt-1生成的,表达式如下:

x_t=\sqrt{\alpha }\ast x_ {t-1}+\sqrt{1-\alpha } \ast z_{t}

可以看到,由于 \beta 越来越大 \alpha 越来越小,也就是 Xt-1影响权重越来越小,噪音权重越来越大。

由于这个逐步加噪的过程都是常数,因此可以直接生成某次加噪的结果和噪音标签。但是具体怎么生成呢?

\begin {aligned} x_t&=\sqrt{\alpha_t }\ast x_ {t-1}+\sqrt{1-\alpha_t } \ast z_{t} \\ &=\sqrt{\alpha_t }\ast (\sqrt{\alpha_{t-1} }\ast x_ {t-2}+\sqrt{1-\alpha_{t-1} } \ast z_{t-1} )+\sqrt{1-\alpha_t } \ast z_{t} \\ &=\sqrt{\alpha_t } \sqrt{\alpha_{t-1} }\ast x_ {t-2}+\sqrt{\alpha_t }\sqrt{1-\alpha_{t-1} } \ast z_{t-1} +\sqrt{1-\alpha_t } \ast z_{t} \\ \end {aligned}

其中:噪声 z_{1},z_{2},...,z_{t-1},z_{t} 是均随机采样自 标准正态分布 N(0,1).

因此:

\sqrt{1-\alpha_t } \ast z_{t} 服从 N( 0, 1-\alpha_t)

\sqrt{\alpha_t }\sqrt{1-\alpha_{t-1} } \ast z_{t-1}服从 N(  0,\alpha_t (1-\alpha_{t-1}) )

 看原式后两项,是两个分布相加,就是一个新的高斯分布 N(  0,\alpha_t (1-\alpha_{t-1})+1-\alpha_t ) 化简后:N(  0,1-\alpha_t \alpha_{t-1} ) 换成由标准正太分布表示的形式:\sqrt{1-\alpha_t \alpha_{t-1}}z,带回原式子:

\begin {aligned} x_t&=\sqrt{\alpha_t } \sqrt{\alpha_{t-1} }\ast x_ {t-2}+\sqrt{\alpha_t }\sqrt{1-\alpha_{t-1} } \ast z_{t-1} +\sqrt{1-\alpha_t } \ast z_{t} \\ &=\sqrt{\alpha_t } \sqrt{\alpha_{t-1} }\ast x_ {t-2}+\sqrt{1-\alpha_{t-1}\alpha_{t} } \ast z \\ \end {aligned}

一直的递归下去,直到x0,可以得到:其中z是标准正态分布做的随机噪声

x_t=\sqrt{\prod_{i}^t \alpha i}\ast x_0+\sqrt{1-\prod_{i}^t \alpha i}\ast z

那么这个 x_t 就是我们想得到的任意时刻的加噪图片。

因此,训练流程

        repeat:

                1、数据集采样 x_0

                2、随机选取一个时刻 t (1~2000)

                3、制作标签: t 时刻 图像上加的噪声 \epsilon~N(0,1)

                4、计算梯度,由如下损失:\epsilon _\theta 是噪声预测网络

||\epsilon -\epsilon _\theta (x_t,t)||=||\epsilon -\epsilon _\theta (\sqrt{\overline{\alpha} }x_0+\sqrt{1-\overline{\alpha} }\epsilon ,t)||

2.2 生成过程

现在再看逆向的过程:由 x_t 逐渐得到 x_0,扩散模型的预测噪声是一步一步预测的,也就是一步一步 逆向 先看由 x_tx_{t-1},那么由概率表示就是 q(x_{t-1}|x_t),而我们已知 q(x_t|x_{t-1}),因此对其进行贝叶斯替换后:(第一行省略x0方便理解)

\begin {aligned} q(x_{t-1}|x_t)&=q(x_t|x_{t-1})\frac{q(x_{t-1})}{q(x_t)}\\ q(x_{t-1}|x_t,x_0)&=q(x_t|x_{t-1},x_0)\frac{q(x_{t-1}|x_0)}{q(x_t|x_0)} \end{aligned}

其中:等式右边的概率均可由前向推理表达出来,一切均由x0得到,上面第一行省略条件x0,由于下式子的展开需要用到x0因此不省略了

q(x_t|x_{t-1},x_0) 就是迭代加噪:

x_t=\sqrt{\alpha }\ast x_ {t-1}+\sqrt{1-\alpha } \ast z  ,服从N(\sqrt{\alpha_t }x_0,1-\alpha_t)

q(x_t|x_0)x_0 前向加噪到 x_t

x_t=\sqrt{\prod_{i}^t \alpha i}\ast x_0+\sqrt{1-\prod_{i}^t \alpha i}\ast z ,服从N(\sqrt{\prod_{i}^t \alpha_i}\ast x_0,1-\prod_{i}^t \alpha_i)

q(x_{t-1}|x_0)x_0 前向加噪到 x_{t-1}

x_t=\sqrt{\prod_{i}^{t-1} \alpha_i}\ast x_0+\sqrt{1-\prod_{i}^{t-1} \alpha_i}\ast z ,服从N(\sqrt{\prod_{i}^{t-1} \alpha_i}\ast x_0,1-\prod_{i}^{t-1} \alpha_i)

因此逆向的 q(x_{t-1}|x_t,x_0) ,就可以由三个高斯分布重新表示:

由于已知三个高斯分布的均值和方差,因此其概率密度就可以表示出来,带回到原贝叶斯公式:

\begin {aligned} q(x_{t-1}|x_t) &=q(x_t|x_{t-1})\frac{q(x_{t-1})}{q(x_t)}\\ q(x_{t-1}|x_t,x_0) &=q(x_t|x_{t-1},x_0)\frac{q(x_{t-1}|x_0)}{q(x_t|x_0)} \\ &=\frac{1}{\sqrt{2\pi (1-\alpha _t)}}exp(\frac{-(x_t-\sqrt{\alpha _t}*x_{t-1})^2}{2(1-\alpha _t)}) \times \frac{1}{\sqrt{2\pi (1-\prod_i^{t-1}\alpha _i)}}exp(\frac{-(x_{t-1}-\sqrt{\prod_i^{t-1}\alpha _i}*x_{0})^2}{2(1-\prod_i^{t-1}\alpha _i)}) \div \frac{1}{\sqrt{2\pi (1-\prod_i^{t}\alpha _i)}}exp(\frac{-(x_t-\sqrt{\prod_i^{t}\alpha _i}*x_{0})^2}{2(1-\prod_i^{t}\alpha _i)}) \\ \end{aligned}

可以看到等号右边的所有exp前都有常数项,因此上面等式可以化简为,正比于:

\begin {aligned} & \propto exp(-\frac{1}{2}(\frac{(x_t-\sqrt{\alpha _t}*x_{t-1})^2}{1-\alpha _t}+\frac{(x_{t-1}-\sqrt{\prod_i^{t-1}\alpha _i}*x_{0})^2}{1-\prod_i^{t-1}\alpha _i}-\frac{(x_t-\sqrt{\prod_i^{t}\alpha _i}*x_{0})^2}{1-\prod_i^{t}\alpha _i})) \\ & \propto exp(-\frac{1}{2}(\frac{x_t^2-2x_t\sqrt{\alpha _t}*x_{t-1}+\alpha _t*x_{t-1}^2}{1-\alpha _t}+\frac{x_{t-1}^2-2x_{t-1}\sqrt{\prod_i^{t-1}\alpha _i}*x_{0}+\prod_i^{t-1}\alpha _i*x_{0}^2}{1-\prod_i^{t-1}\alpha _i}-\frac{(x_t-\sqrt{\prod_i^{t}\alpha _i}*x_{0})^2}{1-\prod_i^{t}\alpha _i})) \\ & \propto exp(-\frac{1}{2}( (\frac{\alpha_t}{\beta _t} + \frac{1}{1-\prod _i^{t-1}\alpha _i})x_{t-1}^2- (\frac{2\sqrt{\alpha_t}}{\beta _t}x_t +\frac{2\sqrt{\prod _i^{t-1}\alpha _i}}{1-\prod _i^{t-1}\alpha _i}x_0 )x_{t-1} + C(x_t,x_0))) \\ \end{aligned}

其中C是常数项,不用管。

对于任意高斯分布都有:

exp(-\frac{(x-\mu)^2}{2\sigma ^2})=exp(-\frac{1}{2}(\frac{1}{\sigma^2 }x^2-\frac{2\mu}{\sigma ^2}x+\frac{\mu^2}{\sigma ^2}))

通过平方项和一次项参数求解 均值&方差 因此:

\prod_i^{t-1}\alpha _i\overline{\alpha}_{t-1}  ;   令\prod_i^{t}\alpha _i\overline{\alpha}_{t}

\widetilde{\mu_t}(x_t,x_0)=\frac{\sqrt{\alpha _t}(1-\overline{\alpha }_{t-1})}{1-\overline{\alpha }_t}x_t+\frac{\sqrt{\overline{\alpha }_{t-1}}\beta _t}{1-\overline{\alpha }_t}x_0

上面得到分布 q(x_{t-1}|x_t,x_0) 的均值和方差,可以看到均值里面包含x_0,由于推理阶段x_0是未知的,但是可以由x_t 表达出来:

x_tx_0得到,逆向一下,那么x_0也可以由x_t表示:

x_t=\sqrt{\overline{\alpha}_t}\ast x_0+\sqrt{1-\overline{\alpha}_t}\ast z \\ x_0=\frac{1}{\sqrt{\overline{\alpha}_t}}(x_t-\sqrt{1-\overline{\alpha}_t}\ast z)

x_0 重新代入均值表达式:

\widetilde{\mu_t}(x_t)=\frac{1}{\sqrt{\alpha _t}}(x_t+\frac{1-\alpha _t}{\sqrt{1-\overline{\alpha} _t}}\epsilon (x_t,t))

到此 q(x_{t-1}|x_t,x_0) 的均值和方差都是已知的了,使用重采样方法得到 x t-1,其中z~N(0,1)

x_ {t-1}=\mu+\sigma * z

将均值和方差代入:(方差是固定值,暂时由σ表示)

x_ {t-1}=\frac{1}{\sqrt{\alpha _t}}(x_t+\frac{1-\alpha _t}{\sqrt{1-\overline{\alpha} _t}}\epsilon (x_t,t))+\sigma * z

到此已经得到所有公式的推导。

因此,推理流程       

         1、随机生成个高斯噪声 x_t ~N(0,1),噪声预测模型\epsilon

         2、 for   t   in   [T,T-1,......1]:

                    z ~N(0,1)    if t>1 else z=0

                    x_ {t-1}=\frac{1}{\sqrt{\alpha _t}}(x_t+\frac{1-\alpha _t}{\sqrt{1-\overline{\alpha} _t}}\epsilon (x_t,t))+\sigma * z

         3、return x_0

下图理解起来更容易:

网络结构        

噪声预测模型的网络结构总体是UNet的形状,其中的block是crossAttention

去噪的过程就是重复执行Unet,逐步降噪

具体网络结构如下:

可以看到每个block都有次数 t 的位置编码加入,本来代表加噪次数的 t 在模型中是正余弦位置编码

 上图是Unet网络中的Time Embedding & crossAttention,可以看到代表次数的位置编码Time Embedding是通过线性变换后直接加到原特征图上。

下图是具体的Block结构

第三部分: 微调方法

上图可以看出其他模态的数据&条件均通过交叉注意力中的K和V添加进网络

四种模型训练方法:

  • Textual Inversion(Embeddings):只训练成对的目标词语和图像,其他部分全部冻结
  • Hypernetwork:附加到Diffusion model的小型神经网络,用于修改其风格
  • LoRA:(Low-Rank Adaptation of Large Language Models) 改变权重来修改交叉注意力
  • DreamBooth:几张图像进行训练来更新整个扩散模型

Textual Inversion(Embeddings)

代码:GitHub - rinongal/textual_inversion

# 训练:如图,少量图像 和 新的词语 成对微调网络,其他词语冻结 
# 这样就可以使用模型原有的能力在我们提供的图像类别上了,风格角度等等
python main.py --base configs/latent-diffusion/txt2img-1p4B-finetune.yaml -t --actual_resume /path/to/pretrained/model.ckpt -n <run_name> --gpus 0, --data_root /path/to/directory/with/images # 训练集图像--init_word <initialization_word> # 初始化提示词注释:
txt2img-1p4B-finetune.yaml 配置文件中的↓ 需要修改placeholder_strings: ["*"]  # 为训练集图像类别initializer_words: ["sculpture"] # 初始化提示词推理时,可以使用文字提示 "a photo of *" 来生成图像
通常适用于转换图像风格
模型关键字尽量是不常见的词语

Hypernetwork

它是一个附加到Stable Diffusion model的小型神经网络,用于修改其风格。

的
原扩散模型的交叉注意力模块
添加了附加网络的交叉注意力模块

# 训练过程中 原本的stable Diffusion冻结不训练

# 仅训练 Hypernetwork-1&Hypernetwork-2

# 大约几十MB

# 通常训练艺术风格

# 推荐训练画风

 

LoRA

LoRA 模型类似Hypernetwork,它们都很小并且只修改交叉注意力模块。区别在于他们如何修改它。 LoRA 模型通过改变权重来修改交叉注意力。超网络通过插入额外的网络来实现这一点。 用户普遍发现 LoRA 模型能产生更好的结果。它们的文件大小相似,通常低于 200MB,并且比检查点模型小得多。

DreamBooth

base:embeding改的:https://github.com/XavierXiao/Dreambooth-Stable-Diffusion

是一种训练技术,通过对某个主题或风格的几张图像进行训练来更新整个扩散模型。它的工作原理是将提示中的特殊单词与示例图像相关联。

作者希望将输入图片中的物体与一个特殊标识符绑定在一起,即用这个特殊标记符来表示输入图片中的物体。因此作者为微调模型设计了一种prompt格式:

a [identifier] [class noun]

即:将所有输入图片的prompt都设置成这种形式,

其中

  1. identifier 是一个与输入图片中物体相关联的特殊标记符,
  2. class noun 是对物体的类别描述。

这里之所以在prompt中加入类别,是因为作者想利用预训练模型中关于该类别物品的先验知识,并将先验知识与特殊标记符相关信息进行融合,这样就可以在不同场景下生成不同姿势的目标物体

作者提出的方法,大致如下图所示,即仅仅通过3到5张图片去微调文生图模型,使得模型能将输入图片中特定的物品和prompt中的特殊标记符关联起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes(k8s):Namespace详解

Kubernetes&#xff08;k8s&#xff09;&#xff1a;Namespace详解 一、Namespace简介1.1 什么是Namespace1.2 Namespace的作用1.3 命名空间的分类 二、创建和管理Namespace2.1 创建Namespace2.2 管理Namespace 三、Namespace的实战应用3.1 部署多个项目3.2 环境隔离3.3 资源配…

从零开始配置kali2023环境:配置jupyter的多内核环境

在kali2023上面尝试用anaconda3&#xff0c;anaconda2安装实现配置jupyter的多内核环境时出现各种问题&#xff0c;现在可以通过镜像方式解决 1. 搜索镜像 ┌──(holyeyes㉿kali2023)-[~] └─$ sudo docker search anaconda ┌──(holyeyes㉿kali2023)-[~] └─$ sudo …

C++初阶——权限与继承

目录 一、C权限方面的问题 1.访问权限 2.继承机制 二、Cconst引用 const引用有以下几个特点 临时对象引用 常量引用成员变量 二、c引用空间相关问题 三.auto 一、C权限方面的问题 【C入门】访问权限管控和继承机制详解_权限继承功能-CSDN博客文章浏览阅读840次。(2)但…

YOLOv8训练自己的数据集(超详细)

一、准备深度学习环境 本人的笔记本电脑系统是&#xff1a;Windows10 YOLO系列最新版本的YOLOv8已经发布了&#xff0c;详细介绍可以参考我前面写的博客&#xff0c;目前ultralytics已经发布了部分代码以及说明&#xff0c;可以在github上下载YOLOv8代码&#xff0c;代码文件夹…

LVM和磁盘配额

一&#xff1a;LVM概述&#xff1a; LVM 是 Logical Volume Manager 的简称&#xff0c;译为中文就是逻辑卷管理。 能够在保持现有数据不变的情况下&#xff0c;动态调整磁盘容量&#xff0c;从而提高磁盘管理的灵活性 /boot 分区用于存放引导文件&#xff0c;不能基于LVM创建…

MongoDB vs MySQL:项目选择哪一个数据库系统?

由于市场上有各种可用的数据库&#xff0c;用户经常会就MongoDB与MySQL进行辩论&#xff0c;以找出更好的选择。 使用MySQL等关系数据库的组织在根据不断变化的需求管理和存储数据时可能会面临一定的困难。同时&#xff0c;新公司想知道选择什么数据库&#xff0c;这样他们就不…

【ArcGIS微课1000例】0085:甘肃省白银市平川区4.9级地震震中位置图件制作

据中国地震台网正式测定,12月31日22时27分在甘肃白银市平川区发生4.9级地震,震源深度10公里,震中位于北纬36.74度,东经105.00度。 文章目录 一、白银市行政区划图1. 县级行政区2. 乡镇行政区二、4.9级地震图件制作1. 震中位置2. 影像图3. 震中三维地形一、白银市行政区划图…

【LLM 】7个基本的NLP模型,为ML应用程序赋能

在上一篇文章中&#xff0c;我们已经解释了什么是NLP及其在现实世界中的应用。在这篇文章中&#xff0c;我们将继续介绍NLP应用程序中使用的一些主要深度学习模型。 BERT 来自变压器的双向编码器表示&#xff08;BERT&#xff09;由Jacob Devlin在2018年的论文《BERT:用于语言…

数据结构初阶之栈和队列(C语言版)

数据结构初阶之栈和队列&#xff08;C语言版&#xff09; ✍栈♈栈的结构设计♈栈的各个接口的实现&#x1f47a;StackInit(初始化)&#x1f47a;push&#xff08;入栈&#xff09;&#x1f47a;pop&#xff08;出栈&#xff09;&#x1f47a;获取栈顶元素&#x1f47a;获取栈中…

软件工程期末总结

软件工程期末总结 软件危机出现的原因软件生命周期软件生命周期的概念生命周期的各个阶段 软件开发模型极限编程 可行性研究与项目开发计划需求分析结构化分析的方法结构化分析的图形工具软件设计的原则用户界面设计结构化软件设计面向对象面向对象建模 软件危机出现的原因 忽视…

7.13N皇后(LC51-H)

算法&#xff1a; N皇后是回溯的经典题 画树&#xff1a; 假设N3 皇后们的约束条件&#xff1a; 不能同行不能同列不能同斜线 回溯三部曲&#xff1a; 1.确定函数参数和返回值 返回值&#xff1a;void 参数&#xff1a; int n&#xff1a;题目给出&#xff0c;N皇后的…

骨传导蓝牙耳机什么牌子好用?为你揭晓不踩雷的骨传导耳机排行

喜欢运动的朋友们&#xff0c;你们一定不能错过骨传导耳机&#xff01;它真的是我们运动时的好帮手。为什么这么说呢&#xff1f;因为它不会像普通耳机那样塞住我们的耳朵&#xff0c;让我们在运动时感觉不舒服&#xff0c;甚至伤害耳朵。而且&#xff0c;它还可以帮助我们听到…

如何选择适用于光束分析应用的工业相机?

为光束质量分析系统选择合适的相机时&#xff0c;需要考虑许多关键特性。例如&#xff1a; ◈ 合适的波长范围&#xff1a;支持准确拍摄和测量所需波长的光束。 ◈ 高空间分辨率&#xff1a;更好地分析光束特征&#xff0c;如光束宽度、形状和强度分布。 ◈ 合适的传感器尺寸…

ClickHouse基础知识(七):ClickHouse的分片集群

副本虽然能够提高数据的可用性&#xff0c;降低丢失风险&#xff0c;但是每台服务器实际上必须容纳全量数据&#xff0c;对数据的横向扩容没有解决。 要解决数据水平切分的问题&#xff0c;需要引入分片的概念。通过分片把一份完整的数据进行切 分&#xff0c;不同的分片分布到…

Sectigo和Certum的区别

为了保护用户在互联网的隐私&#xff0c;网站使用SSL数字证书为http明文传输协议加上安全套接层&#xff0c;对网站传输数据加密。Sectigo和Certum是正规的CA认证机构&#xff0c;它们颁发的SSL证书经过市场认证&#xff0c;已经兼容大多数浏览器以及终端&#xff0c;今天就随S…

令人吃惊的SLM34x系列SLM340CK-DG 通过国际安全标准兼容光耦的单通道隔离驱动器

40V, 1A兼容光耦的单通道隔离驱动器SLM34x系列SLM340CK-DG产品已通过UL1577认证&#xff0c;通过UL1577安规标准的认可&#xff0c;意味着产品已符合相关的国际安全标准&#xff0c;在产品质量及可靠性上。 关于UL1577科普&#xff1a; UL1577规范适用于光隔离器、磁隔离器以…

同城拼车约车顺风车/同城顺风车小程序/顺风车小程序/拼车小程序

同城拼车约车顺风车/同城顺风车小程序/顺风车小程序/拼车小程序 演示小程序搜索:上车信息 可以打开封装APP 套餐一:源码+包安装+包过审(无需许可证)=300 套餐二:全包服务 包服务器+域名+APP+免费认证小程序+H5+PC=800 包审核 PC端联系客服看 PC端+H5+公众号+小程序…

深度生成模型之自编码器与变分自编码器 ->(个人学习记录笔记)

文章目录 深度生成模型之自编码器与变分自编码器自编码器AE1. 定义2. 自编码器的应用 变分自编码器(VAE)1. 理论求解2. 模型求解3. 优化目标4. 再参数化策略 AE与VAE的对比AE与VAE的主要局限性 深度生成模型之自编码器与变分自编码器 自编码器AE 1. 定义 Auto-Encoder&#…

线性代数_对角矩阵

对角矩阵是线性代数中一种特殊的矩阵类型&#xff0c;它在数学理论和实际应用中都有着重要的地位。对角矩阵的定义如下&#xff1a; 设 \( A \) 是一个 \( n \times n \) 的方阵&#xff0c;如果满足除主对角线上的元素外&#xff0c;其他元素都为零&#xff0c;即 \( A_{ij} …

C语言---扫雷(Minesweeper)

扫雷 1 了解扫雷游戏1.1 基本规则1.2 基础知识1.2.1字符相减 2 实现过程1.1 棋盘设定1.2 初始化棋盘1.3 打印棋盘1.4 放置雷1.5 排查雷1.6 game()函数 3 完整代码3.1 Minesweeper.h3.2 Minesweeper.c3.3 Test.c 4 参考 1 了解扫雷游戏 点击右侧进入扫雷游戏网页版 1.1 基本规…