DDIM学习笔记

news2024/9/21 22:57:38

写在前面:
(1)建议看这篇论文之前,可先看我写的前一篇论文:
DDPM推导笔记-大白话推导

主要学习和参考了以下文章:
(1)一文带你看懂DDPM和DDIM
(2)关于 DDIM 采样算法的推导

0. DDIM的创新点

​ DDPM有一个很大的缺点就是其本身是一个马尔科夫链的过程,推理速度太慢,如果前向加噪过程是1000步,那么去噪过程就需要使用Unet生成噪声,然后去噪,这样进行1000步。这是一个及其缓慢的过程,DDIM原论文中举了一个生动的例子:

For example, it takes around 20 hours to sample 50k images of size 32 x 32 from a DDPM, but less than a minute to do so from a GAN on a Nvidia 2080 Ti GPU.

​ 基于DDPM,DDIM主要有两项改进:

​ (1)对于一个已经训练好的DDPM,只需要对采样公式做简单的修改,模型就能在去噪时「跳步骤」,在一步去噪迭代中直接预测若干次去噪后的结果。比如说,假设模型从时刻T=100开始去噪,新的模型可以在每步去噪迭代中预测10次去噪操作后的结果,也就是逐步预测时刻t=90,80,…,0的结果。这样,DDPM的采样速度就被加速了10倍。

​ (2)DDIM论文推广了DDPM的数学模型,打破了马尔科夫链的过程,从更高的视角定义了DDPM的反向过程(去噪过程)。在这个新数学模型下,我们可以自定义模型的噪声强度,让同一个训练好的DDPM有不同的采样效果。

1. 公式推导

​ DDPM的推导过程可以看《DDPM推导笔记》,这里假设 P ( x t − 1 ∣ x t , x 0 ) P(x_{t-1}|x_t, x_0) P(xt1xt,x0)满足如下正态分布,即:
P ( x t − 1 ∣ x t , x 0 ) ∼ N ( k x 0 + m x t , σ 2 ) 即 : x t − 1 = k x o + m x t + σ ϵ 其中有: ϵ ∼ N ( 0 , 1 ) (1) P(x_{t-1}|x_t, x_0) \sim N(kx_0+mx_t, \sigma^2) \\ 即:x_{t-1} = kx_o+mx_t + \sigma \epsilon \tag{1} \\ 其中有: \epsilon \sim N(0, 1) P(xt1xt,x0)N(kx0+mxt,σ2):xt1=kxo+mxt+σϵ其中有:ϵN(0,1)(1)
又因为前向的加噪过程满足:
x t = a t ˉ x 0 + 1 − a t ˉ ϵ 其中 ϵ ∼ N ( 0 , 1 ) (2) x_t = \sqrt{\bar{a_t}} x_0 + \sqrt{1 - \bar{a_t}} \epsilon \\ 其中\epsilon \sim N(0,1) \tag{2} xt=atˉ x0+1atˉ ϵ其中ϵN(0,1)(2)
合并(1)(2)上面两式,有:
x t − 1 = k x 0 + m [ a ˉ t x 0 + 1 − a ˉ t ϵ ] + σ ϵ (3) x_{t-1} = kx_0 + m[\sqrt{\bar{a}_t}x_0 + \sqrt{1-\bar{a}_t} \epsilon] + \sigma \epsilon \tag{3} xt1=kx0+m[aˉt x0+1aˉt ϵ]+σϵ(3)
再次合并有:
x t − 1 = ( k + m a ˉ t ) x 0 + ϵ ′ 其中: ϵ ’ ∼ M ( 0 , m 2 ( 1 − a ˉ t ) + σ 2 ) (4) x_{t-1} = (k+m\sqrt{\bar{a}_t}) x_0 + \epsilon' \\ 其中: \epsilon’ \sim M(0, m^2(1-\bar{a}_t) + \sigma^2) \tag{4} xt1=(k+maˉt )x0+ϵ其中:ϵM(0,m2(1aˉt)+σ2)(4)
从DDPM中可以可知:
x t − 1 = a ˉ t − 1 x 0 + 1 − a ˉ t − 1 ϵ (5) x_{t-1} = \sqrt{\bar{a}_{t-1}} x_0 + \sqrt{1-\bar{a}_{t-1}} \epsilon \tag{5} xt1=aˉt1 x0+1aˉt1 ϵ(5)
通过式(4)(5)的 x t − 1 x_{t-1} xt1服从的概率分布可知:
k + m a ˉ t = a ˉ t − 1 m 2 ( 1 − a ˉ t ) + σ 2 = 1 − a ˉ t − 1 (6) k + m\sqrt{\bar{a}_t} = \sqrt{\bar{a}_{t-1}} \\ m^2(1-\bar{a}_t) + \sigma^2 = 1-\bar{a}_{t-1} \tag{6} k+maˉt =aˉt1 m2(1aˉt)+σ2=1aˉt1(6)
由式(6)两个式子可解出:

将m,k带入到 P ( x t − 1 ∣ x t , x 0 ) P(x_{t-1}|x_t, x_0) P(xt1xt,x0)中,可得:

