diffusion model扩散模型论文解读,含详细公式推导,通俗易懂!

写在前面的一些话

因为自己项目需要,以及总是听说扩散模型,所以自己去b站看了视频,博客主要建立于迪哥视频,尽量写的通俗易懂,致力于高效省时的帮助大家搞明白扩散模型的原理,让小白也能读懂这篇论文
注意!!文章可能涉及比较多公式,但不要害怕!!结合我的说明,看懂没问题的,一步步来!不要着急,不要跳步!如果有错误,欢迎指正!有什么问题欢迎在评论区讨论!

简述

最近经常听说扩散模型,甚至可以打败GAN。回顾GAN,我们需要同时训练生成器和判别器,可能会难以收敛以及学习到一些我们不想要的特征。而diffusion model做的事情就是用了一种更简单的方式来解释生成模型应该怎么学习和生成。diffusion model火起来是因为DALLE 2的出现(也是openai的,跟chatgpt出自一个公司),实现文字转图片,能得到非常惊艳的效果(如下图,生成一个牛油果形状的沙发),可以自行搜索一下他们的网站
在这里插入图片描述

整个diffusion model可以分为两部分,一个是前向扩散过程,另一个是逆扩散过程,通俗理解为:前向扩散过程不停的往图片上加服从高斯分布的噪声,加到使图片变得“面目全非”(下图从右到左),逆扩散过程就是不停的减噪声然后复原成图片(从左到右)在这里插入图片描述
在原论文中,扩散过程需要进行2000次加噪声的步骤,实际操作中大约200-500次。在扩散过程中,每次往图片上加的噪声就是逆过程的标签,接下来我会分别解释前向扩散过程以及逆扩散过程


前向扩散过程 forward diffusion

在这里插入图片描述
前面说到,扩散过程简单来说就是不停的往图片里加噪声,把图片加的面目全非。那怎么加,加多少呢?论文中给出核心公式:
x t = α t x t − 1 + 1 − α t z 1 ( 1 ) x_t=\sqrt{\alpha_t} x_{t-1}+\sqrt{1-\alpha_t} z_1 \quad(1) xt=αt xt1+1αt z1(1)
这个公式怎么来的呢?别急,我们一步步来看这个公式

首先,值得一提的是,整个扩散模型是符合马尔可夫定理的,也就是说t时刻的分布只与t-1时刻有关,所以为什么公式里只出现了 x t − 1 x_{t-1} xt1而没有 x t − 2 x_{t-2} xt2 x t − 3 x_{t-3} xt3 x t − 4 x_{t-4} xt4

其次, α t \alpha_t αt是一个经验常量,且 α t \alpha_t αt会随着t的增大而减小,这是实验前决定的; z 1 z_1 z1 (包括文章后面出现的 z 2 z_2 z2 z 3 z_3 z3…)都是服从标准高斯分布的噪声~N(0,I) 。由此,我们可以将这个公式理解为一部分的 x t − 1 x_{t-1} xt1加上了一部分的 z 1 z_{1} z1,也就是说, x t x_{t} xt等于前一时刻的分布 x t − 1 x_{t-1} xt1和标准高斯分布 z 1 z_{1} z1的权重和,而这个权重由 α t \alpha_t αt决定。因为随着t的增大 α t \alpha_t αt会减小,所以 x t − 1 x_{t-1} xt1的权重会越来越小, z 1 z_{1} z1的权重会越来越大。因此随着t的增大,噪声占比越来越大,前一时刻的分布占比越来越小

好了,到这里我们搞懂了其中一个核心公式。但有一个问题,假如我加噪声加了1000次,我要是想知道第一千次的分布,难道要从第一步开始一步步往后推吗,知道了 x 0 x_0 x0我才能知道 x 1 x_1 x1,知道 x 1 x_1 x1我才能知道 x 2 x_2 x2?这也太慢了吧。因此论文又给了我们另一个公式:
x t = α ˉ t x 0 + 1 − α ˉ t z t , α ˉ t = α t α t − 1 α t − 2 . . . ( 2 ) x_t=\sqrt{\bar{\alpha}_t} x_0+\sqrt{1-\bar{\alpha}_t} {z}_t,\bar{\alpha}_t=\alpha_t \alpha_{t-1} \alpha_{t-2}... \quad(2) xt=αˉt x0+1αˉt ztαˉt=αtαt1αt2...(2)
这又是怎么来的呢?接下来慢慢解释。

