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

这篇具有很好参考价值的文章主要介绍了Diffusion Models扩散模型简单讲解与简单实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Diffusion Models

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

图中: x 0 x_0 x0为图像, z z z为采样自正态分布的噪音

扩散模型**是受非平衡热力学的启发。它们定义一个扩散步骤的马尔可夫链,逐渐向数据添加随机噪声,然后学习逆扩散过程,从噪声中构建所需的数据样本。与VAE或流动模型不同,扩散模型是用固定的程序学习的,而且隐变量具有高维度。

训练阶段,是在图片中添加噪声,给网络输入这一张添加噪声的图片,网络需要预测的则是添加的噪声。

使用阶段,由随机生成的噪声,使用网络预测添加了什么噪声,然后逐步去除噪声,直到还原。

1、扩散过程

  • 扩散的过程,是不断地逐步向图片中添加噪声,直到图像完全变为纯噪声;
  • 添加的噪声为高斯噪声,而后一时刻都是由前一时刻的图像增加噪声得到的。

添加噪声的过程:

这里定义了两个参数 α t \alpha_t αt β t \beta_t βt;( t t t的范围为0~ T T T之间的整数, β t \beta_t βt β 1 \beta_1 β1变化到 β T \beta_T βT,是逐渐变大的,论文中是从0.0001等量的增加 T T T次,直到0.002 )

α t \alpha_t αt β t \beta_t βt的关系为:

α t = 1 − β t \alpha_t = 1- \beta_t αt=1βt (1)

T T T表示的是,由图片通过逐步添加噪声直至完全变为纯噪声的过程所需要经历的次数,也就是图片需要总计需要添加噪声的步数。而 t t t则代表的是 T T T中具体的某一步。

则给图像添加噪声的过程的表达式可以写为:

x t = α t x t − 1 + 1 − α t z t x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}z_t xt=αt xt1+1αt zt (2)

x t x_t xt表示的是第 t t t扩散步时,添加噪声后的图片,而 x t − 1 x_{t-1} xt1是第 t − 1 t-1 t1时刻所获得的图片; z t z_t zt表示的是 t t t时刻所添加的噪声,该噪声采样自标准正态分布 N ( 0 , 1 ) N(0,1) N(0,1)

那么可以依照公式(2)依次从原始图像 x 0 x_0 x0逐步添加噪声,扩散至 x T x_T xT

x 1 = α 1 x 0 + 1 − α 1 z 1 x_1=\sqrt{\alpha_1}x_{0}+\sqrt{1-\alpha_1}z_1 x1=α1 x0+1α1 z1

x 2 = α 2 x 1 + 1 − α 2 z 2 x_2=\sqrt{\alpha_2}x_{1}+\sqrt{1-\alpha_2}z_2 x2=α2 x1+1α2 z2

……

x t = α t x t − 1 + 1 − α t z t x_t=\sqrt{\alpha_t}x_{t-1}+\sqrt{1-\alpha_t}z_t xt=αt xt1+1αt zt

……

x T = α T x T − 1 + 1 − α T z T x_T=\sqrt{\alpha_T}x_{T-1}+\sqrt{1-\alpha_T}z_T xT=αT xT1+1αT zT

由此可以看出 β t \beta_t βt逐渐增加,相应的 α t \alpha_t αt逐渐减小, 1 − α t 1-\alpha_t 1αt则是逐渐增大的,也就是说,添加的噪声是逐步增加的,而原始图像的比例是逐渐减小的,并且噪声添加的程度是逐次扩大的。

但对网络的训练,数据是需要随机采样的,每次采样到 t t t时刻的时候,都从 x 0 x_0 x0开始递推则太过于繁琐。

所以需要一次就计算出来:

将式 : x t − 1 = α t − 1 x t − 2 + 1 − α t − 1 z t − 1 x_{t-1}=\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}z_{t-1} xt1=αt1 xt2+1αt1 zt1带入(2)式中,可得

x t = α t ( α t − 1 x t − 2 + 1 − α t − 1 z t − 1 ) + 1 − α t z t x_t=\sqrt{\alpha_t}(\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{1-\alpha_{t-1}}z_{t-1})+\sqrt{1-\alpha_t}z_t xt=αt (αt1 xt2+1αt1 zt1)+1αt zt