在这里插入图片描述

依旧可以使用 x t , x 0 x_t, x_0 xt,x0的关系式把 x 0 x_0 x0去掉:
x t = a t ˉ x 0 + 1 − a t ˉ ϵ 这里为了防止 ϵ 和后面的 ϵ 搞混,这里记为 ϵ t , 则上式变为: x t = a t ˉ x 0 + 1 − a t ˉ ϵ t (8) x_t = \sqrt{\bar{a_t}} x_0 + \sqrt{1 - \bar{a_t}} \epsilon \\ 这里为了防止\epsilon和后面的\epsilon搞混,这里记为\epsilon_{t},则上式变为:\\ x_t = \sqrt{\bar{a_t}} x_0 + \sqrt{1 - \bar{a_t}} \epsilon_t \tag{8} xt=atˉ x0+1atˉ ϵ这里为了防止ϵ和后面的ϵ搞混,这里记为ϵt,则上式变为:xt=atˉ x0+1atˉ ϵt(8)
P ( x t − 1 ∣ x t , x 0 ) P(x_{t-1}|x_t, x_0) P(xt1xt,x0)的概率分布采样可得到:
在这里插入图片描述

其中, ϵ \epsilon ϵ是从标准正太分布中,随机采样得到; ϵ t \epsilon_t ϵt是和DDPM一样,使用神经网络训练而来的; x t x_t xt是输入; a ˉ t − 1 和 a ˉ t \bar{a}_{t-1}和\bar{a}_t aˉt1aˉt是事先定义好的。至此,我们就只需要讨论 σ \sigma σ这个参数了。

2. σ \sigma σ的讨论

​ 怎样选取 σ \sigma σ才能获得最佳的加速效果呢?

​ 作者做了一些实验,作者原文中使用 σ τ i ( η ) \sigma_{\tau_i}{(\eta)} στi(η)来表示的 σ \sigma σ,其式子如下:
在这里插入图片描述

使用 η \eta η控制其大小。事实上,当 η = 1 \eta = 1 η=1时就变成了DDPM的去噪过程了,
在这里插入图片描述

η = 0 \eta=0 η=0时,效果是最好的。所以DDIM令 σ = 0 \sigma=0 σ=0

3. x p r e v x_{prev} xprev的推导

​ 从式9且 σ = 0 \sigma=0 σ=0,则式9中的所有都已知了!!!

​ 但是,即使这样,我们也还是由 x t 推导出 x t − 1 x_t推导出x_{t-1} xt推导出xt1呀,这样还是不能加快推理!

​ 不忙,我们回过头去思考,发现上面的推导过程中全程没有使用:
x t = a t x t − 1 + 1 − a t ϵ x_t= \sqrt{a_t}x_{t-1} + \sqrt{1-a_t} \epsilon xt=at xt1+1at ϵ
​ 也就可以不需要严格的由 x t 算到 x t − 1 x_t算到x_{t-1} xt算到xt1,则可以令 x p r e v 替代 x t − 1 x_{prev}替代x_{t-1} xprev替代xt1,式(9)则可以变换为:

在这里插入图片描述

​ 至此,所有的参数要是实现定义好了,要么是需要训练的,这样 x t 和 x p r e v x_t和x_{prev} xtxprev则可以相隔多个迭代步数。

4.疑难解答

Q1: 为什么式(11)可以简单的将 x p r e v 替代 x t − 1 x_{prev}替代x_{t-1} xprev替代xt1,毕竟虽然反向过程没有使用到 x t − 1 算到 x t x_{t-1}算到x_{t} xt1算到xt的关系式,但前向过程是使用到的呀?

​ 目前我也没有答案!还在理解中,由大佬路过,请留言讨论!

​ Q2: 为什么在DDIM可以令方差 σ = 0 \sigma=0 σ=0 ?

​ 目前我也没有答案!还在理解中,由大佬路过,请留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1367146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何精选WordPress插件

WordPress的强大功能大多得益于其众多插件。正确选择插件可以让你的网站功能强大、运行平稳,而错误的选择则可能导致网站变慢甚至出现安全漏洞。这篇文章将指导你如何在众多可选的插件中作出明智的选择。 明确需求 在浏览WordPress的插件目录或其他市场之前&#…

阶段十-分布式-任务调度

第一章 定时任务概述 在项目中开发定时任务应该一种比较常见的需求,在 Java 中开发定时任务主要有三种解决方案:一是使用JDK 自带的 Timer,二是使用 Spring Task,三是使用第三方组件 Quartz Timer 是 JDK 自带的定时任务工具,其…

STL标准库与泛型编程(侯捷)笔记1

STL标准库与泛型编程(侯捷) 本文是学习笔记,仅供个人学习使用。如有侵权,请联系删除。 参考链接 Youbute: 侯捷-STL标准库与泛型编程 B站: 侯捷 - STL Github:STL源码剖析中源码 https://github.com/SilverMaple/STLSourceCo…

Vue2:脚手架Vue-CLI的使用

