扩散模型入门——从EM算法到VAE

zhouyx 24 阅读 1 评论

EM算法的缺陷

EM算法通过迭代的方式解决了引入隐变量之后导致的没办法直接计算MLE的问题,但是在EM算法中,我们要求算隐变量的后验分布,但是在实际情况下,我们面临着很多情况

  • 有可能我们知道隐变量形式,但是无法计算后验分布

  • 有可能我们完全不知道隐变量的形式

在图像生成领域,我们通常确实没有“真实隐变量”的分布模型;隐变量是我们人为引入的建模工具,而不是数据背后已知存在的物理量。

VAE引入

而VAE就是解决第二种情况的其中一种方法,它的处理方式也非常的简单粗暴:

  • 不知道隐变量的先验分布模型——认为设定为标准高斯分布;

  • 不知道隐变量的后验分布——神经网络拟合;

  • 不知道最终输出的分布形式——神经网络拟合;

他的流程就变成了:

正态分布 ->(采样)->隐变量z -> 神经网络 -> x

回顾EM算法中的推导,极大似然函数可以写成下面的形式:

log⁡pθ(x)=∑zq(z)log⁡pθ(x,z)q(z)+DKL(q(z)∣∣pθ(z∣x))\log p_\theta(x)=\sum_zq(z)\log \frac{p_\theta(x,z) }{q(z) }+D_{KL}(q(z)||p_\theta(z|x))

前半部分就是ELBO,后半部分是一个KL散度,其中q(z) 是EM引入的一个任意分布,在EM算法中他被不断的代成隐变量 z 的后验分布,在VAE中,他做了两个限定处理:1.将这个分布限定形式为高斯分布;2.用神经网络拟合p(z|x)。最后就变成神经网络输入x 输出的是一个μ,σ ,这就是那个编码器,它实际上就是一个后验分布的拟合器,输入的是数据,输出的却是一个分布,分布的模型被设定为高斯分布,分布参数由网络给出

这样,整个式子就变成了:

log⁡pθ(x)=∑zqϕ(z)log⁡pθ(x,z)qϕ(z)+DKL(qϕ(z)∣∣pθ(z∣x))\log p_\theta(x)=\sum_zq_\phi(z)\log \frac{p_\theta(x,z) }{q_\phi(z) }+D_{KL}(q_\phi(z)||p_\theta(z|x))

从后面一项可以看出,当编码器的输出贴近后验分布时,ELBO将会达到最大值,所以说最大化ELBO实际上是在最大化

∑zqϕ(z∣x)log⁡pθ(x,z)qϕ(z∣x)\sum_zq_\phi(z|x)\log \frac{p_\theta(x,z) }{q_\phi(z|x) }

这是相当合理的,实际上就相当于前面的计算EM算法的E步被替换成了神经网络直接输出;

那ELBO的评估也顺理成章的可以写成:

ELBO⁡(x;θ,ϕ)=∫qϕ(z∣x)log⁡pθ(x,z)qϕ(z∣x) dz=∫qϕ(z∣x)log⁡pθ(x∣z)p(z)qϕ(z∣x) dz=∫qϕ(z∣x)log⁡pθ(x∣z) dz+∫qϕ(z∣x)log⁡p(z)qϕ(z∣x) dz=∫qϕ(z∣x)log⁡pθ(x∣z) dz−∫qϕ(z∣x)log⁡qϕ(z∣x)p(z) dz\begin{aligned} \operatorname{ELBO}(x;\theta,\phi) &= \int q_\phi(z\mid x) \log \frac{p_\theta(x,z)}{q_\phi(z\mid x)}\,dz \\[8pt] &= \int q_\phi(z\mid x) \log \frac{p_\theta(x\mid z)p(z)}{q_\phi(z\mid x)}\,dz \\[8pt] &= \int q_\phi(z\mid x)\log p_\theta(x\mid z)\,dz + \int q_\phi(z\mid x) \log \frac{p(z)}{q_\phi(z\mid x)}\,dz \\[8pt] &= \int q_\phi(z\mid x)\log p_\theta(x\mid z)\,dz - \int q_\phi(z\mid x) \log \frac{q_\phi(z\mid x)}{p(z)}\,dz \end{aligned}

第一项为期望,第二项为一个散度,可以写为:

ELBO⁡(x;θ,ϕ)=Eqϕ(z∣x)[log⁡pθ(x∣z)]−DKL(qϕ(z∣x)∥p(z))\boxed{ \operatorname{ELBO}(x;\theta,\phi) = \mathbb{E}_{q_\phi(z\mid x)} \left[\log p_\theta(x\mid z)\right] - D_{\mathrm{KL}}\left( q_\phi(z\mid x)\|p(z) \right) }

第一项定义为一个J1 他是一个期望,可以使用蒙特卡洛方法来计算,第二个定义为J2是一个KL散度(注意,这是ELBO拆出来的散度,不是上面的那个散度)