式子展开为:

x t = α t α t − 1 x t − 2 + α t 1 − α t − 1 z t − 1 + 1 − α t z t x_t=\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+\sqrt{\alpha_t}\sqrt{1-\alpha_{t-1}}z_{t-1}+\sqrt{1-\alpha_t}z_t xt=αt αt1 xt2+αt 1αt1 zt1+1αt zt

= α t α t − 1 x t − 2 + ( α t ( 1 − α t − 1 ) z t − 1 + 1 − α t z t ) =\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+(\sqrt{\alpha_t (1- \alpha_{t-1})}z_{t-1}+\sqrt{1-\alpha_t}z_t) =αt αt1 xt2+(αt(1αt1) zt1+1αt zt)

其中每次加入的噪声—— z 1 , z 2 , . . . , z t − 1 , z t , . . . z T z_1,z_2,...,z_{t-1},z_t,...z_T z1,z2,...,zt1,zt,...zT——都是服从正态分布 N ( 0 , 1 ) N(0,1) N(0,1)

所以可以将

z t − 1 z_{t-1} zt1 z t z_t zt之间的系数合并在一起,因为正太分布乘以一个系数,只改变方差,而 N ( 0 , σ 1 2 ) + N ( 0 , σ 2 2 ) ∼ N ( 0 , σ 1 2 + σ 2 2 ) N(0,\sigma_1^2)+N(0,\sigma_2^2) \sim N(0,\sigma_1^2+\sigma_2^2 ) N(0,σ12)+N(0,σ22)N(0,σ12+σ22)

所以

x t = α t α t − 1 x t − 2 + ( α t ( 1 − α t − 1 ) z t − 1 + 1 − α t z t ) x_t=\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+(\sqrt{\alpha_t (1- \alpha_{t-1})}z_{t-1}+\sqrt{1-\alpha_t}z_t) xt=αt αt1 xt2+(αt(1αt1) zt1+1αt zt)

= α t α t − 1 x t − 2 + ( a t ( 1 − a t − 1 ) + 1 − a t ) z =\sqrt{\alpha_t}\sqrt{\alpha_{t-1}}x_{t-2}+(\sqrt{a_t(1-a_{t-1})+1-a_t})z =αt αt1 xt2+(at(1at1)+1at )z

= α t α t − 1 x t − 2 + ( 1 − a t a t − 1 ) z =\sqrt{\alpha_t\alpha_{t-1}}x_{t-2}+(\sqrt{1-a_t a_{t-1}})z =αtαt1 xt2+(1atat1 )z

再将 x t − 2 = α t − 2 x t − 3 + 1 − α t − 2 z t − 2 x_{t-2}=\sqrt{\alpha_{t-2}}x_{t-3}+\sqrt{1-\alpha_{t-2}}z_{t-2} xt2=αt2 xt3+1αt2 zt2带入上式,循环往复,将 x 1 x_1 x1带入,可得

x t = α t α t − 1 . . . α 2 α 1 x t − 1 + ( 1 − α t α t − 1 . . . α 2 α 1 ) z x_t=\sqrt{\alpha_t\alpha_{t-1}...\alpha_2 \alpha_1}x_{t-1}+(\sqrt{1-\alpha_t\alpha_{t-1}...\alpha_2 \alpha_1})z xt=αtαt1...α2α1 xt1+(1αtαt1...α2α1 )z

= α t ‾ x 0 + ( 1 − a t ‾ ) z =\sqrt{\overline{\alpha_t}}x_{0}+(\sqrt{1-\overline{a_t}})z =αt x0+(1at )z (3)

其中 α t ‾ \overline{\alpha_t} αt表示从 α 1 \alpha_1 α1 α t \alpha_t αt的连乘

2、训练过程

因此,扩散模型的训练过程如下:

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

  1. 从数据集中随机抽选一张图片,
  2. 随机从1~T中抽取一个扩散步,
  3. 按照式(3)计算得到 x t x_t xt
  4. 输入网络,得到输出,输出同添加的噪声做损失,更新梯度,
  5. 反复训练,直至满意。

详细训练过程的代码过程如下:

for i, (x_0) in enumerate(tqdm_data_loader):  # 由数据加载器加载数据,
	x_0 = x_0.to(device)  # 将数据加载至相应的运行设备(device)
    t = torch.randint(1, T, size=(x_0.shape[0],), device=device)  # 对每一张图片随机在1~T的扩散步中进行采样
    sqrt_alpha_t_bar = torch.gather(sqrt_alphas_bar, dim=0, index=t).reshape(-1, 1, 1, 1)  # 取得不同t下的 根号下alpha_t的连乘
    """取得不同t下的 根号下的一减alpha_t的连乘"""
    sqrt_one_minus_alpha_t_bar = torch.gather(sqrt_one_minus_alphas_bar, dim=0, index=t).reshape(-1, 1, 1, 1)
    noise = torch.randn_like(x_0).to(device)  # 从标准正态分布中采样得到z
    x_t = sqrt_alpha_t_bar * x_0 + sqrt_one_minus_alpha_t_bar * noise  # 计算x_t
    out = net_model(x_t, t)  # 将x_t输入模型,得到输出
    loss = loss_function(out, noise) # 将模型的输出,同添加的噪声做损失
    optimizer.zero_grad()  # 优化器的梯度清零
    loss.backward()  # 由损失反向求导
    optimizer.step()  # 优化器更新参数

3、正向使用过程

使用过程是从 x T x_T xT一步一步取出噪声,推测出 x 0 x_0 x0

也就是说,需要在已知 x T x_T xT的情况下,先反推 x t − 1 x_{t-1} xt1,然后推 x t − 2 x_{t-2} xt2……最终推测得到 x 0 x_0 x0

根据贝叶斯公式推导为:
x t − 1 = 1 α t ( x t − 1 − α t 1 − α t ‾ M ( x t , t ) ) + β t z x_{t-1}=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{1-\alpha_t}{\sqrt{1-\overline{\alpha_t}}}M(x_t, t))+\sqrt{\beta_t}z xt1=αt 1(xt1αt 1αtM(xt,t))+βt z
则整个算法为:

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

  1. x T x_T xT随机采样自标准正态分布;
  2. 从T到1开始循环,
  3. 按照上述公式计算 x t − 1 x_{t-1} xt1,依次往复,其中 M ( x t , t ) M(x_t, t) M(xt,t)为网络模型,输入的是 x t x_t xt步的结果和第t步,因为模型要对每一步的位置进行编码, z z z取样至标准正态分布,在t为最后一步的时候,z取零

具体代码如下:

for t_step in reversed(range(T)):  # 从T开始向零迭代
    t = t_step
    t = torch.tensor(t).to(device)

    z = torch.randn_like(x_t,device=device) if t_step > 0 else 0  # 如果t大于零,则采样自标准正态分布,否则为零
    """按照公式计算x_{t-1}"""
    x_t_minus_one = torch.sqrt(1/alphas[t])*(x_t-(1-alphas[t])*model(x_t, t.reshape(1,))/torch.sqrt(1-alphas_bar[t]))+torch.sqrt(betas[t])*z
    
    x_t = x_t_minus_one

4、结果

因为设备有限,训练网红人脸数据,测试时网络生成的结果如下:这是在一张3080ti上训练得到的结果

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

5、网络模型

模型使用UNet,并具有第t扩散步的位置编码信息。

6、其他

github:https://github.com/HibikiJie/Diffusion-Models

权重
链接:https://pan.baidu.com/s/19PuZr6duixJaSU1kvmn8Vg
码:yhR9文章来源地址https://www.toymoban.com/news/detail-401105.html

