文章目录

  • 摘要
  • 一、简介
  • 二、扩散过程
    • 2.1 定义扩散过程
    • 2.2 重参数技巧得到迭代公式
    • 2.3 得到全局扩散公式
    • 2.4 扩散过程实现代码
      • 2.4.1 总结扩散公式
      • 2.4.2 代码
  • 三、逆扩散过程
    • 3.1 目标公式
    • 3.2 后验条件概率
  • 四、优化目标
    • 4.1 损失函数公式推导
    • 4.2 损失函数代码实现
  • 五、算法流程
    • 5.1 模型训练代码
    • 5.2 模型采样代码
    • 5.3 训练好的模型效果

摘要

The diffusion model is a generative model of the Encoder-Decoder architecture, which is divided into a diffusion stage and an inverse diffusion stage. In the diffusion stage, by continuously adding noise to the original data, the data is changed from the original distribution to the distribution we expect, for example, the original data distribution is changed to a normal distribution by continuously adding Gaussian noise. During the inverse diffusion stage, a neural network is used to restore the data from a normal distribution to the original data distribution. Its advantage is that each point on the normal distribution is a mapping of the real data, and the model has better interpretability. The disadvantage is that iterative sampling is slow, resulting in low model training and prediction efficiency.

扩散模型是Encoder-Decoder架构的生成模型,分为扩散阶段和逆扩散阶段。 在扩散阶段,通过不断对原始数据添加噪声,使数据从原始分布变为我们期望的分布,例如通过不断添加高斯噪声将原始数据分布变为正态分布。 在逆扩散阶段,使用神经网络将数据从正态分布恢复到原始数据分布。 它的优点是正态分布上的每个点都是真实数据的映射,模型具有更好的可解释性。 缺点是迭代采样速度慢,导致模型训练和预测效率低。


参考资料

一、简介

Diffusion model模型分为扩散过程和逆扩散过程,扩散过程通过对原始数据不断加入高斯噪音,使原始数据变为高斯分布的数据,即从X0X_0X0​ −>->−> XTX_TXT​。逆扩散过程通过高斯噪声还原出图片,即从XTX_TXT​ −>->−> X0X_0X0​。

二、扩散过程

2.1 定义扩散过程

在设定扩散过程是一个马尔可夫链的条件下,向原始信息中不断添加高斯噪声,每一步添加高斯噪声的过程是从Xt−1−>XtX_{t-1} -> X_tXt−1​−>Xt​,于是定义公式:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)q(x_t|x_{t-1}) = N(x_t;\sqrt{1-\beta_t}x_{t-1} ,\beta_tI)q(xt​∣xt−1​)=N(xt​;1−βt​​xt−1​,βt​I)

该公式表示从xt−1−>xtx_{t-1}->x_txt−1​−>xt​是一个以1−βtxt−1\sqrt{1-\beta_t}x_{t-1}1−βt​​xt−1​为均值βt\beta_tβt​为方差的高斯分布变换。

2.2 重参数技巧得到迭代公式

利用重参数技巧得到每一次添加高斯噪声的公式如下:
Xt=1−βtXt−1+βtZtX_t = \sqrt{1-\beta_t}X_{t-1} + \sqrt{\beta}_tZ_tXt​=1−βt​​Xt−1​+β​t​Zt​

  • XtX_tXt​表示 t 时刻的数据分布
  • ZtZ_tZt​表示 t 时刻添加的高斯噪音,一般固定是均值为0方差为1的高斯分布
  • 1−βtXt−1\sqrt{1-\beta_t}X_{t-1}1−βt​​Xt−1​ 表示当前时刻分布的均值
  • βt\sqrt{\beta}_tβ​t​表示当前时刻分布的标准差(标准差=方差\sqrt{方差}方差​)

注意:其中βt\beta_tβt​是预先设定0~1之间的常量,故扩散过程不含参。

2.3 得到全局扩散公式

2.2的迭代公式中可知,扩散过程中只有一个参数β\betaβ,而β\betaβ是预先设置的常量,故扩散过程中无未知的需要学习的参数,所以只需要知道初始数据分布X0X_0X0​和βt\beta_tβt​就可以得到任意时刻的分布XtX_tXt​,具体公式如下:

  • X0X_0X0​为原始数据的分布
  • αt=1−βt\alpha_t = 1 - \beta_tαt​=1−βt​
  • αtˉ=∏i=1tαi\bar{\alpha_t} = \prod_{i=1}^{t}\alpha_iαt​ˉ​=∏i=1t​αi​
  • Z为均值为0方差为1的高斯分布