当然,在这里出现了log⁡pθ(x∣z) \log p_\theta(x\mid z),这实际上是已知隐变量生成了数据,所以我们称之为解码器,在这使用蒙特卡洛方法来估算第一项,具体步骤为:

  • 第一步:采样隐变量

    [z(1),…,z(L)∼qϕ(z∣x)][ z^{(1)},\ldots,z^{(L)}\sim q_\phi(z\mid x) ]

    对于同一张真实图像 xx,从编码器给出的分布中采样多个不同的 zz

  • 第二步:计算每个样本的对数似然

    [ℓl=log⁡pθ(x∣z(l))][ \ell_l=\log p_\theta(x\mid z^{(l)}) ]

    将每个 (z(l))(z^{(l)}) 输入解码器,计算真实图像(x)(x)在解码器输出的概率分布下的对数概率密度。

  • 第三步:求平均

    [L^rec=1L∑l=1Lℓl][ \widehat{\mathcal L}_{\mathrm{rec}}=\frac{1}{L}\sum_{l=1}^{L}\ell_l ]

    用多个采样结果的平均值,近似原本难以直接计算的期望。

假设解码器输出的也是高斯分布[pθ(x∣z)=N(x;μθ(z),σx2I)][ p_\theta(x\mid z) = \mathcal N\left(x;\mu_\theta(z),\sigma_x^2I\right) ],那么他的对数概率密度就是:

[log⁡pθ(x∣z)=−D2log⁡(2πσx2)−∥x−Gθ(z)∥222σx2][ \log p_\theta(x\mid z) = -\frac{D}{2}\log(2\pi\sigma_x^2) -\frac{\|x-G_\theta(z)\|_2^2}{2\sigma_x^2} ]

带入蒙特卡洛:

L^rec=−D2log⁡(2πσx2)−12Lσx2∑l=1L∥x−Gθ(z(l))∥22 \boxed{ \widehat{\mathcal L}_{\mathrm{rec}} = -\frac{D}{2}\log(2\pi\sigma_x^2) -\frac{1}{2L\sigma_x^2} \sum_{l=1}^{L} \|x-G_\theta(z^{(l)})\|_2^2 }

这里假设每个采样对应相同的固定方差。J1这一项实际表明的是采样的图像和生成的图像的相似性,所以我们把这一项叫做重构误差项,忽略掉不影响参数的常数项,并且将蒙特卡洛设置为单样本采样,实际上优化这一项可以整理为:

J1=−12Σd=1D(xd−x^d)2+constJ_1 = -\frac{1}{2} \Sigma_{d=1}^D(x_d-\hat{x}_d )^2+const

实际上就变成了预测值和采样值的二范数...

对于第二项J2 两个高斯分布的KL散度是有闭式解的

p=N(μ1,Σ1),q=N(μ2,Σ2)DKL(p ∥ q)=12[log⁡det⁡Σ2det⁡Σ1−d+tr⁡(Σ2−1Σ1)+(μ2−μ1)⊤Σ2−1(μ2−μ1)]p=N(μ_1,Σ_1),q=N(μ_2,Σ_2 ) \\ D_{\mathrm{KL}}(p\,\|\,q) = \frac{1}{2}\left[ \log\frac{\det\Sigma_2}{\det\Sigma_1} - d + \operatorname{tr}\left(\Sigma_2^{-1}\Sigma_1\right) + (\mu_2-\mu_1)^{\top}\Sigma_2^{-1}(\mu_2-\mu_1) \right]

这一项实际上是在让编码器编码出来的后验分布逼近标准正态分布,最终VAE就把一个标准高斯做成了一个映射为数据分布的一个函数。我是这么理解的

所以VAE的训练实际上就是在同时训练解码器,编码器,训练的目的就是最大化ELBO。

前面的推导实际上是从EM算法逐步推导过来的,实际上,我们可以忽略掉EM过渡过来的过程,而是来直接思考VAE更抽象的过程:

从生成式模型的角度看,生成数据的核心是两个要素:一是一个易于采样的初始概率分布,二是从该分布到真实数据分布的生成映射。 VAE 通常将隐变量的先验设为标准高斯分布,并通过解码器学习从隐变量到数据的生成规律。其难点在于,训练时需要知道如何为每个真实样本找到合适的隐变量表示。为此,VAE 引入编码器,通过神经网络将真实数据映射为隐变量的近似后验分布,并利用重构项训练解码器,同时通过 KL 正则项约束近似后验与先验之间的差异,使编码得到的隐变量分布与生成时使用的先验相协调。因此,编码器主要服务于生成模型的训练,而解码器负责学习最终的生成过程;训练完成后,可以直接从先验分布采样,并通过解码器生成新数据。 需要注意的是,KL 正则化并不保证聚合后验严格等于标准高斯分布,而是在保留数据信息与匹配先验之间进行权衡。