searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

扩散模型初探:从噪声到生成图片

2024-09-09 09:47:50
19
0

什么是扩散模型?

扩散模型的目标是解决生成式建模问题,具体来说,就是给定一些训练数据(例如狗的图片),我们希望模型能够生成与这些训练数据分布相似的图片。要直接生成这些图片比较困难,因此扩散模型的一个巧妙的做法是将问题分解为很多个简单的步骤。

扩散模型的核心思想是从噪声生成图片,过程分为两步:

  1. 正向过程:把清晰的图片逐步加上噪声,使得图片变得越来越模糊,直到变成纯噪声。
  2. 反向过程:从噪声图片开始,逐步去除噪声,恢复成清晰的图片。

通过正向和反向过程的结合,扩散模型可以从噪声图片中生成新图片,逼真到看起来像是从训练集中获得的。

正向扩散:从清晰到模糊

在扩散模型中,正向过程是一个加噪声的过程。我们从一张清晰的图片开始,逐步加入高斯噪声,图片会随着时间变得越来越模糊。假设一张清晰的图片是 x_0,在第 t 步时加入噪声后变成 x_t。正向扩散的每一步都可以通过以下公式表示:

x_{t+1} = x_t + \eta_t, \quad \eta_t \sim \mathcal{N}(0, \sigma^2)

其中,\eta_t 是一个随机的高斯噪声,均值为 0,方差为 \sigma^2。每次加入一些噪声后,图片变得更加模糊。最终,经过多次加噪声,图片会变成完全随机的噪声图片。

高斯扩散过程

通过上面的公式,我们可以理解为每一步都是在图片的每一个像素上加上一些随机噪声。这样一来,随着步骤的增多,图片逐渐失去原有的结构,变成噪声。这个过程就是将图片逐渐转化为噪声分布的过程。

假设我们一开始有一张清晰的狗图片(即 x_0),经过正向扩散过程,我们会得到:

  1. 第1步:在清晰的狗图片上加上一些高斯噪声,得到稍微模糊的图片 x_1
  2. 第2步:继续加噪声,图片变得更加模糊,得到 x_2
  3. 第3步:再加更多噪声,狗的轮廓开始消失。
  4. 最后一步:经过多次加噪声,图片变成了一张完全的噪声图片 x_T

此时,图片中的任何结构信息都被高斯噪声取代。

反向扩散:从噪声到清晰

反向扩散是扩散模型中最重要的部分,因为它决定了如何从噪声中恢复图片。在反向扩散过程中,我们的目标是学习如何逐步去除噪声,让图片逐步从模糊恢复为清晰。这个过程需要训练一个模型,让它能够在每个时间步骤中根据当前的模糊图片生成稍微清晰一点的图片。

反向扩散的核心思想

在反向扩散中,我们从一个噪声图片 x_T 开始,通过多次去噪,逐步得到清晰的图片 x_0。反向过程可以通过以下的条件概率分布来描述:

p(x_{t-1} | x_t)

这个条件分布表示,给定当前的模糊图片 x_t,我们如何生成前一步的图片 x_{t-1}。为了简化这个问题,通常假设这个条件分布是一个高斯分布:

p(x_{t-1} | x_t) \approx \mathcal{N}(x_{t-1}; \mu_t(x_t), \sigma^2)

这里,\mu_t(x_t) 是我们要学习的均值函数,它表示在第 t 步时,我们对 x_{t-1} 的估计。而 \sigma^2 是固定的噪声方差。这个简化使得我们只需要学习均值 \mu_t(x_t),从而将生成任务转化为回归问题。

去噪过程

具体来说,反向过程可以这样理解:

  1. 起点:我们从一张噪声图片 x_T 开始(这是一张随机的高斯噪声图片)。
  2. 每一步:我们使用模型预测出稍微清晰一点的图片 x_{t-1},每一步都是通过去除部分噪声来完成的。
  3. 最终:经过多次迭代,图片逐渐变清晰,最终恢复到 x_0,也就是我们期望生成的图片。

每一步中,去噪的方式是通过学习到的模型(比如一个神经网络)来预测当前图片的去噪版本。我们使用卷积神经网络来进行回归学习,即给定模糊的输入图片,网络输出去噪后的图片。

反向过程中的去噪公式

在反向扩散中,每一步我们都根据之前的噪声图片 x_t 生成更接近真实图片的 x_{t-1},这个过程可以用以下公式表示:

x_{t-1} = x_t - f_\theta(x_t, t) + \eta

其中,f_\theta(x_t, t) 是一个神经网络,它的任务是估计出当前噪声图片的去噪部分,而 \eta 是加入的小噪声。通过训练 f_\theta,我们可以学习如何在每一步去除噪声,从而恢复图片。