一、环境准备 vue脚手架(vue-CLI)的使用是基于nodejs环境下的。 你可以简单理解为,Java项目需要再jvm虚拟机上才能编译运行 nodejs的作用就是将vue文件编译成html、css、js代码文件。 如何安装nodejs 参考:https://blog.csdn.net…

谁动了我的注册表?免费的注册表对比分析工具

关于这款工具,可以在B站搜谁动了我的注册表,UP主名字为有限的未知。该注册表对比分析工具视频教程链接如下。谁动了我的注册表?注册表比对分析工具 & 手动实现右键菜单自由_哔哩哔哩_bilibili 声明:该款注册表分析软件&#…

想要成为机器学习领域的高手吗?这里有五本必读免费书,订阅周报发链接 (下)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

接口测试实战教程详解(加密解密攻防)

一、对称加密 对称加密算法是共享密钥加密算法,在加密解密过程中,使用的密钥只有一个。发送和接收双方事先都知道加密的密钥,均使用这个密钥对数据进行加密和解密。 数据加密:在对称加密算法中,数据发送方将明文 (原…

用python提取excel表格第一列汉字首字母到第二列

今天有个任务就是需要提取excel表格里面的汉字首字母,然后我就手动写了三个小时,结果还剩3000多行,这样下去不行啊 想了下用python能不能做到呢? import openpyxl from pypinyin import lazy_pinyin, Style# 加载工作簿 workbook…

代码随想录算法训练营第三十天|总结、332.重新安排行程、51.N皇后、37.解数独

代码随想录 (programmercarl.com) 总结 332.重新安排行程 欧拉通路和欧拉回路: 欧拉通路:对于图G来说,如果存在一条通路包含G的所有边,则该通路称为欧拉通路,也称欧拉路径。欧拉回路:如果欧拉路径是一条…

mybatisPlus 将List<String>字段转成json字符串,使用JacksonTypeHandler以及自定义类型处理器实现

文章目录 场景使用JacksonTypeHandler实现类型转换自定义StringListTypeHandler处理器实现 场景 项目中经常需要将List转成json存储到配置文件中, mybatisPlus默认实现了JacksonTypeHandler,GsonTypeHandler,FastjsonTypeHandler,也可以自定义…

(2022|CVPR,非自回归,掩蔽图像生成,迭代译码)MaskGIT:掩蔽生成式图像 Transformer

MaskGIT: Masked Generative Image Transformer 公和众和号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 3. 方法 3.1 训练中的掩蔽视觉标记建模(Masked Visual Token Mod…

科技云报道:“存算一体”是大模型AI芯片的破局关键?

科技云报道原创。 在AI发展历史上,曾有两次“圣杯时刻”。 第一次发生在2012年10月,卷积神经网络(CNN)算法凭借比人眼识别更低的错误率,打开了计算机视觉的应用盛世。 第二次是2016年3月,DeepMind研发的…

在anaconda中安装pytorch的GPU版本

本文前提: 1.你已经下载好了anaconda,最好是新建一个虚拟环境来安装pytorch的GPU版本,并且设置了国内镜像源; 2.了解自己电脑对应的cuda版本,可通过nvidia-smi,并下载好了cuda。 安装pytorch的GPU版本 到官网中https…

猫头虎分享已解决Bug || TypeError: Cannot read property ‘match‘ of undefined

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

[足式机器人]Part2 Dr. CAN学习笔记 - Ch03 傅里叶级数与变换

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Ch03 傅里叶级数与变换 1. 三角函数的正交性2. 周期为 2 π 2\pi 2π的函数展开为傅里叶级数3. 周期为 2 L 2L 2L的函数展开4. 傅里叶级数的复数形式5. 从傅里叶级数推导傅里叶变换FT6. 总结 1. …

【野火i.MX6ULL开发板】利用microUSB线烧入Debian镜像

0、前言 烧入Debian镜像有两种方式:SD卡、USB SD卡:需要SD卡(不是所有型号都可以,建议去了解了解)、SD卡读卡器 USB:需要microUSB线 由于SD卡的网上资料很多了,又因为所需硬件(SD卡…

计算机配件杂谈-鼠标

目录 基础知识鼠标的发展鼠标的左右手鼠标的显示样式鼠标的移动和可见性移动可见性 现在的我们的生活工作都基本上离不开电脑了,不管是你平时玩玩游戏,上班工作等等; 今天将关于鼠标的一些小的技巧分享出来,共勉! 基础…

【MySQL】数据库之Redis的持久化

目录 一、Redis的高可用 1.1什么是高可用 1.2Redis的高可用技术 1.3持久化功能 1.4Redis持久化的方式 二、Redis的持久化之RDB 2.1RDB持久化的触发方式 触发条件 RDB持久化的触发分为手动触发和自动触发两种。 (1)手动触发 (2&…

UE5 使用动画模板创建多个动画蓝图

我们制作游戏的时候,角色会根据不同的武器表现出来不同的攻击动画,待机动画以及移动动画。如果我们在UE里面实现这个需求,是通过复制粘贴的方式修改,还是有更好的方式。 这里就需要介绍一下动画模板,我们可以将动画蓝图…

win11 如何切换用户?

第1步:打开其他用户 第2步:添加账户 第3步: 使用新用户登录