Diffusion原理详解(二:逆向过程原理)

        在上一篇《Diffusion原理详解(一:前向过程原理)》  中介绍了Diffusion前向过程的原理,我们知道了前向过程是一个马尔科夫的加噪过程,加的噪声是随机的噪声,最后可以推导出以下公式:

\color{red} X_t = \sqrt{\bar{\alpha_{t}}}X_{0} + \sqrt{1 - \bar{\alpha_{t}}}\epsilon \Leftrightarrow q(x_t|x_0) := N(X_t; \sqrt{\bar{\alpha_{t}}}X_{0}, (1 - \bar{\alpha_{t}})I )                   (1)

由这个公式我们可以知道,t时刻的图像X_t可以由0时刻的X_0表示。

        逆向的过程也就是通过对正向生成的噪声图像X_T不断减噪,从而生成一张不带噪声的清晰图像的过程。问题来了,逆向的过程是如何减噪的呢?要明白逆向过程如何减噪,可以参考一下正向的过程,这里就会有两个问题:1. 既然正向的过程是一个马尔科夫的过程,那么逆向的过程是否也是马尔科夫过程?2. 正向过程加的是随机的高斯噪声,那么逆向的噪声能否加随机的高斯噪声?

对于问题1, 逆向过程也可以是一个马尔科夫过程,我们把这个当成一个结论来用,在《Reverse-Time Diffusion Equation Models》文章中已经有前人证明过。这样的话逆向过程和前向过程有着同样的数学理论基础。

对于问题2,逆向过程减去的噪声是怎么的噪声?显然不能是正向过程那也的随机噪声,否则整个diffusion等于什么都没有做。那么既然不能是随机的,就是说这个噪声是特定的,符合一定条件的噪声。前向过程中Xt的分布是由一系列的高斯分布相乘得到:

                                        \textcolor{green} {q(x_{1:T}|x_{0})}:= \prod_{t=1}^{T}q(x_{t}|x_{t-1})

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        q(x_{t}|x_{t-1}) := N(x_{t}; \sqrt{\alpha_{t}}X_{t-1}, \alpha_{t}I)                                      (2)

那么对于逆向的\textcolor{red} {q(x_{t-1}|x_{t})}, 也有一个类似正向过程的分布,表示为如下公式:

                     (3)

这个\textcolor{blue} {p_{\theta}(x_{t-1}|x_{t})}可以看成是一个有参数\theta的未知的概率分布,但是这个概率分布也是某种正态分布,且和t时刻以及t时刻的图像有关。

那么进一步就可以推导出\textcolor{blue} {p_{\theta}(x_{0})}

                     (4)

这里的{p(x_{T})}就是前向过程生成的最后T时刻的纯噪声。{p(x_{T})} := N(0, I)

这里我们隐约的能感受到,其实逆向过程是一个利用参数\theta,t时刻以及t时刻的噪声图像x_t估计x_{t-1}的过程,而这里的未知参数我们是不知道的,那么怎么实现这个概率估计呢,就是通过网络训练来实现啦!

        对于网络训练,我们就需要知道怎么更新网络参数,那就需要定义loss函数。如果我们能够很好的估计出\textcolor{blue} {p_{\theta}(x_{0})}的概率分布,其实是不是就可以很好的生产出新的x_0

所以有下面的公式 (1):

           (5)

在大学数学的概率论中,我们一定学过怎么通过参数来估计一个分布。一般会用最大似然估计。什么是最大似然估计,这里就不在多说,这里仅简单说一下个人理解。最大似然估计,我的理解是对于一个未知的分布,什么情况下能更大可能的估计这个分布规律呢?可以通过大量的采集样本,让每个样本按照这个分布计算出的概率最大(样本在该分布下产生的可能性最大),那么是不是就能表示我们估计的这个分布的正确性最大。那么为了求loss(loss是最小化,最大似然估计是最大化), 会在最大似然函数前面加一个负号,这样可以通过不断最小化,来更新参数了。

