扩散模型(diffusion model)学习笔记

目录

0 概述

1 前向传播

2 后向传播

3 总结

4 附录(期望的计算推导过程)


0 概述

        扩散模型(diffusion model)的概念始于2020年发布的论文DDPM(Denoising Diffusion Probailistic Models),起初没有收到大的关注,随着基于扩散模型的DALLE2等问世,人们才逐渐认识到它的强大。扩散模型也是逐渐击败了生成对抗网络(Generative Adversarial Network),在图像生成等方面占据了主要地位,比如非常热门的Stable Diffsion。

        这篇文章记录了本次扩散模型的学习过程以及一些感悟。

        DDPM论文链接:Denoising Diffusion Probabilistic Modelsicon-default.png?t=N7T8https://arxiv.org/abs/2006.11239

        学习视频链接: B站强推!2023公认最通俗易的扩散模型【Diffusion】3小时入门到精通,比GAN还牛逼,Stable diffusion_Diffusion Modelicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Qz4y1a7dH/?p=4&spm_id_from=pageDriver&vd_source=93fbcb1d3fd1fd76a3e34f6b4d17f8a7        

1 前向传播

        前向传播的过程就是由图像生成噪声过程,如图所示:

        X0表示原始图像,x_{0} 中添加噪声 z_{1} 得到 x_{1}x_{1} 中添加噪声 z_{2} 得到 x_{2},以此类推。这里面添加的噪声都是服从标准高斯分布的,即 z_{i}  ~ N(0, 1)。

        考虑 x_{t-1} 与 x_{t} 的关系,可以得到一个公式:

                                               x_{t} = \sqrt{a_{t}} * x_{t-1} + \sqrt{1-a_{t}} * z_{t}                                    (1)

        个人对该公式的理解:

(1)首先它是x_{t-1}, x_{t}, z_{t}的关系公式,\sqrt{a_{t}} 和 \sqrt{1 - a_{t}} 可以认为是权重,在逐步施加噪声时,需要保持变化程度基本相等,对应x_{0} ,只需要添加一点点噪声,就能体现很明显的变化,而对于后面的x_{t} ,它已经包含了很多噪点,因此需要加更大的噪声来让它有比较明显的变化。对于a_{t} ,随着t的增大,a_{t} 会逐渐减小,这样就达成了噪声(占比)逐渐增大的实现。

(2)这两个权值为什么是 \sqrt{a_{t}} 和 \sqrt{1-a_{t}}:在进行前向计算时,如果需要从x_{0} 到 x_{1}x_{1} 到 x_{2} 这样一步步计算会相当麻烦,我们希望能够通过x_{0} 直接计算 x_{t},来绕开这样繁琐的递归流程。

        由公式(1)我们可以衍生出 x_{t-1} 和 x_{t-2} 的关系:

                                           x_{t-1} = \sqrt{a_{t-1}} * x_{t-2} + \sqrt{1 - a_{t-1}} * z_{t-1}                           (2)

        将(2)式带入(1)式中可得:

                       x_{t} = \sqrt{a_{t}} * (\sqrt{a_{t-1} }* x_{t-2} + \sqrt{1-{a_{t-1}}}*z_{t-1}) + \sqrt{1 - a_{t}} * z_{t}        (3)

                            = \sqrt{a_{t} * a_{t-1}} * x_{t-2} + \sqrt{a_{t} *(1 - a_{t-1})} * z_{t-1} + \sqrt{1 - a_{t}} * z_{t}    (4)

       前面提到过,噪声 z_{i} 是服从标准的高斯分布的,对于两个分布 X_{1} 和 X_{2} :

                        若 X_{1} \sim N(\mu_{1}, \sigma^{2}_{1})X_{2} \sim N(\mu_{2}, \sigma^{2}_{2}),则

                                     a * X_{1} + b * X_{2} \sim N(\mu_{1} + \mu_{2}, a^{2} \sigma^{2}_{1} + b^{2}\sigma^{2}_{2})

        在式(4)中,\sqrt{a_{t} *(1 - a_{t-1})} * z_{t-1} \sim N(0, a_{t} * (1 - a_{t-1}))

                                \sqrt{1 - a_{t}} * z_{t} \sim N(0, 1 - a_{t})

        因此:\sqrt{a_{t} *(1 - a_{t-1})} * z_{t-1} + \sqrt{1 - a_{t}} * z_{t} \sim N(0, a_{t} * (1 - a_{t-1}) + 1 - a_{t})

                                                                                         \sim N(0, 1 - a_{t} * a_{t-1})

        由此,我们可以从中看出规律,将 x_{t} 由 x_{0} 表示为:

                        x_{t} = \sqrt{\prod_{i=1}^{t}a_{i}} * x_{0} + \sqrt{1 - \prod_{i=1}^{t}a_{i}} * \overline{z_{t}}                                             (5)

        记    \overline{a_{t}} = \prod_{i=1}^{t}a_{i},式(5)可以简化为:

                                            x_{t} = \sqrt{\overline{a_{t}}} * x_{0} + \sqrt{1 - \overline{a_{t}}} * \overline{z_{t}}                                               (6)

        \overline{z_{t}} 同 z_{i} 一样服从标准的高斯分布,这样式(6)就是前向传播中最重要的一条公式,它可以是实现直接的从x_{0} 计算 x_{t},避免了重复的递归运算。

