【扩散模型】基于 DDPM 与 cifar-10 数据集生成图片的简单实现

生成式AI的大火让我这个搞RL的弱鸡研究生也不得不来学习CV了(别问,问就是RL找不到工作)


先上效果吧,代码在博客最后(只是一个学习的临时Demo,没有采用条件生成)

可以隐约地看出的确有那么点意思了,可能是调参的问题吧,也可能是数据集太小了,效果不是很好。
在这里插入图片描述


大致原理:

  • 其实也还是基于隐变量的生成模型那一套(如:VAE),加噪过程对应的是Encoder,降噪过程对应的是Decoder。
  • 整体目标是最大化数据的对数似然 logPθ(X)≥Eq(x1:T∣x0)logp(x0:T)q(x1:T∣x0){logP_{\theta}(X)}\geq{E_{q({x_{1:T}|{x_{0}}})}log \frac{p(x_{0:T})}{q(x_{1:T}|x_{0})}}logPθ(X)Eq(x1:Tx0)logq(x1:Tx0)p(x0:T)qqq是加噪过程,ppp是降噪过程。
  • 预测模型(UNet)所预测的是 ttt 时刻的噪声,说白了本质上和VAE一样,都是用神经网络去近似隐变量(噪声)的后验分布(详细原理去看变分推断)。

训练

第一种,最大化对数似然的变分下界(variational lower-bound “VLB”):

出自论文:Luo C. Understanding diffusion models: A unified perspective[J]. arXiv preprint arXiv:2208.11970, 2022.
在这里插入图片描述
在这里插入图片描述
上述过程还是变分推断那一套,这个损失函数不是很常用,因为实现起来太麻烦了,不过有的代码里还是有的,比如在DiT的Meta官方实现代码里(使用该损失函数可以学习到后验分布的方差)(https://github.com/facebookresearch/DiT/blob/main/diffusion/gaussian_diffusion.py#L682)

第二种,也是最简单,最常用,最广为人知晓的

出自论文:Ho J, Jain A, Abbeel P. Denoising diffusion probabilistic models[J]. Advances in neural information processing systems, 2020, 33: 6840-6851.
在这里插入图片描述
该方法其实是上面第一种方法的近似(运用了高斯分布和指数函数的之间关系),不过这种近似会导致丢失后验分布的方差信息,在论文中给出了方差 σt\sigma_{t}σt 的上界和下界 σt2=βt\sigma_{t}^{2}=\beta_{t}σt2=βt, σt2=1−α‾t−11−α‾tβt\sigma_{t}^{2}=\frac{1-\overline{\alpha}_{t-1}}{1-\overline{\alpha}_{t}}\beta_{t}σt2=1αt1αt1βt,实际实现中选其中一个作为方差即可(论文中说二者的效果其实差不多…)。

近似过程如下,想看就看吧,反正我是懒得看了,知道个原因就差不多得了(手动滑稽)

衔接(58)式中的最后一项进行化简,得到 qqq 分布的均值μq(xt,x0)\mu_{q}(x_{t},x_{0})μq(xt,x0),回到式(58)中,最小化qqqppp的KL散度可以等价于最小化两个分布均值的二范数(这个技巧在VAE中也有)。将加噪过程的公式 xt=α‾tx0+1−α‾tϵx_{t}=\sqrt{\overline{\alpha}_{t}}x_{0}+\sqrt{1-\overline{\alpha}_{t}}\epsilonxt=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值