至于这个公式是怎么推导的,这里就不再展开,里面涉及到较多的数学公式。但是也都是大学数学内容,比如条件概率公式,边缘概率公式,贝叶斯公式,以及琴声不等式(凹凸函数的性质)等。由于这里码公式太费劲了,也怕读者看了觉得太难,没有兴趣读下去,看了也不会去记,记住也未必有用。我们学习最主要理解主要原理,知道为什么会是这样的,这个比较重要。当然如果对公式推理感兴趣的同学,可以阅读一下原文,公式推导的过程其实也是一个很好的思维锻炼的过程。 

        对于公式(5), L称作VLB: variational lower bound。继续对L进行展开, 得到如下公式(6):

             (6)

这里插入KL散度的定义和边缘概率的计算,如下公式(7), (8):

D_{KL}(p(x)|q(x)) = p(x)log(\frac{p(x)}{q(x)})                                                                                    (7)

E_{q(x_{0:T})} = \int dx_{0:T}q(x_{0:T}) = \begin{cases} q(x_{0}) \\ \int dx_{0}dx_{T}q(x_{0}, x_{T}) \end{cases}                                                       (8)

根据公式(7), (8), 公式(6)可以表达为如下公式(9):

L_{T:0} = E_{q}\begin{bmatrix} D_{KL}(q(x_{T}|x_{0}) || p_{\theta}(x_{T})) + \sum_{t=2}^TD_{KL}(q(x_{t-1}|x_{t}, x_{0}) || p_{\theta}(x_{t-1}|x_{t}) \color{blue}{ - logp_{\theta}(x_{0}|x_{1})} \end{bmatrix} (9)

在公式(9)中,第一项,对于最后一个时刻T, 我们知道正向生成的q(x_{T}|x_{0})和逆向的p_{\theta}(x_{T})应该是相等的,这个很好理解,所以第一项为0。 那么通过公式(9)我们可以推导出以下结论:

以𝜽为模型参数,反向生成的原始图像的分布,与真实原始图像的分布的,距离, 不大于 (≤), 各个阶段(𝑡 = 0,𝑡 = 1, 𝑇 − 1 ,𝑡 = 𝑇)以𝜽为模型参数, 反向生成的图像分布与该阶段真实图像分布的 距离 【KL-Divergence】和。

        接下来再详细分析一下公式(5), 以及如何从公式(5)得到最后的loss函数。回到公式(5), 可以由如下的标记:

          (10)

上面说了第一项为0, 作者在论文中选择性的忽略第三项,其中最重要的是分析一下中间的第二项,如公式(11)。

                                         (11)

公式(11)中红色的部分,这个式子里面出现的都是前向过程的参数,而根据文章最开始列出的前向过程推导公式,这个式子的分布我们是可以表达出来的。根据贝叶斯公式,我们可以推导出如下公式(12)

q(x_{t}|x_{t-1}) = \frac{q(x_{t-1}|x_{t}, x_{0})q(x_{t}|x_{0})}{q(x_{t-1}|x_{0})} \Rightarrow q(x_{t-1}|x_{t}, x_{0}) = \frac{q(x_{t}|x_{t-1})q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})}                    (12)

由前向过程的推导,可以得到如下公式(13):

                                      (13)

根据公式(13),得到如下的分布, 如公式(14):

q(x_{t}|x_{0}) := N(X_{t}; \sqrt{\bar{\alpha_t}}X_0, (1 - \bar{\alpha_t})I) \\ q(x_{t-1}x_{0}) := N(X_{t-1}; \sqrt{\bar{\alpha_{t-1}}}X_0, (1 - \bar{\alpha_{t-1}})I) \\ q(x_{t}x_{t-1}) := N(X_{t}; \sqrt{\alpha_{t}}X_{t-1}, (1 - \alpha_{t})I)                                                            (14)

由公式(14),通过一系列的数学公式迭代推导(这里不展开了,可阅读原文或自行推导),可以得到以下结论性的公式(15):

         (15)

至此,对于公式(11), 我们已经推导出了红色部分的分布了。

接下来需要弄清楚\color{blue}p_{\theta}(x_{t-1}|x_{t}), 对于公式(3), 要使得公式(11)能得到最小值,最好就是\color{red} q(x_{t-1}|x_{t}, x_0)\color{blue}p_{\theta}(x_{t-1}|x_{t})尽可能的相等,也就是说两者的分布要尽可能的接近;也就是对于公式(3), 如下:

\color{blue}{p_{\theta}(x_{t-1}|x_{t}) := } N(X_{t-1}; \mu_{\theta}(X_t, t), \sum_{\theta}(X_{t}, t))                                                        (3)

