当前位置: 首页 > article >正文

扩散模型DDPM

1.什么是DDPM

DDPM是Denoising(去噪) Diffusion Probabilistic Mode的缩写

我们首先定义一个前向传播过程,给定一张原始的图x0 我们通过加噪T次 每一次往图片中加入一些噪点 经过T此之后 可以得到一张噪声 我们设想 是否有一个反向传播的过程 能够从噪声恢复到原图  如下

Denoising指的就是反向传播一个逐步去噪的过程

Diffusion指的是每张图片逐步进行去噪过程 不是一步到位直接去噪成原图的

Probabilistic Models指的是其中涉及一些数学的概率相关的原理推导

2.加噪

前向:

加噪就是在xt-1的图片中加入一个0-1的高斯分布噪声可以得到以一个xt时间步的图片

每一个过程都是 加一个01分布的高斯噪声

反向:

实际上就是训练出一个神经网路 可以预测出一个噪声 然后xt减去这个噪声 得到xt-1

这个过程就是一个去噪过程

高斯噪声

高斯噪声(GaussianNoise)是一种概率密度函数服从高斯分布(正态分布)的噪声。这种噪声在时域和频域上都具有连续谱的特点,即其功率谱密度在所有频率上都是均匀分布的,因此也被称为白噪声。

高斯噪声的幅度分布符合高斯分布,这意味着噪声的幅度值在某个均值附近波动,并且极端值出现的概率较小。这种噪声在自然界中广泛存在,如大气噪声、电子设备的热噪声等。

在数字图像处理中,高斯噪声是一种常见的噪声类型。它可能由于传感器故障、传输错误或环境因素等原因而产生。高斯噪声会使图像变得模糊,降低图像质量,影响图像的后续处理和分析。

3.前向传播过程

这里定义了个系数 来表达噪声图片的生成

生成的噪声图片也满足高斯分布

这个表示z是从一个μ()均值和\sigma²(方差)中采样出来的一个分布

这个表示在这个分布减去μ再除以\sigma² 就可以得到一个0-1正态分布

将上面式子的右边表示为\varepsilon 用来描述z分布的特征

对应到上面图片中的式子 根号下at就是μ 根号下1-at就是\varepsilon

我们可以用这样的一个概率分布式子来表示xt-1到xt这样一个过程

这个过程服从高斯分布

前向传播的式子进行整理迭代 

最终可以得到这样一个结果

通过这个式子我们可以得出从x0可以一步直接加噪到我们任何一个想到达的t时间步xt

加噪不用一步一步加

3.反向传播过程

那么问题的核心就是如何得到的逆过程 ,这个过程无法直接求出来,所以我们使用神经网络去拟合这一分布。我们使用一个具有参数的神经网络去计算 。假设反向的条件概率分布也是高斯分布,且高斯分布实际上只有两个参数:均值和方差,那么神经网络需要计算的实际上是

根据概率论的相关计算:

方差是固定的,网络只学习均值。而之后的改进模型中,方差也可由网络学习得到。

5.整体的训练过程

1.训练

采样一幅真实图像x0

选取想要的t 一步加噪生成xt

训练网络的均值与真实网络的均值进行对比 计算损失

更新参数 反复迭代

2.生成

从标准高斯分布N(0,1)中采样以恶搞噪声向量z,这个噪声向量将用于生成在时间步t处的噪声图像

对t等于T到1排序:使用训练的网络的参数进行去噪

最终的x0就是生成的图片

总之,我们定义这么一个过程:给一张图片逐步加噪声直到变成纯粹的噪声,然后对噪声进行去噪得到真实的图片。所谓的扩散模型就是让神经网络学习这个去除噪声的方法。
所谓的加噪声,就是基于稍微干净的图片计算一个(多维)高斯分布(每个像素点都有一个高斯分布,且均值就是这个像素点的值,方差是预先定义的 ),然后从这个多维分布中抽样一个数据出来,这个数据就是加噪之后的结果。显然,如果方差非常非常小,那么每个抽样得到的像素点就和原本的像素点的值非常接近,也就是加了一个非常非常小的噪声。如果方差比较大,那么抽样结果就会和原本的结果差距较大。
去噪声也是同理,我们基于稍微噪声的图片  计算一个条件分布,我们希望从这个分布中抽样得到的是相比于  更加接近真实图片的稍微干净的图片。我们假设这样的条件分布是存在的,并且也是个高斯分布,那么我们只需要知道均值和方差就可以了。问题是这个均值和方差是无法直接计算的,所以用神经网络去学习近似这样一个高斯分布。


http://www.kler.cn/a/588904.html

相关文章:

  • 全国医院数据可视化分析系统
  • 以 ArcGIS Pro 为笔,绘就水墨地图画卷
  • C/C++实现工厂模板设计模式(Factory Pattern)
  • 如何配置 Docker 以实现无需 sudo 使用
  • 《解锁 Lodash:简化复杂逻辑的实战技巧》​
  • 浏览器对一个资源设置了缓存,如何清除缓存,且后续请求不命中缓存
  • 深入浅出TCP与UDP:三次握手、四次挥手及面试通关指南
  • 哈尔滨算力服务器托管推荐-青蛙云
  • 运行Clip多模态模型报错:OSError: Can‘t load tokenizer for ‘bert-base-chinese‘
  • Spring Cloud Eureka - 高可用服务注册与发现解决方案
  • 在使用element-ui时表单的表头在切换页面时第一次进入页面容易是白色字体解决方法
  • springboot+vue如何前后端联调,手搓前后端分离项目
  • 三角函数:从宇宙法则到AI革命的数学密钥
  • 《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(51)混沌钟定排列 - 全排列(回溯与剪枝)
  • 安全测试数据的分析、报告及业务应用
  • Java EE 进阶:Spring Boot 日志
  • 获取pytdx行情服务器ip和port
  • Golang倒腾一款简配的具有请求排队功能的并发受限服务器
  • 如何在Linux中切换用户?
  • 从零到精通文本指令:打造个人AI助理的完整指令库(Prompt 指令实操)