让我们先根据公式(1)写出 x t − 1 x_{t-1} xt1的公式 (把(1)中的t换成t-1就行了);
x t − 1 = α t − 1 x t − 2 + 1 − α t − 1 z 2 ( 3 ) x_{t-1}=\sqrt{\alpha_{t-1}} x_{t-2}+\sqrt{1-\alpha_{t-1}} z_2 \quad(3) xt1=αt1 xt2+1αt1 z2(3)
再直接把(3)中的 x t − 1 x_{t-1} xt1带入到(1):
x t = α t ( α t − 1 x t − 2 + 1 − α t − 1 z 2 ) + 1 − α t z 1 ( 4 ) x_t=\sqrt{\alpha_t}\left(\sqrt{\alpha_{t-1}} x_{t-2}+\sqrt{1-\alpha_{t-1}} z_2\right)+\sqrt{1-\alpha_t} z_1 \quad(4) xt=αt (αt1 xt2+1αt1 z2)+1αt z1(4)
α t \sqrt{\alpha_t} αt 乘进去,括号移一下:
x t = α t α t − 1 x t − 2 + ( α t ( 1 − α t − 1 ) z 2 + 1 − α t z 1 ) ( 5 ) x_t=\sqrt{\alpha_t\alpha_{t-1}} x_{t-2}+\left(\sqrt{\alpha_t(1-\alpha_{t-1})} z_2+\sqrt{1-\alpha_t} z_1\right) \quad(5) xt=αtαt1 xt2+(αt(1αt1) z2+1αt z1)(5)
到这里应该没什么难点,只是简单的代入。我们仔细观察一下公式(5),发现括号内是两个高斯分布相加(记住: z 1 , z 2 , z 3 . . . z_1,z_2,z_3... z1,z2,z3...都是服从标准的高斯分布),我们知道两个高斯分布相加还是高斯分布,具体推导可以参考另一个博主的博客。那么括号里加出来新的高斯分布具体是什么呢?

如果我们把公式(5)中的 α t ( 1 − α t − 1 ) z 2 \sqrt{\alpha_t(1-\alpha_{t-1})} z_2 αt(1αt1) z2看作一整个分布,那:
α t ( 1 − α t − 1 ) z 2 ∼ N ( 0 , α t ( 1 − α t − 1 ) ) ( 6 ) \sqrt{\alpha_t(1-\alpha_{t-1})} z_2 \sim \mathcal{N}(0, {\alpha_t(1-\alpha_{t-1})})\quad(6) αt(1αt1) z2N(0,αt(1αt1))(6)
同理对于公式(5)中的 1 − α t z 1 \sqrt{1-\alpha_t} z_1 1αt z1 1 − α t z 1 ∼ N ( 0 , 1 − α t ) ( 7 ) \sqrt{1-\alpha_t} z_1 \sim \mathcal{N}(0, {1-\alpha_t})\quad(7) 1αt z1N(0,1αt)(7)

插一句,这是因为,在一个高斯分布前面乘上一个系数相当于改变它的标准差,给一个高斯分布加上或减去某个数相当于改变它的均值

ok,那根据博客里推导的公式,两个高斯分布相加后新的高斯分布应为:
N ( 0 , σ 1 2 I ) + N ( 0 , σ 2 2 I ) ∼ N ( 0 , ( σ 1 2 + σ 2 2 ) I ) ( 8 ) \mathcal{N}\left(0, \sigma_1^2 \mathbf{I}\right)+\mathcal{N}\left(0, \sigma_2^2 \mathbf{I}\right) \sim \mathcal{N}\left(0,\left(\sigma_1^2+\sigma_2^2\right) \mathbf{I}\right) \quad(8) N(0,σ12I)+N(0,σ

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值