具体步骤

  1. 第一步:从噪声图片 x_T 开始,我们预测出稍微清晰一点的图片 x_{T-1}
  2. 第二步:使用 x_{T-1},进一步去除噪声,生成 x_{T-2}
  3. 如此重复:一步步去除噪声,逐渐从完全随机的噪声图片回到清晰的狗图片 x_0

通过这个反向过程,我们可以从一张随机的噪声图片生成出一张真实的图片。

离散化:一步一步进行

在实际应用中,扩散过程是离散化的,也就是说我们不会连续地进行加噪或去噪,而是通过很多小步骤来完成这个过程。为了确保每一步都是平滑过渡的,我们可以控制每一步加入或去除的噪声量。

假设扩散过程有 T 步,每一步的噪声方差会根据步数 t 进行调整:

\sigma_t = \sigma_q \sqrt{\Delta t}

其中 \sigma_q 是噪声的总量,\Delta t = 1/T 是每一步的时间间隔。通过这种方式,我们可以保证无论是正向还是反向过程,噪声的变化都是平滑的,最终可以顺利生成出清晰的图片。

举个例子

假设我们有10步的扩散过程,每一步我们都要加一点噪声:

  1. 第一步:从一张清晰的狗图片开始,加入少量噪声。
  2. 第二步:再加一点噪声,图片变得更模糊。
  3. 如此重复,每次都加一点噪声,直到第10步,图片完全变成了随机的噪声。

接着,反向扩散时:

  1. 第一步:从噪声图片开始,去除一点噪声,图片变得稍微清晰。
  2. 第二步:继续去除噪声,开始看到一些狗的轮廓。
  3. 最终,经过10步,图片还原成了一张清晰的狗的图片。

总结

扩散模型的关键在于通过一步步的小操作,将复杂的问题分解为简单的任务。正向过程让我们逐步把图片变得模糊,而反向过程则通过学习去噪,让我们能够从一张噪声图片生成出清晰的图片。

这种方法类似于走近一件模糊的物体,随着我们离它越来越近,它变得越来越清晰,直到我们完全看清楚。这就是扩散模型从噪声到清晰的生成。

0条评论
0 / 1000
LGROTS
4文章数
0粉丝数
LGROTS
4 文章 | 0 粉丝
原创

扩散模型初探:从噪声到生成图片

2024-09-09 09:47:50
19
0

什么是扩散模型?

扩散模型的目标是解决生成式建模问题,具体来说,就是给定一些训练数据(例如狗的图片),我们希望模型能够生成与这些训练数据分布相似的图片。要直接生成这些图片比较困难,因此扩散模型的一个巧妙的做法是将问题分解为很多个简单的步骤。

扩散模型的核心思想是从噪声生成图片,过程分为两步:

  1. 正向过程:把清晰的图片逐步加上噪声,使得图片变得越来越模糊,直到变成纯噪声。
  2. 反向过程:从噪声图片开始,逐步去除噪声,恢复成清晰的图片。

通过正向和反向过程的结合,扩散模型可以从噪声图片中生成新图片,逼真到看起来像是从训练集中获得的。

正向扩散:从清晰到模糊

在扩散模型中,正向过程是一个加噪声的过程。我们从一张清晰的图片开始,逐步加入高斯噪声,图片会随着时间变得越来越模糊。假设一张清晰的图片是 x_0,在第 t 步时加入噪声后变成 x_t。正向扩散的每一步都可以通过以下公式表示:

x_{t+1} = x_t + \eta_t, \quad \eta_t \sim \mathcal{N}(0, \sigma^2)

其中,\eta_t 是一个随机的高斯噪声,均值为 0,方差为 \sigma^2。每次加入一些噪声后,图片变得更加模糊。最终,经过多次加噪声,图片会变成完全随机的噪声图片。

高斯扩散过程

通过上面的公式,我们可以理解为每一步都是在图片的每一个像素上加上一些随机噪声。这样一来,随着步骤的增多,图片逐渐失去原有的结构,变成噪声。这个过程就是将图片逐渐转化为噪声分布的过程。

假设我们一开始有一张清晰的狗图片(即 x_0),经过正向扩散过程,我们会得到:

  1. 第1步:在清晰的狗图片上加上一些高斯噪声,得到稍微模糊的图片 x_1
  2. 第2步:继续加噪声,图片变得更加模糊,得到 x_2
  3. 第3步:再加更多噪声,狗的轮廓开始消失。
  4. 最后一步:经过多次加噪声,图片变成了一张完全的噪声图片 x_T