2 后向传播

        相较于前向传播,后向传播更加复杂,毕竟给图像加噪声和从噪声中复原图像,难度上肯定是后者更大。后向传播很难直接推导 x_{t} 到 x_{0} 的关系的。因此我们选择先考虑 x_{t} 到 x_{t-1} 的关系。

        要直接求解 q(x_{t-1} | x_{t}) 是几乎不可能的,但贝叶斯公式为它的求解提供了另一条道路:

        贝叶斯公式:        P(A_{i} | B) = \frac{P(B|A_{i}) * P(A_{i})}{P(B)} = \frac{P(B|A_{i}) * P(A_{i})}{\sum_{i=0}^{n}P(A_{i}) * P(B|A_{i})}                

        在后向传播中,贝叶斯公式体现为:

                                      q(x_{t-1}|x_{t}) = q(x_{t}|x_{t-1}) * \frac{q(x_{t-1})}{q(x_{t})}                                               (7)

                                     q(x_{t-1}|x_{t}) = q(x_{t}|x_{t-1}) * \frac{q(x_{t-1}|x_{0}) * q(x_{0})}{q(x_{t}|x_{0}) * q(x_{0})}

                                                         = q(x_{t}|x_{t-1}) * \frac{q(x_{t-1}|x_{0}) }{q(x_{t}|x_{0})}                                            (8)

        由公式(6)我们可以直接得到:

                                     q(x_{t}|x_{0}) = \sqrt{\overline{a}_{t}} * x_{0} + \sqrt{1 - \overline{a}_{t}} * z                                           (9)

                                   q(x_{t-1}|x_{0}) = \sqrt{\overline{a}_{t-1}} * x_{0} + \sqrt{1 - \overline{a}_{t-1}} * z                                (10)

        由公式(1)我们可以直接得到:

                                     q(x_{t}|x_{t-1}) = \sqrt{a_{t}} * x_{t-1} + \sqrt{1-a_{t}} * z                                   (11)

        这里把式(9)(10)(11)中等式右边的第一个项当成常数来看待(这里笔者也不是很理解),即 \sqrt{\overline{a}_{t}} * x_{0}\sqrt{\overline{a}_{t-1}} * x_{0}, \sqrt{a_{t}} * x_{t-1} 。那么每一个分布都可以看成高斯分布:

                                         q(x_{t}|x_{0}) \sim N(\sqrt{\overline{a}_{t}} * x_{0}, 1 - \overline{a}_{t})                                             (12)

                                        q(x_{t-1}|x_{0}) \sim N(\sqrt{\overline{a}_{t-1}} * x_{0}, 1 - \overline{a}_{t-1})                                  (13)

                                        q(x_{t}|x_{t-1}) \sim N(\sqrt{a_{t}} * x_{t-1}, 1-a_{t})                                       (14)

        正态分布的概率密度函数为:

                                        f(x) = \frac{1}{\sqrt{2\pi}\sigma} * exp({-\frac{1}{2}}\frac{(x - \mu)^{2}}{\sigma^{2}})         

                                                 = \frac{1}{\sqrt{2\pi}\sigma} * exp(-\frac{1}{2}(\frac{1}{\sigma^{2}}{x^{2}}-\frac{2\mu}{\sigma^{2}}x + \frac{\mu^{2}}{\sigma^{2}}))                           (15)

        从而,多个概率密度函数相乘相除时,指数exp() 部分的内部实际上是一个加减的操作,暂时不考虑前面的系数 \frac{1}{\sqrt{2\pi}\sigma}q(x_{t-1} | x_{t}) 应当正比于:

                         exp(-\frac{1}{2}(\frac{(x_{t} - \sqrt{a_{t}}x_{t-1})^{2}}{1-a_{t}}) + \frac{(x_{t-1} - \sqrt{\overline{a}_{t-1}}x_{0})^{2}}{1-\overline{a}_{t-1}}) - \frac{(x_{t} - \sqrt{\overline{a}_{t}}x_{0})^{2}}{1-\overline{a}_{t}}) )                 (16)

        由于要表示 q(x_{t-1} | x_{t}),这里只关心exp()内的 x_{t-1} 的项,我们尝试把整个表示为 exp({-\frac{1}{2}}\frac{(x - \mu)^{2}}{\sigma^{2}}) 的形式,其中x 就是 x_{t-1}。化简可得:

           exp(-\frac{1}{2}((\frac{a_{t}}{1-a_{t}}+\frac{1}{1- \overline{a}_{t-1}})*x_{t-1}^{2}) - (\frac{2\sqrt{a_{t}}x_{t}}{1-a_{t}}+\frac{2\sqrt{\overline{a}_{t-1}}x_{0}}{1-\overline{a}_{t-1}})*x_{t-1}) + C(x_{t}, x_{0}))     (17)

        其中 C(x_{t}, x_{0}) 是与 x_{t-1} 无关的量,可以当成常数处理,把它提到exp()的外面依然构成正比关系。我们由式(15)可以寻找对应的 \mu 和 \sigma^{2}:

                                                        \sigma^{2} = \frac{1}{\frac{a_{t}}{1-a_{t}}+\frac{1}{1 - \overline{a}_{t-1}}}                                                          (18)

        \sigma^{2} 与 x_{t} 等是无关的,期望 \mu 可以推导到:

                                    \mu(x_{t}, x_{0}) = \frac{(1 - \overline{a}_{t-1})\sqrt{a_{t}}}{1 - \overline{a}_{t}} * x_{t} + \frac{\sqrt{\overline{a}_{t-1}}(1-a_{t})}{1-\overline{a}_{t}} * x_{0}                           (19)

        这里 a_{t}, \overline{a}_{t} 都是作为已知的,但 x_{0} 却是未知的,x_{0} 是我们反向传播最终要求解的,不过考虑到式(6)中,表示了x_{t}x_{0} 和 \overline{z_{t}} 的关系,因此我们可以用 x_{t} 和 \overline{z_{t}} 来表示 x_{0}:

                                             x_{0} = \frac{1}{\sqrt{\overline{a}_{t}}}(x_{t} - \sqrt{1- \overline{a}_{t}}*z_{t})                                                  (20)

        最终可以求得:

                                               \mu(x_{t}) = \frac{1}{\sqrt{a_{t}}}(x_{t} - \frac{1- a_{t}}{\sqrt{1 - \overline{a}_{t}}}z_{t}))                                                 (21)

        这是反向传播中最重要的公式,但实际上 z_{t} 也是未知的,也很难去推导它与x_{t}的关系,于是科学家选择了神经网络,在前向传播时,z_{t} 是已知的,我们可以通过前向传播时的训练出的模型,来服务后向传播。假设模型为 f(*),便有 z_{t} = f(x_{t})。这样就实现了从 x_{t}  到 x_{t-1} 的计算,最终求解得到 x_{0}

3 总结

        扩散模型包括前向传播和反向传播,前向传播是在原始图像上不断的加噪声。这些噪声都是服从标准正态分布的,这使得 x_{t} 与 x_{0} 可以直接建立联系,避免了繁琐的递归流程;后向传播是在充满噪点的图像上逐渐修复为原图像。反向过程远比前向过程复杂,我们从局部的 x_{t} 到 x_{t-1} 开始建立联系,通过贝叶斯公式,我们可以将 x_{t-1} 与 x_{t} 和 z_{t} 建立联系。但 z_{t} 是未知的,我们需要通过神经网络,在前向传播中学习从 x_{t} 到 z_{t} 的映射。

        以上是笔者对去扩散模型的一些简单的理解,如有问题欢迎指正。

4 附录(期望的计算推导过程)

         

                                                

       

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值