2.4 扩散过程实现代码

2.4.1 总结扩散公式

2.3可知扩散过程公式为:
Xt=αtˉX0+1−αˉZX_t = \sqrt{\bar{\alpha_t}}X_0 + \sqrt{1 - \bar{\alpha}}ZXt​=αt​ˉ​​X0​+1−αˉ​Z其中:

  • X0X_0X0​为原始数据的分布
  • αt=1−βt\alpha_t = 1 - \beta_tαt​=1−βt​
  • αtˉ=∏i=1tαi\bar{\alpha_t} = \prod_{i=1}^{t}\alpha_iαt​ˉ​=∏i=1t​αi​
  • Z为均值为0方差为1的高斯分布

2.4.2 代码

  1. 用make_s_curve生成数据为例得到X0X_0X0​

    # 得到数据X0
    s_curve, _ = make_s_curve(10**4, noise=0.1)
    x_0 = s_curve[:, [0, 2]]/10.0
    # 查看形状
    print(np.shape(x_0))
    # 绘图
    data = x_0.T
    fig, ax = plt.subplots()
    ax.scatter(*data, color='red', edgecolor='white')
    ax.axis('off')
    dataset = torch.Tensor(data)
    

  2. 假定有100个时刻设置, 所有时刻的β\betaβ

    num_steps = 100
    betas = torch.linspace(-6, 6, num_steps)
    betas = torch.sigmoid(betas)*(0.5e-2 - 1e-5)+1e-5
    

    β\betaβ为0-1之前很小的数,最大值为0.5e-2,最小值为1e-5

  3. 得到α\alphaα(α=1−β\alpha = 1 - \betaα=1−β)

    alphas = 1 - betas
    
  4. 得到各个时刻的αtˉ\bar{\alpha_t}αt​ˉ​(αtˉ=∏i=1tαi\bar{\alpha_t} = \prod_{i=1}^{t}\alpha_iαt​ˉ​=∏i=1t​αi​)

    alphas_prod = torch.cumprod(alphas, 0)
    
  5. 得到αt\sqrt{\alpha_t}αt​​

    alphas_bar_sqrt = torch.sqrt(alphas_bar)
    
  6. 得到1−αtˉ\sqrt{1-\bar{\alpha_t}}1−αt​ˉ​​

    one_minus_alphas_bar_sqrt = torch.sqrt(1-alphas_bar)
    
  7. 输入X0X_0X0​与时刻t,得到XtX_tXt​,即Xt=αtˉX0+1−αtˉZX_t = \sqrt{\bar{\alpha_t}}X_0 + \sqrt{1 - \bar{\alpha_t}}ZXt​=αt​ˉ​​X0​+1−αt​ˉ​​Z

    def x_t(x_0, t):noise = torch.randn_like(x_0)return (alphas_bar_sqrt[t]*x_0 + one_minus_alphas_bar_sqrt[t]*noise)
    
  8. 扩散过程演示

    num_shows = 20
    fig, axs = plt.subplots(2, 10, figsize=(28, 3))
    plt.rc('text', color='blue')for i in range(num_shows):j = i//10k = i%10num_x_t = x_t(dataset, torch.tensor([i*num_steps//num_shows]))axs[j, k].scatter(*num_x_t, color='red', edgecolor='white')axs[j, k].set_axis_off()axs[j, k].set_title('$q(\mathbf{x}_{'+str(i*num_steps//num_shows)+'})$')
    

三、逆扩散过程

3.1 目标公式

扩散过程是将原始数据不断加噪得到高斯噪声,逆扩散过程是从高斯噪声中恢复原始数据,我们假定逆扩散过程仍然是一个马尔可夫链的过程,要做的是XT−>X0X_T->X_0XT​−>X0​,用公式表达如下:
pθ(xt−1∣xt)=N(xt−1;uθ(xt,t),Σθ(xt,t))p_\theta(x_{t-1}|x_t) = N(x_{t-1}; u_\theta(x_t, t),\Sigma_\theta(x_t, t) )pθ​(xt−1​∣xt​)=N(xt−1​;uθ​(xt​,t),Σθ​(xt​,t))

3.2 后验条件概率

推导得到后验条件概率q(xt−1∣xt,x0)q(x_{t-1}|x_t, x_0)q(xt−1​∣xt​,x0​)

