VAE && DDPM

DDPM

今天跟着李宏毅老师学习Diffusion Model的原理:【扩散模型 - Diffusion Model【李宏毅2023】】 https://www.bilibili.com/video/BV14c411J7f2/?p=3&share_source=copy_web&vd_source=a7945018d35cf6efabcda5a3ae66fca6

VAE部分的学习:变分自编码器VAE:原来是这么一回事 | 附开源代码 - PaperWeekly的文章 - 知乎 https://zhuanlan.zhihu.com/p/34998569




Workflow:Diffusion Model的加噪与去噪大致过程演示图如下:

image

而在原文章中,关于Training和Inference两个阶段的伪代码如下:

image

下面内容主要就是围绕着这两个步骤进行叙述




一、Traninig:训练的大致过程如下:

1、选择一张原始的干净图像

2、采样均值为0,方差为1的高斯噪声

3、使用\({\overline{\alpha t}}\)来表示一个图像与噪声的权重,这个数值会随着加噪时间步\(t\)逐渐变小,也就意味着噪声的占比越来越大(从某个博主看到的观点:因为前面加噪过程中,图像的噪声化较为明显,越到后面则加噪的影响表现越小,为了平衡\(x_t\)和\(\epsilon\)这两者之间的关系所以引入了这种变化规律的系数),而后对图像进行加权加噪

4、加噪后,我们需要训练一个Noise Predictor,给定加噪的图像和当前的时间步,预测出噪声

image




二、图像生成模型的机理:对于一个图像生成模型而言,大致的流程如下:

image

给定一个原始图像数据的分布为\(P_{data}(x)\),我们需要通过一个模型学习如何生成这些图像,假定模型生成的分布为\(P_{\theta}(x)\)。实际上,我们对于\(P_{\theta}(x)\)这种复杂的分布是很难计算的。因此,如果我们假设\(P_{\theta}(x)\)可以被计算出来,那么一个图像生成模型的优化目标可以概括如下最大化似然函数:

image

这样可能还不够直观,根据进一步推导,可得如下公式:

image

由上述公式可知,实际上最大化似然函数的本质就是最小化\(P_{\theta}(x)\)和\(P_{data}(x)\)的KL散度,使得两个分布尽可能贴近,这非常符合我们的直观印象,但是我们只有原始采样样本和生成之后的样本,也就是说,我们只有两个分布的采样结果,没有他们的分布式闭式解,无法进行KL散度的计算




三、VAE:

我们先来探讨一下VAE的原理:如果我们能根据数据样本得到数据的真实分布\(P(x)\),再根据这个分布去采样,那么就能很好的生成真实分布的数据,这无疑是完美的,但是很可惜难以实现,于是我们将\(P(x)\)的计算方式改一改:\(P(x) = \int p(x|z) \, p(z) \, dz\)。那么这样我们便可以规定z的分布\(P(z)\),从中采样一个\(z\),然后根据\(z\)来得到一个\(x\),起到生成的作用

苏神的笔记对其做了本质的解读,VAE中我们给定一个真实样本\(x_k\),我们假设存在一个专属于\(x\)的分布\(p(z|x_k)\)(后验分布),并进一步假设这个分布是独立、多元的正态分布,而后我们要从这个分布中采样一个\(z\)去还原为\(x_k\)。所以本质上,这时候每一个\(x_k\)都配上了一个专属的分布,才方便后面的生成器做还原。但是这样有多少个\(x\)就有多少个分布了,为了简便,可以用一个NN来负责拟合,比如分布为方差为1的高斯分布,我们来控制他的均值,用一个\(\mu=NN(x_k)\)来判断\(x_k\)对应的分布。那么对应的示意图如下:

image



根据最大似然函数,需要对\(P_{\theta}(x|z)\)进行优化。但是在VAE的训练中,一般不会直接去maximize这个\(P_{\theta}(x|z)\),,这是为什么呢?

因为其求解方式一般为:\(p_\theta(x) = \int p_\theta(x|z) \, p(z) \, dz\), 根据这个公式我们可以规定\(z\)的分布P(z)。\(P_{\theta}(x|z)\)是解码器输出的分布参数(例如图像每个像素的伯努利或高斯分布),而解码器通常是深度神经网络,没有闭式解。再加上积分要对\(z\)潜在变量空间进行遍历,在z为高维的情况下几乎不可能进行,所以得换个路子进行

