生成扩散模型漫谈(二):DDPM = 自回归式VAE
在文章《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼》中,我们为生成扩散模型DDPM构建了“拆楼-建楼”的通俗类比,并且借助该类比完整地推导了生成扩散模型DDPM的理论形式。在该文章中,我们还指出DDPM本质上已经不是传统的扩散模型了,它更多的是一个变分自编码器VAE,实际上DDPM的原论文中也是将它按照VAE的思路进行推导的。
所以,本文就从VAE的角度来重新介绍一版DDPM,同时分享一下自己的Keras实现代码和实践经验。
多步突破 #
在传统的VAE中,编码过程和生成过程都是一步到位的:
这样做就只涉及到三个分布:编码分布
为了突破这个限制,DDPM将编码过程和生成过程分解为
这样一来,每一个
联合散度 #
所以,现在的计划就是通过递归式分解
别忘了
在《变分自编码器(二):从贝叶斯观点出发》中笔者就提出,理解VAE的最简洁的理论途径,就是将其理解为在最小化联合分布的KL散度,对于DDPM也是如此,上面我们已经写出了两个联合分布,所以DDPM的目的就是最小化
这就是DDPM的优化目标了。到目前为止的结果,都跟DDPM原论文的结果一样的(只是记号略有不同),也跟更原始的论文《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》一致。接下来,我们就要将
分而治之 #
首先我们要知道,DDPM只是想做一个生成模型,所以它只是将每一步的编码建立为极简单的正态分布:
由于目前分布
由于先验分布
其中第一个等号是因为
场景再现 #
接下来的过程就跟上一篇文章的“又如何建”一节基本上是一样的了:
1、除去优化无关的常数,
这一项所贡献的就是 ; 2、
意味着 , 又意味着 ,其中 ; 3、由
则启发我们将 参数化为 。
这一系列变换下来,优化目标等价于
随后按照“降低方差”一节做换元,结果就是
这就得到了DDPM的训练目标了(原论文通过实验发现,去掉上式前面的系数后实际效果更好些)。它是我们从VAE的优化目标出发,逐步简化积分结果得到的,虽然有点长,但每一步都是有章可循的,有计算难度,但没有思路上的难度。
相比之下,DDPM的原论文中,很突兀引入了一个
超参设置 #
这一节我们来讨论一下
对于
其中
前面说了,
由于数据分布
至于
1、假设训练集只有一个样本
,即 是狄拉克分布 ,可以推出最优的 ; 2、假设数据分布
服从标准正态分布,这时候可以推出最优的 。
实验结果显示两个选择的表现是相似的,因此可以选择任意一个进行采样。两个结果的推导过程有点长,我们后面再择机讨论。
参考实现 #
这么精彩的模型怎么可以少得了Keras实现?下面提供笔者的参考实现:
Github地址:https://github.com/bojone/Keras-DDPM
注意,笔者的实现并非严格按照DDPM原始开源代码来进行,而是根据自己的设计简化了U-Net的架构(比如特征拼接改为相加、去掉了Attention等),使得可以快速出效果。经测试,在单张24G显存的3090下,以blocks=1,batch_size=64
训练128*128大小的CelebA HQ人脸数据集,半天就能初见成效。训练3天后的采样效果如下:
在调试过程中,笔者总结出了如下的实践经验:
1、损失函数不能用mse,而必须用欧氏距离,两者的差别是mse在欧氏距离基础上除以图片的
,这会导致损失值过小,部分参数的梯度可能会被忽略为0,从而导致训练过程先收敛后发散,该现象也经常出现于低精度训练中,可以参考《在bert4keras中使用混合精度和XLA加速训练》; 2、归一化方式可以用Instance Norm、Layer Norm、Group Norm等,但不要用Batch Norm,因为Batch Norm存在训练和推理不一致的问题,可能出现训练效果特别好,预测效果特别差的问题;
3、网络结构没有必要照搬原论文,原论文是为了刷SOTA发论文,照搬的话肯定是又大又慢的,只需要按照U-Net的思路设计自编码器,就基本上可以训练出个大概效果了,因为就相当于是个纯粹的回归问题,还是很好训练的;
4、关于参数
的传入,原论文用了Sinusoidal位置编码,笔者发现直接换为可训练的Embedding,效果也差不多; 5、按照以往搞语言模型预训练的习惯,笔者用了LAMB优化器,它更方便调学习率,基本上
的学习率可以适用于任意初始化方式的模型训练。
综合评价 #
结合《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼》和本文的介绍,想必读者都已经对DDPM有自己的看法了,能基本看出DDPM优点、缺点以及相应的改进方向在哪了。
DDPM的优点很明显,就是容易训练,并且生成的图片也清晰。这个容易训练是相对GAN而言的,GAN是一个
不过,DDPM的缺点也很明显。首先最突出的就是采样速度太慢,需要执行模型
除了针对上述缺点来做改进外,DDPM还有其他一些可做的方向,比如目前演示的DDPM都是无条件的生成,那么很自然就想到有条件的DDPM的,就好比从VAE到C-VAE、从GAN到C-GAN一样,这也是当前扩散模型的一个主流应用,比如用Google的Imagen就同时包含了用扩散模型做文本生成图片以及做超分辨率,这两者本质上就是条件式扩散模型了;再比如,目前的DDPM是为连续型变量设计的,但从其思想来说应该也是适用于离散型数据的,那么离散型数据的DDPM怎么设计呢?
相关工作 #
说到DDPM的相关工作,多数人会想到传统扩散模型、能量模型等工作,又或者是去噪自编码器等工作,但笔者接下来想说的不是这些,而是本博客之前介绍过的、甚至可以认为DDPM就是它的特例的《强大的NVAE:以后再也不能说VAE生成的图像模糊了》。
站在VAE的视角来看,传统VAE生成的图片都偏模糊,而DDPM只能算是(笔者所了解到的)第二个能生成清晰图像的VAE,第一个正是NVAE。翻看NVAE的形式,我们可以发现它跟DDPM有非常多的相似之处,比如NVAE也是引入了一大堆隐变量
从理论形式来说,DDPM可以看成是一个极度简化的NVAE,即隐变量的递归关系仅仅建模为马尔可夫式的条件正态分布,而不是像NVAE的非马尔科夫式,生成模型也只是同一个模型的反复迭代,而不是NVAE那样用一个庞大的模型同时用上了
文章小结 #
本文从变分自编码器VAE的角度推导了DDPM,在这个视角之下,DDPM是一个简化版的自回归式VAE,跟之前的NVAE很是相似。同时本文分享了自己的DDPM实现代码和实践经验,以及对DDPM做了一个比较综合的评价。
转载到请包括本文地址:https://spaces.ac.cn/archives/9152
更详细的转载事宜请参考:《科学空间FAQ》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