其方差βtˉ\bar{\beta_t}βt​ˉ​为:
βtˉ=1−αt−1ˉ1−αtˉβt\bar{\beta_t} = \frac{1-\bar{\alpha_{t-1}}}{1-\bar{\alpha_t}}\beta_tβt​ˉ​=1−αt​ˉ​1−αt−1​ˉ​​βt​
均值uˉ(xt−1,x0)\bar{u}(x_{t-1}, x_0)uˉ(xt−1​,x0​)为:
uˉ(xt−1,x0)=αt(1−αˉt−1)1−αtˉxt+αˉt−1βt1−αtˉx0\bar{u}(x_{t-1}, x_0)=\frac{\sqrt{\alpha_t}(1-\bar{\alpha}_{t-1})}{1-\bar{\alpha_t}}x_t+\frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1-\bar{\alpha_t}}x_0uˉ(xt−1​,x0​)=1−αt​ˉ​αt​​(1−αˉt−1​)​xt​+1−αt​ˉ​αˉt−1​​βt​​x0​
逆扩散过程模型不应当事先知道x0x_0x0​,故需将x0x_0x0​用xtx_txt​代替,根据2.4得到:

代入均值公式中,化简后得到后验条件均值:
uˉt=1αt(xt−βt1−αtˉzt)\bar{u}_t=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\bar{\alpha_t}}}z_t)uˉt​=αt​​1​(xt​−1−αt​ˉ​​βt​​zt​)

四、优化目标

4.1 损失函数公式推导

得到损失函数如下:


4.2 损失函数代码实现

def diffusion_loss_fn(model, x_0, alphas_bar_sqrt, one_minus_alphas_bar_sqrt, n_steps):batch_size = x_0.shape[0]# 生成时间随机值,大小是(batch_size//2)t = torch.randint(0, n_steps, size=(batch_size//2,))t = torch.cat([t, num_steps-1-t], dim=0)t = t.unsqueeze(-1) # t.shape为(batch_size, 1)a = alphas_bar_sqrt[t].to(device)aml = one_minus_alphas_bar_sqrt[t].to(device)e = torch.randn_like(x_0).to(device)x = x_0 * a + e * amloutput = model(x, t.squeeze(-1).to(device))return (e - output).square().mean()

五、算法流程

5.1 模型训练代码

print('训练模型...')batch_size = 128
dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True)
num_epoch = 4000
plt.rc('text', color='blue')model = MLPDiffusion(num_steps)
model = model.to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)for t in range(num_epoch):for idx, batch_x in enumerate(dataloader):batch_x = batch_x.to(device)loss = diffusion_loss_fn(model,batch_x,alphas_bar_sqrt,one_minus_alphas_bar_sqrt,num_steps)optimizer.zero_grad()loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(), 1.)optimizer.step()if(t%100==0):print(loss)
torch.save(model, "model.h5")

5.2 模型采样代码

def p_sample_loop(model, shape, n_steps, betas, one_minus_alphas_bar_sqrt):cur_x = torch.randn(shape).to(device)x_seq = [cur_x]for i in reversed(range(n_steps)):cur_x = p_sample(model, cur_x, i, betas.to(device), one_minus_alphas_bar_sqrt.to(device))x_seq.append(cur_x)return x_seqdef p_sample(model, x, t, betas, one_minus_alphas_bar_sqrt):t = torch.tensor([t]).to(device)coeff = betas[t]/one_minus_alphas_bar_sqrt[t]eps_theta = model(x, t)# 计算均值mean = (1 / (1-betas[t]).sqrt())*(x - (coeff*eps_theta))z = torch.randn_like(x).to(device)# 计算标准差sigma_t = betas[t].sqrt().to(device)sample = mean + sigma_t * zreturn (sample)model = torch.load("model.h5")
x_seq = p_sample_loop(model, dataset.shape, num_steps, betas, one_minus_alphas_bar_sqrt)
fig, axs = plt.subplots(1, 10, figsize=(28, 3))
for i in range(1, 11):cur_x = x_seq[i*10].detach()axs[i-1].scatter(cur_x[:, 0].cpu(), cur_x[:, 1].cpu(), color='red', edgecolor='white');axs[i-1].set_axis_off();axs[i-1].set_title('$q(\mathbf{x}_{'+str(i*10)+'})$')

5.3 训练好的模型效果

