Diffusion Model 学习

1. 第一节

1.1 一个不断添加噪音的逆向过程

请添加图片描述

1.2 与 VAE 的区别和联系

请添加图片描述

1.3 Diffusion 的训练原理

请添加图片描述

先产生一张 Noise Image,是通过 t 来选生成的;然后把选取的 t 和这张 noise Imgae 都输入到 Noise predictor 里面,得到预测的噪声,然后和真是的噪声作对比,得到损失。

1.4 Diffusion 的推理原理

请添加图片描述
请添加图片描述

2. 第二节

2.1 生成模型的目标

请添加图片描述

2.2 参数学习的目标

请添加图片描述

说白了就是,要找到一组参数,使得产生 x1,x2,…xm 的概率成绩越大越好。

优化公式推导:乘积——>积分
请添加图片描述

3. 第三节 DDPM

3.1 前向过程原理(Forward process)

参考学习 zhihu

参考学习 better

对于原始数据 x 0 x_0 x0~ q ( x 0 ) q(x_0) q(x0), 总共包含 T 步的扩散过程的每一步都是对上一步得到的数据 x t − 1 x_{t-1} xt1按照如下方式增加高斯噪音:

q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t|x_{t-1}) = N(x_t;\sqrt{1-\beta_{t}}x_{t-1},\beta_{t}I) q(xtxt1)=N(xt;1βt xt1,βtI)

通过马尔科夫链+重参数技巧可以得到 x t x_t xt x 0 x_0 x0的直接关系

q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(x_t|x_0) = N(x_t;\sqrt{\bar\alpha_t}x_0,(1-\bar\alpha_{t})I) q(xtx0)=N(xt;αˉt x0,(1αˉt)I)

其中 α t = 1 − β t \alpha_t = 1-\beta_t αt=1βt α ˉ t = ∏ i = 1 a i \bar\alpha_{t}=\prod_{i=1}{a_{i}} αˉt=i=1ai

这个特性很重要,可以看成 x t x_{t} xt是原始数据 x 0 x_{0} x0和随机噪音的线性组合. α ˉ t \sqrt{\bar\alpha_t} αˉt ( 1 − α ˉ t ) (1-\bar\alpha_{t}) (1αˉt)是组合系数,被称为 signal*rate 和 noise_rate. 然后就可以基于 α ˉ ∗ t \bar\alpha*{t} αˉt 而不是 β t \beta_{t} βt 来定义 noise schedule. 比如直接将 α ˉ t \bar\alpha_{t} αˉt 设定为接近 0 的值,那么就可以保证得到最终的 x T x_T xT近似为一个随机噪音.
请添加图片描述

3.2 反向过程 (reverse process)

对于反向过程,其实就是一个去噪的过程,如果我们知道反向过程的每一步的真实分布
q ( x t − 1 ∣ x t ) q({x_{t-1}|x_{t}}) q(xt1xt),那么从一个随机噪音 x T x_T xT~N(0,1)开始,逐渐去噪就能得到一个真实的样本,即生成数据的过程.

反向过程也定义为一个马尔科夫链,只不过是由一系列的神经网络参数的高斯分布来组成.

在去除参数的过程中,我们需要用 x t x_t xt去预测 x t − 1 x_{t-1} xt1. 采用贝叶斯公式去计算后验概率

P ( x t − 1 ∣ x t ) = P ( x t − 1 x t ) P ( x t ) = P ( x t ∣ x t − 1 ) P ( x t − 1 ) P ( x t ) P\left(x_{t-1} \mid x_t\right)=\frac{P\left(x_{t-1} x_t\right)}{P\left(x_t\right)}=\frac{P\left(x_t \mid x_{t-1}\right) P\left(x_{t-1}\right)}{P\left(x_t\right)} P(xt1xt)=P(xt)P(xt1xt)=P(xt)P(xtxt1)P(xt1)

然后由于原图 x 0 x_0 x0已知,进行公式改写:

P ( x t − 1 ∣ x t , x 0 ) = P ( x t ∣ x t − 1 , x 0 ) P ( x t − 1 ∣ x 0 ) P ( x t ∣ x 0 ) P\left(x_{t-1} \mid x_t, x_0\right)=\frac{P\left(x_t \mid x_{t-1}, x_0\right) P\left(x_{t-1} \mid x_0\right)}{P\left(x_t \mid x_0\right)} P(xt1xt,x0)=P(xtx0)P(xtxt1,x0)P(xt1x0)

等式右边部分都变成先验概率,我们由前向加噪过程即可对公式进行改写,依据为
x t = α t ‾ x 0 + 1 − α t ‾ ϵ x_t=\sqrt{\overline{\alpha_t}} x_0+\sqrt{1-\overline{\alpha_t}} \epsilon xt=αt x0+1αt ϵ 和 $xt=\sqrt{1-\beta_t} x{t-1}+\sqrt{\beta_t} \epsilon $ 可以得到:

