DDPM学习笔记

        DDPM(Denoising Diffusion Probabilistic Models)是一类基于扩散过程的生成模型。它的核心思想是通过模拟数据从噪声中恢复的过程,来生成新的数据样本。DDPM的构建过程与传统的生成对抗网络(GAN)和变分自编码器(VAE)不同,主要通过一系列的“去噪”操作来训练模型。

 ①正向过程:

        正向过程是一个逐步给数据添加噪声的过程,目标是将原始数据 x_0 逐渐转化为一个完全的噪声样本 x_T​。

        设 T 为总步数(也可以理解为噪声的添加次数),从原始数据 x_0​ 开始,经过每一时间步 t,每一步都加上一些噪声,最终得到纯噪声x_T​。正向过程是一个马尔可夫链,意味着当前时刻的状态 x_t​ 仅依赖于前一时刻的状态 x_{t-1}​。这种过程可以通过条件概率 q(x_t | x_{t-1}) 来描述。这个过程的数学表达是一个马尔可夫链的形式:

q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t \mathbf{I})

其中:

  • x_t​ 是第 t 步的图像,
  • \beta_t​ 是一个预先定义的序列,通常随着 t 的增加而增加(即噪声逐渐增大,\beta_t​ 的选择对模型性能至关重要。常见的设置是线性增加或余弦调度的 \beta_t。)
  • \mathcal{N}(\cdot) 表示高斯分布。
  • \sqrt{1 - \beta_t} x_{t-1} 是带有缩放因子的当前样本,它控制了噪声加入的程度。
  • \beta_t \mathbf{I} 是在每个时间步 t 添加的噪声大小。这里的 \beta_t​ 是一个随着时间逐渐增大的系数,通常是一个非常小的值,控制每一步加入的噪声量。

为什么需要缩放因子?

        在DDPM的前向过程中,每一步都会向数据 x_{t-1} 添加高斯噪声,生成 x_t ​。如果不加缩放因子,直接添加噪声会导致数据的尺度(即数据的方差)逐渐增大,最终可能发散到无穷大(即图像 x_{t-1} 的原始内容可能会过度被噪声覆盖)。为了避免这种情况,我们需要对当前样本 x_{t-1} 进行缩放,确保数据的尺度在每一步都保持稳定。

        缩放因子 \sqrt{1 - \beta_t}的选择是为了确保前向过程的确保 xt​ 的方差在每一步都保持为 1,最终分布 q(xT) 是一个标准高斯分布(即均值为 0,方差为 1)

我们逐步增加噪声,直到 x_T​ 变成一个完全的高斯噪声样本。这个过程可以写作:

q(x_T | x_0) = \mathcal{N}(x_T; 0, \mathbf{I})

为了简化计算,可以直接从初始数据 x_0​ 计算任意一步 x_t 的分布,而不需要逐步迭代。具体公式如下(虽然我数学不好推不出来,但是说是这个就是这个叭!)

q(x_t|x_0)=\mathcal{N}(x_t;\sqrt{\bar{\alpha}_t}x_0,(1-\bar{\alpha}_t)\mathbf{I})

其中,      \alpha_{t}=1-\beta_{t}\mathrm\\

                 \bar{\alpha}_{t}=\prod_{s=1}^t\alpha_s

 反向过程:

        反向过程的目标是学习如何从噪声图像 x_T 恢复到原始图像 x_0。假设我们有一个去噪网络 p_\theta(x_{t-1} | x_t),它通过条件生成去噪过程,将每一步的噪声图像恢复到原始图像。

我们可以通过贝叶斯定理来推导反向过程的条件概率。贝叶斯定理告诉我们:

p(\mathbf{x}_{t-1} \mid \mathbf{x}_t) = \frac{p(\mathbf{x}_t \mid \mathbf{x}_{t-1}) p(\mathbf{x}_{t-1})}{p(\mathbf{x}_t)}

但在实际推导中,我们关心的更多是 近似 的过程,因此我们引入一个噪声模型来简化推导。通过变分推断和正向过程的定义,我们可以得到反向过程的高斯分布形式。每一步都根据以下公式从 x_t 生成 x_{t-1}​:

p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_{t-1};\mu_\theta(x_t,t),\Sigma_\theta(x_t,t))