Diffusion model—扩散模型相关推荐

  1. 【CV】Latent diffusion model 扩散模型体验

    note 文章目录 note 一.diffusion模型 1.1 Stable Diffusion简介 1.2 和GAN对比的优势 二.Latent diffusion model原理 2.1 潜在空 ...

  2. Diffusion Model (扩散生成模型)的基本原理详解(三)Stochastic Differential Equation(SDE)

    本篇是<Diffusion Model (扩散生成模型)的基本原理详解(二)Score-Based Generative Modeling(SGM)>的续写,继续介绍有关diffusion ...

  3. Diffusion Model (扩散生成模型)的基本原理详解(一)Denoising Diffusion Probabilistic Models(DDPM)

    本章开始笔者来陆续的介绍最近爆火的Diffusion Model的近期发展. 本篇的学习内容与图片均来自于对文章Diffusion Models: A Comprehensive Survey of ...

  4. 2022年11月100篇 diffusion models 扩散模型 汇总!

    在生成图像方面,自从NIPS 2014的一篇开山之作: Generative Adversarial Nets 论文:https://proceedings.neurips.cc/paper/2014 ...

  5. 【diffusion】扩散模型详解!理论+代码

    0.项目视频详解 视频教程见B站https://www.bilibili.com/video/BV1e8411a7mz 1.diffusion模型理论(推导出损失函数) 1.1.背景 随着人工智能在图 ...

  6. Diffusion Models扩散模型简单讲解与简单实现

    Diffusion Models 图中: x 0 x_0 x0​为图像, z z z为采样自正态分布的噪音 扩散模型**是受非平衡热力学的启发.它们定义一个扩散步骤的马尔可夫链,逐渐向数据添加随机噪声 ...

  7. 井喷式爆发!2022年11月100篇 diffusion models 扩散模型 汇总!

    点击上方"摸鱼吧算法工程师"卡片,关注星标 获取有趣.好玩的前沿干货! 001  (2022-11-30) Maximum Likelihood Estimation for a ...

  8. Diffusion Models - 扩散模型(一)

    常见的生成模型(Generative Models)如 GAN.VAE 和基于流( Flow-based )的模型.他们在生成高质量样本方面取得了巨大成功,但每个都有其自身的局限性. GAN 因其对抗 ...

  9. 什么是扩散模型(Diffusion Model)?

    扩散模型是什么?如何工作以及他如何解决实际的问题 在计算机视觉中,生成模型是一类能够生成合成图像的模型(文本生成图像[DALL2.Stable Diffusion].图像生成图像[Diffusion- ...

  10. Diffusion Model(扩散模型)

    一.功能(解决问题) 1.根据文字生成图片 2.根据给定的图片生成相似风格画作 3.图片延展 二.发展过程 1.2015年斯坦福大学四位研究者提出 2.2020年底加州伯克利学者改进 3.2021年O ...

最新文章

  1. AIoT 2020 年分析
  2. 7天学会spring cloud教程
  3. Windows10家庭版的功能中没有Hyper-V的解决方法
  4. MSSql-SP_who分析数据库性能
  5. SQL Challenge ——快速找到1-100之间缺失的数
  6. 一键装机linux_(推荐)linux用一键安装包
  7. 数据挖掘之随机事件与随机变量
  8. Poj1995--Raising Modulo Numbers(快速幂)
  9. 中国1-(4-羟基苯基)乙酮市场趋势报告、技术动态创新及市场预测
  10. [luogu3369]普通平衡树(替罪羊树模板)
  11. Atitit 获取本机图像设备视频设备列表 设备检索列表解决方案
  12. 计算机机房里面难闻的气味,新装中央空调气味刺鼻为什么?怎么办?-中央空调 异味 刚开...
  13. 专业音频术语中英文对照
  14. 北邮iptv用WindowsMediaplayer打不开的解决办法
  15. 区块链技术的应用有哪些?
  16. obs多推流地址_OBS下载、安装、使用(腾讯)推流直播教程
  17. golang 生态中不错的组件
  18. 前端分享到推特,脸书
  19. 单云台语音跟踪摄像机MHD-G200TH
  20. python warning ignore

热门文章

  1. 软件测试人员必备的60个测试工具清单,果断收藏了!
  2. Java对接萤石云平台海康摄像头视频监控
  3. 世上最全计算机网络面试整理(附答案),不服来战!!
  4. HttpUtil 工具类
  5. 水泵smart200编程_第453期丨PLC梯形图编程很low?星三角启动,转换角型时电机反转是真的吗?...
  6. 威纶触摸屏数值元件格式设置_在威纶触摸屏当中,数值输入元件那里的设备类型的字母都表示什么意思啊...
  7. 威纶触摸屏与S7-200SMART PLC通信的参数设置和连接电缆
  8. Pandas速查手册中文版(转)
  9. 计算机考研C语言题库
  10. 第十二次博文:免费教你从官网中下载全部AD库,保姆级别!