我们希望式子中的期望和方差都能无限趋近\color{red} q(x_{t-1}|x_{t}, x_0)分布的期望和方差,而根据公式(15),就会有以下公式(16):

\mu_{\theta}(X_{t}, t) \Rightarrow \\ \mu_{\theta}(X_{t}, X_0) = \frac{1}{\sqrt{\alpha_t}}(X_{t} - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha_t}}}\epsilon_{\theta}(X_{t}, t)) \\ \Leftrightarrow \\ p_{\theta}(x_{t-1}|x_{t}):= N(X_{t-1}; \frac{1}{\sqrt{\alpha_t}}(X_{t} - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha_t}}}\epsilon_{\theta}(X_{t}, t)), \sum_{\theta}(X_t, t))                          (16)

其中\color{red} \epsilon_{\theta}(X_t, t)表示,由t时刻的图像X_t以及t作为输入,由网络参数训练得到的输出。

对于公式(16), 由于方差部分只是噪声的方差,当均值部分接近时,可以认为方差部分也和公式(15)的噪声方差部分是相接近的。因此可以得到以下公式(17):

               (17)

对于公式(17)中,噪声差的平方前面那一堆系数只是权重而已,因此可以不用管,最后可以化简到如下公式(18):

         (18)

这就是DDPM最后中用来训练的loss函数。其实也就是由模型产生的噪声和所加的随机噪声之间的平方误差。至此,我们介绍完了整个DDPM(diffusion)的原理!

### Stable Diffusion 模型的工作原理详解 #### 1. 基本概念 Stable Diffusion 是一种基于潜在扩散模型 (Latent Diffusion Model, LDM) 的图像生成技术,其核心目标是在保持图像语义结构的同时生成高质量、高分辨率的图像[^1]。该模型通过引入噪声逐步破坏输入数据,并利用训练好的神经网络逆向恢复原始图像。 #### 2. 主要组成部分 Stable Diffusion 的架构主要由以下几个部分组成: - **潜空间表示** Stable Diffusion 使用自动编码器将高维像素空间映射到低维潜空间,在这个过程中减少计算复杂度并提高效率[^1]。 - **CLIP 文本编码器** CLIP 被用来将自然语言描述转化为嵌入向量,这些向量随后被用于指导图像生成过程中的条件约束[^1]。 - **U-Net 扩散模型** U-Net 结构负责执行实际的去噪任务。它接收带有噪声的潜变量以及时间步长作为输入,并预测对应的噪声成分以便于后续去除[^3]。 #### 3. 工作流程 以下是 Stable Diffusion 的典型工作流概述: - **前向传播阶段(加噪)** 在这一阶段,算法会逐渐向初始干净图片加入随机高斯白噪音直到完全淹没原信号为止。每一步都会记录当前状态下的参数变化情况以供反向重建时参考。 - **后向推理阶段(去噪)** 利用预训练完成后的 U-Net 对象估计给定时刻 t 下应该移除多少比例的干扰项 εθ(x_t,t),从而一步步还原接近真实的样本 x_0 。整个迭代周期通常设定为 T 步骤长度固定不变的形式来进行控制精度与速度之间的平衡取舍。 - **交叉注意机制** Cross Attention 层允许模型关注全局特征而非局部区域特性单独处理,这有助于增强最终产物的一致性和连贯程度。具体而言就是让 encoder hidden states 和 decoder query keys/values 进行交互作用来捕捉更广泛范围内的关联信息[^3]。 #### 4. 关键优势 相比其他类型的生成对抗网络或者变分自编码方案来说,采用扩散策略构建而成的 SD 方法具备如下几个显著优点: - 更易于优化因为不需要显式定义复杂的先验分布形式; - 可扩展性强支持多种模态转换场景应用比如文字转图画等等; - 输出质量稳定即使面对较为稀疏的数据集也能够维持良好表现水平; ```python import torch from diffusers import StableDiffusionPipeline model_id = "runwayml/stable-diffusion-v1-5" pipe = StableDiffusionPipeline.from_pretrained(model_id) prompt = "A beautiful landscape with mountains and a lake" image = pipe(prompt).images[0] image.save("landscape.png") ``` 以上代码片段展示了如何加载预先训练完毕的标准版本管道实例并通过简单的提示词快速渲染一张风景画效果图出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机械系的AI小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值