Roxy's Library

Back

Diffusion Models in VAE view#

xx:数据,zz:隐空间变量

对于 VAE ,我们想要学习一个 pθ(xz)p_{\theta}(x|z) 作为一个 decoder 生成图像。但是为了优化这个神经网络,我们需要计算 pθ(x)p_{\theta}(x) ,但是积分不可行;使用贝叶斯公式又需要得到 pθ(zx)p_{\theta}(z|x) 。于是引入了 qϕ(zx)q_{\phi}(z|x) 作为一个可学习的神经网络来逼近 pθ(zx)p_{\theta}(z|x) ,以及使用了 ELBO 作为损失函数进行优化

VAErecap

VAE 的隐空间是一个简单的高斯分布,很难完全描述图像信息,因此生成的图像比较模糊。Diffusion Model 的思路就是多做几层隐空间

我们先来看一个简单的两层的:z1z2z_1,z_2

p(x)=z1z2p(x,z1,z2)dz1dz2p(x) = \int_{z_1}\int_{z_2} p(x,z_1,z_2) \mathrm{d}z_1 \mathrm{d}z_2

这个 p(x,z1,z2)p(x,z_1,z_2) 是一个联合分布,在这里我们假设它具有马尔可夫性

twolayers

我们就可以一步一步去 sample z

实际上 Diffusion Model 的这个链条很长,我们设一共有 TT 层 latent varible,分别从 x1x_1xTx_T

LongChain

加噪#

x0x_0xTx_T 被称为加噪过程,这个过程中用到的分布 q(xtxt1)q(x_t|x_{t-1}) 不需要被学习,而是确定为 N(xT;xt11βt,βtI)N(x_T;x_{t-1}\sqrt{1-\beta_t},\beta_t I)βt\beta_t 是超参

至于为什么要这么设计,看下面的图:

addNoise

相当于不用一步一步从 x0x_0 走到 xTx_T,可以直接计算 q(xtx0)q(x_t|x_0)

βt\beta_t 的设计思想:让αˉT0\bar \alpha_T \to 0,这样 q(xTx0)N(xT;0,I)q(x_T|x_0)\approx N(x_T;0,I)

去噪#

xTx_Tx0x_0 被称为去噪过程,如果直接进行去噪,需要得到q(xt1xt)q(x_{t-1}|x_t),一般很难。因此引入和 VAE 相同的 trick,用神经网络来逼近 q(xt1xt)q(x_{t-1}|x_t)

denoise

其中 p(xT)p(x_T) 是先验,我们设为N(xT;0,I)N(x_T;0,I);每一次去噪步骤的条件概率我们设为 pθ(xt1xt)=N(xt1;μθ(xt,t),σt2I)p_{\theta}(x_{t-1}|x_t) = N(x_{t-1};\mu_{\theta}(x_t,t),\sigma_t^2 I),其中μ\mu是一个神经网络,σ2\sigma^2 其实不需要学习,具体原因后面会提到

Loss#

有了这些之后就可以估计损失函数,使用和 VAE 类似的方式:

Loss

Loss2

经过一堆数学推导得到:

LELBO=Ep[logpθ(x0x1)t=2TDKL(q(xt1xt,x0)pθ(xt1xt))DKL(q(xTx0)p(xT))]L_{ELBO} = E_p \left[\log p_{\theta}(x_0|x_1) - \sum_{t=2}^T D_{KL}(q(x_{t-1}|x_t,x_0)||p_{\theta}(x_{t-1}|x_t)) - D_{KL}(q(x_T|x_0)||p(x_T)) \right]

第一项和第三项都好计算,主要看第二项:

对于真正的后验概率 q(xt1xt,x0)q(x_{t-1}|x_t,x_0),由贝叶斯定理可以计算:

q(xt1xt,x0)=q(xtxt1,x0)q(xt1x0)q(xtx0)=q(xtxt1)q(xt1x0)q(xtx0)q(xtxt1)q(xt1x0)\begin{aligned} q(x_{t-1}|x_t, x_0) &= \frac{q(x_t|x_{t-1}, x_0) \cdot q(x_{t-1}|x_0)}{q(x_t|x_0)} \\ &= \frac{q(x_t|x_{t-1}) \cdot q(x_{t-1}|x_0)}{q(x_t|x_0)} \\ &\propto q(x_t|x_{t-1}) \cdot q(x_{t-1}|x_0) \end{aligned}
  • 第一行由贝叶斯公式
  • 第二行由于马尔可夫性,只和最近的有关
  • 第三行扔掉分母,因为分母是定值(变量为xt1x_{t-1}

这两个都是先验概率,可以由我们上面的加噪公式确定,因此 q(xt1xt,x0)q(x_{t-1}|x_t, x_0) 也是高斯,均值和方差可以由 q(xtxt1),q(xt1x0)q(x_t|x_{t-1}), q(x_{t-1}|x_0) 这两者求出

求得

q(xt1xt,x0)=N(xt1;μ~t(xt,x0),β~tI)β~t=1αˉt11αˉtβtμ~t(xt,x0)=αt1βt1αˉtx0+αt(1αˉt1)1αˉtxt\begin{aligned} q(x_{t-1}|x_t, x_0) &= N(x_{t-1};\tilde{\mu}_t(x_t, x_0),\tilde{\beta}_tI) \\ \tilde{\beta}_t &= \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \beta_t\\ \tilde{\mu}_t(x_t, x_0) &= \frac{\sqrt{\alpha_{t-1}} \beta_t}{1 - \bar{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t \end{aligned}

这里面 β~t\tilde{\beta}_t 是个定值,因此就不用计算 σ2\sigma^2 了。所以我们的目的变成了使得μ~t(xt,x0)μθ(xt,t)\tilde{\mu}_t(x_t, x_0)\approx \mu_{\theta}(x_t,t)

接下来进一步化简:

我们从加噪过程知道:

xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon

从中反解出x0x_0

x0=xt1αˉtϵαˉtx_0 = \frac{x_t - \sqrt{1 - \bar{\alpha}_t} \epsilon}{\sqrt{\bar{\alpha}_t}}

然后把 x0x_0 带入 μ~t\tilde{\mu}_t,合并计算后得到

μ~t=1αt(xtβt1αˉtϵ)\tilde{\mu}_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon \right)

回顾我们最开始的目标:让神经网络的预测均值 μθ\mu_\theta 去逼近这个完美均值 μ~t\tilde{\mu}_t

我们让模型去预测 μθ\mu_\theta,写成同样的结构:

μθ(xt,t)=1αt(xtβt1αˉtϵθ(xt,t))\mu_\theta(x_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{\beta_t}{\sqrt{1 - \bar{\alpha}_t}} \epsilon_\theta(x_t, t) \right)

等式两边只有 ϵ\epsilon 不同。所以,让 μθ\mu_\theta 等于 μ~t\tilde{\mu}_t,等价于让 ϵθ(xt,t)\epsilon_\theta(x_t, t) 等于当初加进去的那个噪声 ϵ\epsilon

因为这种等价关系,DDPM的训练目标就从让模型预测一个复杂的均值,变成了让模型预测出来的噪声,等于我们当初加进去的那个随机噪声

最终的损失函数就变为:

L=Et,x0,ϵ[ϵϵθ(xt,t)2]L = \mathbb{E}_{t, x_0, \epsilon} \left[ \| \epsilon - \epsilon_\theta(x_t, t) \|^2 \right]

Diffusion Models in flow_matching#

从flow matching的角度看扩散模型

从一张清晰的图片到一个噪声是一个不断将噪声加进去的过程,因此我们要学习一个模型,每一步去移出一点noise(每次直接减一个noise)

flow_matching

有两个空间:噪声空间和数据空间。zz来自噪声空间,xx来自数据空间

xtx_t是一个两个空间之间的线性插值,vv是从数据到噪声的向量(就是干净图片到噪声之间的差距)

对于给定的 xtx_ttt ,模型要正确预测 vv,训练的过程很直接.

对于Sample,模型不会一步预测出结果

flow_matching_sample

而是每次只沿着 vv 走一点,一步一步生成

Conditional Flow Matching#

Conditional_flow_matching

在普通 flow matching 上加一个 y 和一个 label,其他不变。预测的时候带上 y

Generative Model II
https://greyrats.xyz/blog/cvintro_06_10
Author GreyRat
Published at June 19, 2026
Comment seems to stuck. Try to refresh?✨