diffusion model (扩散模型)原理

本文介绍了扩散模型,区分了其正向的加噪声过程和反向的去噪生成过程。与VAE的一次性编码解码不同,扩散模型通过分步骤进行自回归。着重讲解了噪声预测器的训练方法和推理过程,以及如何从高斯噪声图片逐渐恢复清晰图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

扩散模型分为正向过程和反向过程。
正向过程为一点点在图片上添加噪声的过程,反向过程为去噪声的过程。

图片的生成就是反向过程,给一张高斯噪声图片,逐步去噪生成图片。
在这里插入图片描述

扩散模型和VAE的区别,
VAE是一步到位的(通过encoder-decoder),扩散模型要分成N个step, 是一个自回归过程。

在这里插入图片描述

扩散模型的训练过程

重复1到5行的过程,直到收敛。
每次采样一张图片 x 0 x_{0} x0,t, 和高斯噪声图像 ϵ \epsilon ϵ
α t ˉ \bar{\alpha _{t} } αtˉ是事先定义好的数字,你可以定义它随时间线性变小,也可以是cosine分布。在你采样 t 的时候,t 也同时对应了一个 α t ˉ \bar{\alpha _{t} } αtˉ
ϵ \epsilon ϵ是高斯噪声图片,那么在这里插入图片描述就表示在图片上添加噪声。
ϵ θ \epsilon_{\theta} ϵθ可以理解为一个noise predictor, 它可以是一个网络, i n p u t input input是加了噪声的图片在这里插入图片描述和 t , 输出是一个噪声图片 ϵ θ ( i n p u t ) \epsilon_{\theta}(input) ϵθ(input),
根据采样的噪声 ϵ \epsilon ϵ和预测的噪声图片 ϵ θ ( i n p u t ) \epsilon_{\theta}(input) ϵθ(input)的误差来训练这个noise predictor,
使它能够输出尽可能接进 ϵ \epsilon ϵ的噪声。

在这里插入图片描述

上面的过程也说明了一个问题,
当你采样了 t, 是可以直接计算 t 时刻的加了噪声的图片的,在这里插入图片描述
请添加图片描述

而不是想像中的这个样子:
请添加图片描述

推理过程

前面提到了扩散模型有正向和反向过程,
在正向过程中,图片是 x 0 x_{0} x0, 逐步加噪声,到T时刻的 x T x_{T} xT是一个噪声图片。

推理过程是反向过程,根据高斯噪声的 x T x_{T} xT的得到图片 x 0 x_{0} x0.

ϵ θ \epsilon_{\theta} ϵθ是前面训练过程中训练的noise predictor, 它的input为加了噪声的图片 x t x_{t} xt和 t.
z z z也是一个采样的噪声图片。
请添加图片描述
上面的过程是这样的:
采样N次,直到得到清晰的 x 0 x_{0} x0

在这里插入图片描述

公式推导部分待更新。

参考资料

### 扩散模型中的加噪过程 在扩散模型中,加噪过程是一个逐步向数据引入噪声的过程。这一过程可以从初始干净的数据分布出发,在一系列离散的时间步内逐渐增加高斯白噪声,直到最终完全随机化原始信号[^1]。 #### 加噪的具体机制 为了实现这一点,算法定义了一系列的方差参数 \(\beta_t\) 来控制每一步加入多少噪声。这些方差通常是从一个小值开始并线性增长至较大值结束。对于每一个时间步骤 \(t\), 可以表示为: \[ q(x_t|x_{t-1}) = N(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_tI) \] 其中 \(N(\cdot)\) 表示正态分布的概率密度函数,\(I\) 是单位矩阵。这表明每次迭代都是以前一次的状态为中心的一个多元正态分布采样得到的新状态。 随着 t 的增大,\(q(x_T| x_0)\) 将趋向于标准正态分布,即当 T 趋近无穷时,任何输入都会被转换成纯噪声。然而实际上并不需要如此多轮次就能使图像变得不可辨认。 #### 原理图解释 下面给出的是简化版的加噪流程示意代码,用于说明如何在一个简单的二维空间里执行上述操作: ```python import numpy as np from matplotlib import pyplot as plt def add_noise(image, beta_schedule): noisy_images = [] current_image = image.copy() for beta in beta_schedule: noise = np.random.normal(0, np.sqrt(beta), size=current_image.shape) next_noisy_image = np.sqrt(1-beta)*current_image + noise noisy_images.append(next_noisy_image) current_image = next_noisy_image return noisy_images # Example usage with a simple sine wave instead of an actual image. time_points = 100 original_signal = np.sin(np.linspace(-np.pi, np.pi, time_points)) betas = np.linspace(0.01, 0.99, num=20) noised_signals = add_noise(original_signal, betas) plt.figure(figsize=(8,6)) for i, sig in enumerate(noised_signals): plt.plot(sig, label=f'Step {i}') plt.title('Noise Addition Process') plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.show() ``` 此段Python脚本展示了随着时间推移不断给定型波形添加更多噪声的效果。每一层叠加后的图形代表了一个更接近纯粹随机性的版本。实际应用中,该方法会被应用于更高维度的空间比如RGB色彩通道组成的三维张量形式的照片上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蓝羽飞鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值