一般可以进行如下变换:

image

这里的\(q(z|x)\)是我们给定的近似后验,由encoder给出,也就是说encoder接受一个x,输出一组分布相关的参数,从而定义一个分布。由上述式子可知,最后得到一个证据下界(Evidence Lower Bound, ELBO),通过优化这个ELBO就能做到优化这个最大似然函数

PS: VAE的重参数化trick:VAE中,编码器得到一个高斯分布,而后从中采样:\(z \sim \mathcal{N}(\mu(x), \sigma(x)^2)\),这个过程是非常直观的,但是这个采样过程并不可微分,无法进行BP。那么VAE便引入了一个trick,干脆直接从固定参数的高斯分布进行采样:\(\epsilon \sim \mathcal{N}(0,1)\),而\(z=\mu \epsilon + \sigma\),这里的\(\mu\)和\(\sigma\)由模型进行学习,而随机采样的过程与模型已经没有关系了,VAE能够进行微分,梯度流经\(\mu\)和\(\sigma\)。通过这种巧妙的方式,使得VAE在训练中反向传播可行




四、Diffusion的优化目标:现在回到Diffusion,在denoise的过程中,我们也可以将其看作生成一个高斯分布的过程:

image

那么此时,对于最后生成的图像\(x_0\),有如下\(p_\theta(x_0)\)计算公式:

image

可见,这个公式的计算方式与VAE的形式非常相像,那根据VAE的ELBO,我们也可以在Diffusion中得到一个类似形式:

image

由于前向加噪的马尔可夫性质,我们还可以补充如下条件:

image

经过一些推导,我们得到了Diffusion的最终优化目标,DDPM的lower bound

image




五、如何计算Diffusion的优化目标:

在我们得到的DDPM优化目标函数中,总共由三项组成,其中第二项并不涉及模型的参数优化,因此不加以考虑,我们只考虑第一项和第三项,而第一项的形式和第三项中的部分有些相像,所以我们先从第三项入手:

image

1、\(q(x_t|x_0)\)

对于这一项,考虑到加噪的独立同分布,我们可以把每一步的噪声进行整合,对于高斯分布而言,方差可以直接相加,于是可以得到如下过程:

image

2、\(q(x_{t-1}|x_t, x_0)\)

对于这一项而言,我们可以将其转换为已知项的组合进行求解:

image

那么最终得到的形式就是类似一个对\(x_0\)和\(x_t\)的差值,也相对比较直观,由于\(x_0\)和\(x_t\)都为一个高斯分布:

image

那么理论上,再得到上述表达式后,我们已经可以计算第三项中的KL散度了。但是实际上,我们有更简单的方法去计算这个KL散度

对于\(q(x_{t-1}|x_t, x_0)\)和\(q(x_{t-1}|x_t)\)而言,它们都为高斯分布,对于前者,我们由上述可知,其分布参数已经定死了无法变动,可看作一个定好的分布;而对于后者,则是模型进行规定的,即模型进行predict的结果,这里让其方差固定,模型去学习给出这个分布的均值(李宏毅老师这里说有很多研究人员对这个方面进行了研究,在这里不讨论variance只讨论mean),于是就有下图,我们要让这两个分布越接近越好,也就是mean越接近越好:

image

我们对于模型预测项的\(x_{t-1}\)进行化简:

image

image

经过一系列推导后,我们可以根据结果得知,真正需要模型去predict的,其实只有一个\(\epsilon\)而已,这也对应了原论文的这个伪代码流程:

image




六、一些遗留问题

在algorithm 2中,我们还看到下图中这一项:

image

李宏毅老师以gpt这类autoregressive模型进行举例,表示其中涉及的decode过程常常引入随机性(比如Top-P、Top-K等),来保证生成内容的多样性。而Diffusion更像是autoregressive和non-autoregressive的折中,在空间上看他似乎是non-autoregressive的,但是在时间上看,他则是autoregressive的,这时候类比于一些autoregressive的生成模型在过程中引入随机性,或许能够增加模型的泛化性和多样性

posted @ 2025-08-30 14:58  Luna-Evelyn  阅读(65)  评论(0)    收藏  举报