四、扩散模型(Diffusion Model)的测试过程

rh-li / 2024-10-23 / 原文

测试过程也叫采样过程,是从噪音\(\mathbf{x}_T\)中逐步去噪,最终生成图片的过程

文章内容主要参考了李宏毅老师的课程

目录
  • 1. 扩散模型的测试过程
    • 测试过程第1步
    • 测试过程第3步
    • 测试过程第4步
  • 2. 总结

1. 扩散模型的测试过程

在论文中,扩散模型的测试过程如下

image-20241017173024698

测试过程第1步

生成噪音\(\mathbf{x}_T\)

测试过程第3步

生成噪音\(\mathbf{z}\)。特别的,当\(t=1\)时,\(\mathbf{z} = 0\)

测试过程第4步

  • 目的:根据\(\mathbf{x}_t\),生成去噪后的图片\(\mathbf{x}_{t-1}\)

  • 公式讲解:

    • \(\boldsymbol{\epsilon}_\theta\left(\mathbf{x}_t, t\right)\)\(\boldsymbol{\epsilon}_\theta\)是预测噪音的模型,它有两个输入,分别是图片\(\mathbf{x}_t\)和时刻\(t\)

    • \(\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta\left(\mathbf{x}_t, t\right)\right)\)

      在第二篇文章中,我们知道,在前向过程中,在已知 \(\mathbf{x}_{t-1}\) 的条件下, \(\mathbf{x}_t\) 的概率密度函数 \(q\left(\mathbf{x}_t \mid \mathbf{x}_{t-1}\right)=\mathcal{N}\left(\mathbf{x}_t ; \sqrt{1-\beta_t} \mathbf{x}_{t-1}, \beta_t \mathbf{I}\right)\);在已知 \(\mathbf{x}_0\) 的条件下, \(\mathbf{x}_t\) 的概率密度函数 \(q\left(\mathbf{x}_t \mid \mathbf{x}_0\right)=\mathcal{N}\left(\mathbf{x}_t ; \sqrt{\bar{\alpha}_t} \mathbf{x}_0,\left(1-\bar{\alpha}_t\right) \mathbf{I}\right)\)

      根据贝叶斯公式,我们可以得到,在已知 \(\mathbf{x}_{t}\) 的条件下, \(\mathbf{x}_{t-1}\) 的概率密度函数\(q(\mathbf{x_{t-1}|\mathbf{x}_t})\)。推导之后,我们可以发现,\(q(\mathbf{x_{t-1}|\mathbf{x}_t})\)也服从正态分布,其方差为常数,均值为\(\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}\right)\),其中\(\boldsymbol{\epsilon}\)为从\(\mathbf{x}_0\)\(\mathbf{x}_t\)添加的噪音之和。

    详细的推导过程见上一篇文章

    我们设:在反向过程中,在已知 \(\mathbf{x}_{t}\) 的条件下, \(\mathbf{x}_{t-1}\) 的概率密度函数\(p_\theta(\mathbf{x_{t-1}|\mathbf{x}_t})\)

    我们想要让反向过程和正向过程尽可能保持一致,因此可以让\(p_\theta(\mathbf{x_{t-1}|\mathbf{x}_t})\)尽可能的接近\(q(\mathbf{x_{t-1}|\mathbf{x}_t})\)。也就是说,我们可以让\(p_\theta(\mathbf{x_{t-1}|\mathbf{x}_t})\)也是正态分布,其方差为常数,均值为\(\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta\left(\mathbf{x}_t, t\right)\right)\),其中\(\boldsymbol{\epsilon}_\theta\left(\mathrm{x}_t, t\right)\)是对\(\boldsymbol{\epsilon}\)的预测值

    在正态分布\(N(x;\mu,\sigma^2)\)中,当\(x = \mu\)时,概率密度函数取得最大值。

    因此,\(\mathbf{x}_{t-1} =\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta\left(\mathbf{x}_t, t\right)\right)\)时,\(p_\theta(\mathbf{x_{t-1}|\mathbf{x}_t})\)取得最大值。也就是说,在已知\(\mathbf{x}_t\)的情况下,\(\mathbf{x}_{t-1}\)最有可能取到\(\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta\left(\mathbf{x}_t, t\right)\right)\)这个值。

    • \(\mathbf{x}_{t-1}=\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta\left(\mathbf{x}_t, t\right)\right)+\sigma_t \mathbf{z}\)

      但是在最终,我们在\(\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} \boldsymbol{\epsilon}_\theta\left(\mathbf{x}_t, t\right)\right)\)后面又加上了噪声\(\sigma_t \mathbf{z}\)(其中,\(\sigma_t\)为正态分布\(p_\theta(\mathbf{x_{t-1}|\mathbf{x}_t})\)的标准差)作为\(\mathbf{x}_{t-1}\)的推测值。

      为什么这么干呢?因为在真实世界中,会有很多随机扰动,加入噪音的目的就是为了模拟这些扰动,以防止模型过拟合。

      并且经过实验,如果我们不加入随机噪声,那么扩散模型是无法生成图片的;只有加入随机噪声,才能正常生成图片。

      如下图,不加入随机噪声时(即\(\sigma_t = 0\)时),无法生成正常的图片
      image-20241021145608519

2. 总结

应该说,经过了前面几篇文章的铺垫,理解扩散模型的测试过程是不难的。

至此,扩散模型的理论部分已经分享完毕。

在下篇文章中,我会尝试用Python实现扩散模型。