其中,

  • \mu_\theta(x_t,t)是神经网络预测的均值。

  • \Sigma_\theta(x_t,t))是神经网络预测的方差。

  • θ是神经网络的参数。

        反向过程的目标是根据当前的样本 \mathbf{x}_t 预测出上一时刻的样本\mathbf{x}_{t-1}​。为了得到 p(\mathbf{x}_{t-1} \mid \mathbf{x}_t),我们需要用到正向过程的相关信息,并进行推导。在扩散模型中,我们通过训练网络来学习在每个时间步 t 给定 x_t​ 的条件下,预测出噪声 \boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t)。即我们训练的目标是使得模型能够预测出给定 x_t 的噪声。

根据正向过程中的加噪方式,真实的噪声部分 ϵ 是:

\mathbf{x}_t = \sqrt{\alpha_t} \mathbf{x}_{t-1} + \sqrt{1 - \alpha_t} \boldsymbol{\epsilon}

        从这个式子我们可以看到,噪声 ϵ 是当前样本 x_t 和前一个样本  x_{t-1} 之间的差异的一部分。因此,模型通过预测这个噪声 \boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t),就能够从 x_t 恢复出 x_{t-1}

通过推导,我们得到以下公式:

\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}(\mathbf{x}_{t},t)\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(\mathbf{x}_t, t) \right)是根据预测的噪声 \boldsymbol{\epsilon}_\theta(\mathbf{x}_t, t) 从当前样本 \mathbf{x}_t中去除噪声,恢复上一时刻的图像 \mathbf{x}_{t-1}。而 \sigma_t \mathbf{z}是引入的噪声项,它控制了反向过程中生成的随机性。 z是从标准正态分布中采样的噪声,\sigma_t是噪声的标准差,通常随着时间步的增加而增加。

为什么要添加噪声项\sigma_t \mathbf{z}

由于扩散过程本质上是一个随机过程,反向去噪过程需要在每个步骤中引入适量的随机噪声,确保最终的生成结果具有多样性,而不是陷入局部最优解。(原来是这样吗?)

③反向过程的训练目标:

    最大化数据的对数似然  :  \log p(x_0)

为什么最大化对数似然?
最大化对数似然\log p(x_0)可以确保生成的数据 x0​ 尽可能接近真实数据分布 q(x0),如果 pθ(x0)接近 q(x0),说明模型能够生成高质量的样本。

ELBO

  •  But 直接最大化\log p(x_0)是非常困难的,因为它涉及高维积分和复杂的概率计算。因此,DDPM 使用 变分下界(Evidence Lower Bound, ELBO) 来间接优化 \log p(x_0)
  • \mathcal{L}=\mathbb{E}_{q(x_0)} \begin{bmatrix} -\log p_\theta(x_0) \end{bmatrix}
  • 引入隐变量 x_{1},x_{2},\ldots,x_{T},表示前向过程的中间状态。根据概率的链式法则,可以写成
  • \log p(x_0)=\log\int p(x_0,x_1,x_2,\ldots,x_T)dx_1dx_2\ldots dx_T
  • 引入变分分布q(x_1,x_2,\ldots,x_T|x_0),表示前向过程的分布。根据 Jensen 不等式,可以推导出下界:
  • \log p(x_0)\geq\mathbb{E}_q\left[\log\frac{p(x_0,x_1,x_2,\ldots,x_T)}{q(x_1,x_2,\ldots,x_T|x_0)}\right]
  • 将联合分布p(x_1,x_2,\ldots,x_T) 分解为:
  • p(x_0,x_1,x_2,\ldots,x_T)=p(x_T)\prod_{t=1}^Tp_\theta(x_{t-1}|x_t)
  • 将分解后的联合分布代入下界,并简化得到
  • \log p(x_0)\geq\mathbb{E}_q\left[\sum_{t=1}^T\log p_\theta(x_{t-1}|x_t)-\mathrm{KL}(q(x_t|x_{t-1})||p_\theta(x_{t-1}|x_t))\right]

具体的ELBO推导过程也可以参考VAE,是类似的。===》》VAE学习笔记

也就是原论文中的公式(3)

上式经过整理和变换可以变为:

对于公式5,里面一共有三项:

  • 对于L_T 的含义:  x_t = \sqrt{\alpha_t} \cdot x_0 + \sqrt{1 - \alpha_t} \cdot \epsilon 与 \epsilon 尽可能接近
  • 对于L_0 的含义:x_1x_0 尽可能的接近;实际上这项 loss 最后没用
  • 因此,核心的优化目标就是L_{T-1}

最后就变成了令q(x_{t-1}|x_{t},x_{0}){\sim}N(x_{t-1};\tilde{\mu}(x_{t},x_{0}),\tilde{\sigma}_{t}I)         和              

                         p_{\theta}(x_{t-1}|x_{t})=\mathrm{N}(x_{t-1};\mu_{\theta}(x_{t},t),\sum_{\theta}(x_{t},t))  的KL散度尽量小

代入KL散度的式子进行一番推理:

                  D_{KL}(q(x_t|x_{t+1},x_0)||P_\theta(x_t|x_{t-1}))           (过程略,因为我看不懂)

             =\log\left(\frac{\sum_\theta(x_t,t)}{\tilde{\sigma}_t}\right)-\frac{1}{2}+\frac{\tilde{\sigma}_t^2}{2\sum_\theta(x_t,t)^2}+\frac{\left(\tilde{\mu}(x_t,x_0)-\mu_\theta(x_t,t)\right)^2}{2\sum_\theta(x_t,t)^2}

最终可以求得,

  • \sigma_t^2=\tilde{\beta}_t=\frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}\beta_t
  • \mu_\theta(\mathbf{x}_t,t)=\frac{1}{\sqrt{\alpha_t}}\left(\mathbf{x}_t-\frac{\beta_t}{\sqrt{1-\bar{\alpha}_t}}\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t)\right)

论文的作者固定了方差,优化二者的均值。

这样损失值的式子就变成了\frac{(\tilde{\mu}(x_t,x_0)-\mu_\theta(x_t,t))^2}{2\sum_\theta(x_t,t)^2},只要优化这一项就可以了。通过此最终去预测噪声。

MSE

在实际训练中,直接优化 ELBO 仍然比较复杂,因此 通常简化为预测噪声的均方误差(MSE),通过优化损失函数,学习去噪网络的参数 θ(通过梯度下降法更新神经网络的参数 θ)。

\mathcal{L}_t=\mathbb{E}_{x_0,\epsilon,t} \begin{bmatrix} \|\epsilon-\epsilon_\theta(x_t,t)\|^2 \end{bmatrix}

其中:

  • ϵ 是前向过程中添加的噪声。

  • \theta(x_t,t)是神经网络预测的噪声。

Colab是一个基于云端的Jupyter笔记本环境,可以免费使用GPU和TPU资源。DDPM(Diffusion Probabilistic Models)是一种生成模型,用于生成高质量的图像。在Colab上部署DDPM扩散模型可以让你在云端快速搭建和训练模型。 以下是Colab部署DDPM扩散模型的步骤: 1. 打开Colab网站(https://colab.research.google.com/)并登录你的Google账号。 2. 创建一个新的笔记本或者打开一个已有的笔记本。 3. 在笔记本中导入所需的库和模型。你可以使用PyTorch或TensorFlow等深度学习框架来实现DDPM模型。 4. 准备数据集。根据你的需求,可以选择使用已有的数据集或者自己准备数据集。 5. 定义DDPM模型的结构和参数。根据DDPM的论文或者相关资料,实现DDPM模型的网络结构和训练参数。 6. 加载数据集并进行预处理。根据你的数据集格式和要求,加载数据集并进行必要的预处理,例如图像大小调整、归一化等。 7. 定义损失函数和优化器。根据DDPM模型的训练目标,选择合适的损失函数和优化器。 8. 进行模型训练。使用加载的数据集和定义的损失函数、优化器,进行模型的训练。可以设置合适的训练轮数和批次大小。 9. 保存训练好的模型。在训练完成后,保存模型以备后续使用。 10. 进行模型评估和生成。使用保存的模型对新数据进行评估和生成,观察生成效果并进行调整。 以上是在Colab上部署DDPM扩散模型的一般步骤。具体实现过程中,可能还需要根据你的具体需求进行一些调整和优化。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值