到了这里,关于Diffusion Models扩散模型简单讲解与简单实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 扩散模型相关论文阅读,扩散模型和知识蒸馏的结合提升预测速度:Progressive Distillation for Fast Sampling of Diffusion Models

    谷歌research的成果,ICLR 2022 https://arxiv.org/abs/2202.00512 tenserflow官方开源代码: https://github.com/google-research/google-research/tree/master/diffusion_distillation pytorch非官方代码:https://github.com/lucidrains/imagen-pytorch 1.扩散模型虽然取得了很好的效果,但是预测速度慢。 2.作者提出了一种逐步蒸馏

    2024年02月16日
    浏览(37)
  • High-Resolution Image Synthesis with Latent Diffusion Models 稳定扩散模型论文笔记

    一、研究现状        早期图像生成方法主要是变分自动编码器(Variational Autoencoders, VAEs),该算法利用编码器和解码器以及变分推断的方法学习隐空间到真实图像空间的映射从而完成图像的生成。其优势是特征空间可迁移并且训练较为稳定,但是不容易进行模型评估,当输入

    2024年02月20日
    浏览(42)
  • 【深度学习模型】扩散模型(Diffusion Model)基本原理及代码讲解

    生成式建模的扩散思想实际上已经在2015年(Sohl-Dickstein等人)提出,然而,直到2019年斯坦福大学(Song等人)、2020年Google Brain(Ho等人)才改进了这个方法,从此引发了生成式模型的新潮流。目前,包括OpenAI的GLIDE和DALL-E 2,海德堡大学的Latent Diffusion和Google Brain的ImageGen,都基

    2023年04月22日
    浏览(48)
  • 2022图像翻译/扩散模型:UNIT-DDPM: UNpaired Image Translation with Denoising Diffusion Probabilistic Models

    我们提出了一种新的无配对图像间翻译方法,该方法使用去噪扩散概率模型而不需要对抗训练。我们的方法,UNpaired Image Translation with Denoising Diffusion Probabilistic Models(UNIT-DDPM),训练一个生成模型,通过最小化另一个域条件下的去噪分数匹配目标,推断图像在两个域上的联合分

    2023年04月18日
    浏览(44)
  • Stable Diffusion生成式扩散模型代码实现原理

    Stable Diffusion可以使用PyTorch或TensorFlow等深度学习框架来实现。这些框架提供了一系列的工具和函数,使得开发者可以更方便地构建、训练和部署深度学习模型。因此可以使用PyTorch或TensorFlow来实现Stable Diffusion模型。 安装PyTorch:确保您已经安装了PyTorch,并具备基本的PyTorch使用

    2024年03月13日
    浏览(46)
  • Consistency Models终结扩散模型

    最近看到一篇论文,觉得特别有意思,并且在学术界引起了不小的动静,他就是一致性模型,据说图像生成效果快、质量高,并且还可以实现零样本图像编辑,即不进行一些视觉任务训练,可以实现图像超分、修复、上色等功能。 目前代码已经开源到GitHub上面:https://github

    2023年04月26日
    浏览(39)
  • 扩散模型diffusion model用于图像恢复任务详细原理 (去雨,去雾等皆可),附实现代码

    话不多说,先上代码: 扩散模型diffusion model用于图像恢复完整可运行代码,附详细实验操作流程 令外一篇简化超分扩散模型SR3来实现图像恢复的博客见: 超分扩散模型 SR3 可以做图像去雨、去雾等恢复任务吗? 1. 去噪扩散概率模型 扩散模型是一类生成模型, 和生成对抗网络

    2024年02月03日
    浏览(53)
  • 番外篇Diffusion&Stable Diffusion扩散模型与稳定扩散模型

    本篇文章为阅读笔记,,主要内容围绕扩散模型和稳定扩散模型展开,介绍了kl loss、vae模型的损失函数以及变分下限作为扩展部分。扩散模型是一种生成模型,定义了一个逐渐扩散的马尔科夫链,逐渐项数据添加噪声,然后学习逆扩散过程,从噪声中构建所需的数据样本。稳

    2024年02月03日
    浏览(51)
  • [学习笔记] 扩散模型 Diffusion

    机器学习是人工智能的一种,它是一种通过利用数据,训练出模型,然后使用模型预测的一种方法。 机器学习分为监督学习、无监督学习和强化学习,这是根据数据训练方式分类的,通俗来说,监督学习是基于已知结果的数据集进行训练,而无监督学习的数据集没有明确的已

    2024年02月12日
    浏览(40)
  • 扩散模型 - Stable Diffusion

    ​ Stable Diffusion 是由 Stability AI 开发的 开源 扩散模型。Stable Diffusion 可以完成多模态任务,包括:文字生成图像(text2img)、图像生成图像(img2img)等。 4.1 Stable Diffusion 的组成部分 ​ Stable Diffusion 由两部分 组成 : 文本编码器:提取文本 prompt 的信息 图像生成器:根据文本

    2024年02月11日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包