此时,图片中的任何结构信息都被高斯噪声取代。

反向扩散:从噪声到清晰

反向扩散是扩散模型中最重要的部分,因为它决定了如何从噪声中恢复图片。在反向扩散过程中,我们的目标是学习如何逐步去除噪声,让图片逐步从模糊恢复为清晰。这个过程需要训练一个模型,让它能够在每个时间步骤中根据当前的模糊图片生成稍微清晰一点的图片。

反向扩散的核心思想

在反向扩散中,我们从一个噪声图片 x_T 开始,通过多次去噪,逐步得到清晰的图片 x_0。反向过程可以通过以下的条件概率分布来描述:

p(x_{t-1} | x_t)

这个条件分布表示,给定当前的模糊图片 x_t,我们如何生成前一步的图片 x_{t-1}。为了简化这个问题,通常假设这个条件分布是一个高斯分布:

p(x_{t-1} | x_t) \approx \mathcal{N}(x_{t-1}; \mu_t(x_t), \sigma^2)

这里,\mu_t(x_t) 是我们要学习的均值函数,它表示在第 t 步时,我们对 x_{t-1} 的估计。而 \sigma^2 是固定的噪声方差。这个简化使得我们只需要学习均值 \mu_t(x_t),从而将生成任务转化为回归问题。

去噪过程

具体来说,反向过程可以这样理解:

  1. 起点:我们从一张噪声图片 x_T 开始(这是一张随机的高斯噪声图片)。
  2. 每一步:我们使用模型预测出稍微清晰一点的图片 x_{t-1},每一步都是通过去除部分噪声来完成的。
  3. 最终:经过多次迭代,图片逐渐变清晰,最终恢复到 x_0,也就是我们期望生成的图片。

每一步中,去噪的方式是通过学习到的模型(比如一个神经网络)来预测当前图片的去噪版本。我们使用卷积神经网络来进行回归学习,即给定模糊的输入图片,网络输出去噪后的图片。

反向过程中的去噪公式

在反向扩散中,每一步我们都根据之前的噪声图片 x_t 生成更接近真实图片的 x_{t-1},这个过程可以用以下公式表示:

x_{t-1} = x_t - f_\theta(x_t, t) + \eta

其中,f_\theta(x_t, t) 是一个神经网络,它的任务是估计出当前噪声图片的去噪部分,而 \eta 是加入的小噪声。通过训练 f_\theta,我们可以学习如何在每一步去除噪声,从而恢复图片。

具体步骤

  1. 第一步:从噪声图片 x_T 开始,我们预测出稍微清晰一点的图片 x_{T-1}
  2. 第二步:使用 x_{T-1},进一步去除噪声,生成 x_{T-2}
  3. 如此重复:一步步去除噪声,逐渐从完全随机的噪声图片回到清晰的狗图片 x_0

通过这个反向过程,我们可以从一张随机的噪声图片生成出一张真实的图片。

离散化:一步一步进行

在实际应用中,扩散过程是离散化的,也就是说我们不会连续地进行加噪或去噪,而是通过很多小步骤来完成这个过程。为了确保每一步都是平滑过渡的,我们可以控制每一步加入或去除的噪声量。

假设扩散过程有 T 步,每一步的噪声方差会根据步数 t 进行调整:

\sigma_t = \sigma_q \sqrt{\Delta t}

其中 \sigma_q 是噪声的总量,\Delta t = 1/T 是每一步的时间间隔。通过这种方式,我们可以保证无论是正向还是反向过程,噪声的变化都是平滑的,最终可以顺利生成出清晰的图片。

举个例子

假设我们有10步的扩散过程,每一步我们都要加一点噪声:

  1. 第一步:从一张清晰的狗图片开始,加入少量噪声。
  2. 第二步:再加一点噪声,图片变得更模糊。
  3. 如此重复,每次都加一点噪声,直到第10步,图片完全变成了随机的噪声。

接着,反向扩散时:

  1. 第一步:从噪声图片开始,去除一点噪声,图片变得稍微清晰。
  2. 第二步:继续去除噪声,开始看到一些狗的轮廓。
  3. 最终,经过10步,图片还原成了一张清晰的狗的图片。

总结

扩散模型的关键在于通过一步步的小操作,将复杂的问题分解为简单的任务。正向过程让我们逐步把图片变得模糊,而反向过程则通过学习去噪,让我们能够从一张噪声图片生成出清晰的图片。

这种方法类似于走近一件模糊的物体,随着我们离它越来越近,它变得越来越清晰,直到我们完全看清楚。这就是扩散模型从噪声到清晰的生成。

文章来自个人专栏
扩散模型学习笔记
1 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0