【扩散模型】 DDPM和DDIM讲解

2024-03-21 16:10
文章标签 讲解 模型 扩散 ddpm ddim

本文主要是介绍【扩散模型】 DDPM和DDIM讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

扩散模型DDPM和DDIM

扩散模型之DDPM介绍了经典扩散模型DDPM的原理和实现,那么生成一个样本的次数和训练次数需要一致,导致采样过程很缓慢。这篇文章我们将介绍另外一种扩散模型DDIM(Denoising Diffusion Implicit Models),它两有相同的训练目标,但是它不再限制扩散过程必须是一个马尔卡夫链,这使得DDIM可以采用更小的采样步数来加速生成过程,DDIM的另外是一个特点是从一个随机噪音生成样本的过程是一个确定的过程(中间没有加入随机噪音)。
参考链接:
B站视频: https://www.bilibili.com/video/BV1JY4y1N7dn/
https://zhuanlan.zhihu.com/p/565698027 扩散模型之DDIM

https://zhuanlan.zhihu.com/p/627616358 【生成模型(三)】一文读懂DDIM凭什么可以加速DDPM的采样效率

https://blog.csdn.net/weixin_43850253/article/details/128413786 DDIM原理及代码(Denoising diffusion implicit models

https://blog.csdn.net/weixin_43850253/article/details/128275723 IDDPM原理和代码剖析
https://blog.csdn.net/D_Trump/article/details/126611014 008_SSSS_ Improved Denoising Diffusion Probabilistic Models
https://zhuanlan.zhihu.com/p/626062570 Improved Diffusion代码和理解
https://blog.csdn.net/zzfive/article/details/127169343 IDDPM论文解读

代码:
https://zhuanlan.zhihu.com/p/635144824
Diffusion之DDPM代码简述、MNIST与Fashion-MNIST生成实战及DDIM加速生成应用
https://blog.csdn.net/qq_41234663/article/details/128780745
扩散模型(Diffusion model)代码详细解读

回顾DDPM:

在这里插入图片描述
前向过程为一个马尔科夫链,上面公式和DDPM原文里面的alpha代表的不一样了,可能是为了方便起见了。通过推导可以得到:
在这里插入图片描述
反向过程也定义为马尔科夫链:
在这里插入图片描述
在这里插入图片描述
之后使用后验概率:
在这里插入图片描述
在这里插入图片描述
解得方差为定值,均值为:
在这里插入图片描述
通过变分推断和KL散度以及简化得到:
在这里插入图片描述
可以发现DDPM仅依赖于边缘分布,因此可以做其他修改。

DDIM:

为了构造非马尔科夫链的扩散过程,并且复用DDPM的训练过程,现在上面的公式变为:
在这里插入图片描述
并且我们自己构造一个分布,只要满足公式
即可。即前向过程具体怎样我们不需要管了。因此通过待定系数法可以得到:
在这里插入图片描述
这就是我们新的反向生成分布,也就是我们新的要去拟合的“终极目标”。
DDIM中定义以下公式:
在这里插入图片描述
在这里插入图片描述
上面这个公式是基于T的。
对于t>=1的时候要满足:
在这里插入图片描述
通过数学归纳法(在论文中有证明过程)可以得到以下边缘分布公式,因此可以使用DDPM去进行训练:
在这里插入图片描述
在这里插入图片描述
通过xt和x0之间的关系(因为不是马尔科夫了,可以进行变换)推导得到以下公式:
在这里插入图片描述
并且通过证明得到DDPM中的Lsimple和DDIM中的损失是一致的。
论文中将方差定义为超参数
在这里插入图片描述
当标准差为0时,生成过程就是确定性的。
DDIM是一种模型,不能加速,但是我们可以使用技巧在DDIM上加速采样。
我们的采样过程是在一个更短的子序列上面进行的。

ddim_sample.py

@torch.no_grad()
def ddim_sample(self, shape, return_all_timesteps = False):batch, device, total_timesteps, sampling_timesteps, eta, objective = shape[0], self.betas.device, self.num_timesteps, self.sampling_timesteps, self.ddim_sampling_eta, self.objectivetimes = torch.linspace(-1, total_timesteps - 1, steps = sampling_timesteps + 1)   # [-1, 0, 1, 2, ..., T-1] when sampling_timesteps == total_timestepstimes = list(reversed(times.int().tolist()))time_pairs = list(zip(times[:-1], times[1:])) # [(T-1, T-2), (T-2, T-3), ..., (1, 0), (0, -1)]img = torch.randn(shape, device = device)imgs = [img]x_start = Nonefor time, time_next in tqdm(time_pairs, desc = 'sampling loop time step'):time_cond = torch.full((batch,), time, device = device, dtype = torch.long)self_cond = x_start if self.self_condition else Nonepred_noise, x_start, *_ = self.model_predictions(img, time_cond, self_cond, clip_x_start = True)imgs.append(img)if time_next < 0:img = x_startcontinuealpha = self.alphas_cumprod[time]alpha_next = self.alphas_cumprod[time_next]sigma = eta * ((1 - alpha / alpha_next) * (1 - alpha_next) / (1 - alpha)).sqrt()c = (1 - alpha_next - sigma ** 2).sqrt()noise = torch.randn_like(img)img = x_start * alpha_next.sqrt() + \c * pred_noise + \sigma * noiseret = img if not return_all_timesteps else torch.stack(imgs, dim = 1)ret = self.unnormalize(ret)return ret

这里面的alpha_next应该是数值更小的。

这篇关于【扩散模型】 DDPM和DDIM讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/833147

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详