P ( x t − 1 ∣ x t , x 0 ) = N ( α t x t − 1 , 1 − α t ) N ( α t − 1 x 0 , 1 − α t − 1 − ) N ( α t ‾ x 0 , 1 − α t ‾ ) P\left(x_{t-1} \mid x_t, x_0\right)=\frac{N\left(\sqrt{\alpha_t} x_{t-1}, 1-\alpha_t\right) N\left(\sqrt{\alpha_{t-1}} x_0, 1-\alpha_{t-1}^{-}\right)}{N\left(\sqrt{\overline{\alpha_t}} x_0, 1-\overline{\alpha_t}\right)} P(xt1xt,x0)=N(αt x0,1αt)N(αt xt1,1αt)N(αt1 x0,1αt1)

最后通过一系列 替换以及正态分布的性质,可以得到最终的结果.

P ( x t − 1 ∣ x t ) = N ( 1 α t ( x t − 1 − α t 1 − α t ‾ ϵ ) , ( 1 − α t ) ( 1 − α t − 1 − ) 1 − α t ‾ ) P\left(x_{t-1} \mid x_t\right)=N\left(\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{1-\alpha_t}{\sqrt{1-\overline{\alpha_t}}} \epsilon\right), \frac{\left(1-\alpha_t\right)\left(1-\alpha_{t-1}^{-}\right)}{1-\overline{\alpha_t}}\right) P(xt1xt)=N(αt 1(xt1αt 1αtϵ),1αt(1αt)(1αt1))

但是, ϵ \epsilon ϵ的具体的值我们并不知道, 因此我们需要去训练一个网络去预测噪声,也就是 李宏毅提到的 noise predictor.

4. 第四节 DDIM

DDPM 的缺陷在于,推理速度过慢,因为其本身是一个马尔科夫链的过程,无法进行跳跃预测,即无法通过 x t x_t xt直接去预测 x t − 2 x_{t-2} xt2,于是就有了 DDIM 的出现. 无需重新训练 DDPM,只需要对采样器进行修改即可.

P ( x t − 1 ∣ x t , x 0 ) ∼ N ( ( α t − 1 − − 1 − α t − 1 − − σ 2 1 − α t ‾ α t ‾ ) x 0 + ( 1 − α t − 1 − − σ 2 1 − α t ‾ ) x t , σ 2 ) ∼ N ( α t − 1 − x 0 + 1 − α t − 1 − − σ 2 x t − α t x 0 1 − α t ‾ , σ 2 ) \begin{aligned} & P\left(x_{t-1} \mid x_t, x_0\right) \sim N\left(\left(\sqrt{\alpha_{t-1}^{-}}-\frac{\sqrt{1-\alpha_{t-1}^{-}-\sigma^2}}{\sqrt{1-\overline{\alpha_t}}} \sqrt{\overline{\alpha_t}}\right) x_0+\left(\frac{\sqrt{1-\alpha_{t-1}^{-}-\sigma^2}}{\sqrt{1-\overline{\alpha_t}}}\right) x_t, \sigma^2\right) \\ & \sim N\left(\sqrt{\alpha_{t-1}^{-}} x_0+\sqrt{1-\alpha_{t-1}^{-}-\sigma^2} \frac{x_t-\sqrt{\alpha_t} x_0}{\sqrt{1-\overline{\alpha_t}}}, \sigma^2\right) \end{aligned} P(xt1xt,x0)N αt1 1αt 1αt1σ2 αt x0+ 1αt 1αt1σ2 xt,σ2 N(αt1 x0+1αt1σ2 1αt xtαt x0,σ2)

采用与反向去噪同样的原理,将上述公式的 x 0 x_0 x0
进行替换,这里采用 ϵ t \epsilon_t ϵt
是因为前文已经说明过采用的是模型预测的正态分布

x prev  = α prev  − ( x t − 1 − α t ‾ ϵ t α t ‾ ) + 1 − α prev  − − σ 2 ϵ t + σ 2 ϵ x_{\text {prev }}=\sqrt{\alpha_{\text {prev }}^{-}}\left(\frac{x_t-\sqrt{1-\overline{\alpha_t}} \epsilon_t}{\sqrt{\overline{\alpha_t}}}\right)+\sqrt{1-\alpha_{\text {prev }}^{-}-\sigma^2} \epsilon_t+\sigma^2 \epsilon xprev =αprev  (αt xt1αt ϵt)+1αprev σ2 ϵt+σ2ϵ

其中 x t x_t xt x p r e v x_{prev} xprev可以相隔多个迭代步数.

5. 总结

5.1 DDPM 公式

定义:

x t = α t x t − 1 + 1 − α t ϵ ϵ ∼ N ( 0 , 1 ) \begin{gathered} x_t=\sqrt{\alpha_t} x_{t-1}+\sqrt{1-\alpha_t} \epsilon \\ \epsilon \sim N(0,1) \end{gathered} xt=αt xt1+1αt ϵϵN(0,1)

经过推导得到 x 0 x_0 x0 x t x_t xt

x t = α t ‾ x 0 + 1 − α t ‾ ϵ x 0 = x t − 1 − α t ‾ ϵ α t ‾ \begin{gathered} x_t=\sqrt{\overline{\alpha_t}} x_0+\sqrt{1-\overline{\alpha_t}} \epsilon \\ x_0=\frac{x_t-\sqrt{1-\overline{\alpha_t}} \epsilon}{\sqrt{\overline{\alpha_t}}} \end{gathered} xt=αt x0+1αt ϵx0=αt xt1αt ϵ

进一步得到后验概率:

P ( x t − 1 ∣ x t ) = N ( 1 α t ( x t − 1 − α t 1 − α t ˉ ϵ ) , ( 1 − α t ) ( 1 − α t − 1 − ) 1 − α t ˉ ) P(x_{t-1}|x_t)=N(\frac1{\sqrt{\alpha_t}}(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha_t}}}\epsilon),\frac{(1-\alpha_t)(1-\alpha_{t-1}^-)}{1-\bar{\alpha_t}}) P(xt1xt)=N(αt 1(xt1αtˉ 1αtϵ),1αtˉ(1αt)(1αt1))

其中的 ϵ 由模型提供 \text{其中的}\epsilon\text{由模型提供} 其中的ϵ由模型提供

5.2 DDIM 公式

DDIM 只修改了采样器,所以只需要重新定义后验概率即可

x p r e v = α p r e v ‾ ( x t − 1 − α t ϵ t α t ) + 1 − α p r e v ‾ − σ 2 ϵ t + σ 2 ϵ ϵ t = x t − α t x 0 1 − α ˉ t x 0 = x t − 1 − α ˉ t ϵ t α ˉ t \begin{aligned}x_{prev}&=\sqrt{\alpha_{\overline{prev}}}(\frac{x_t-\sqrt{1-\alpha_t}\epsilon_t}{\sqrt{\alpha_t}})+\sqrt{1-\alpha_{\overline{prev}}-\sigma^2}\epsilon_t+\sigma^2\epsilon\\\\\epsilon_t&=\frac{x_t-\sqrt{\alpha_t}x_0}{\sqrt{1-\bar{\alpha}_t}}\\\\x_0&=\frac{x_t-\sqrt{1-\bar{\alpha}_t}\epsilon_t}{\sqrt{\bar{\alpha}_t}}\end{aligned} xprevϵtx0=αprev (αt xt1αt ϵt)+1αprevσ2 ϵt+σ2ϵ=1αˉt xtαt x0=αˉt xt1αˉt ϵt

其中的 ϵ t 由模型提供, σ 的值可以为0, x p r e v , x t 中间可以差多个间隔 \text{其中的}\epsilon_t\text{由模型提供,}\sigma\text{的值可以为0,}x_{prev},x_t\text{中间可以差多个间隔} 其中的ϵt由模型提供,σ的值可以为0,xprev,xt中间可以差多个间隔

### 扩散模型概述 扩散模型是一种强大的生成模型,在机器学习领域中用于处理复杂的分布建模任务。这类模型通过逐步向数据添加噪声来训练,随后再学习如何逆转这个过程以去除噪声并恢复原始数据[^1]。 #### 工作原理 具体来说,扩散模型定义了一个前向扩散过程,其中初始干净的数据样本逐渐被高斯噪声破坏;接着是一个反向去噪过程,即从纯随机噪声开始尝试重建出清晰的图像或其他形式的数据。这一机制允许模型捕捉到输入特征之间的复杂依赖关系,并能够生成高质量的新实例。 #### 应用场景 扩散模型因其灵活性和有效性而广泛应用于多个方面: - **图像合成**:可以用来创建逼真的照片级图片或艺术风格的作品; - **超分辨率成像**:提升低分辨率图像的质量至更高水平; - **音频信号处理**:如语音增强、音乐创作等领域也有着出色表现; - **自然语言处理**:虽然最初主要针对视觉任务设计,但现在也被探索用于文本生成等NLP应用中。 ```python import torch.nn as nn class SimpleDiffusionModel(nn.Module): def __init__(self, input_size, hidden_dim, output_size): super(SimpleDiffusionModel, self).__init__() self.encoder = nn.Sequential( nn.Linear(input_size, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, output_size) ) def forward(self, x): return self.encoder(x) model = SimpleDiffusionModel(784, 256, 784) # 假设MNIST数据集为例 ``` 此代码片段展示了一个简单的基于PyTorch实现的编码器结构作为扩散模型的一部分,实际完整的扩散模型会更加复杂且涉及更多组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值