DDIM学习笔记

写在前面:
(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.mzph.cn/news/606758.shtml

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

相关文章

音频文件元数据:批量修改技巧,视频剪辑高效修改元数据的方法

随着数字媒体技术的快速发展,音频文件已成为日常生活中的重要组成部分。无论是音乐、语音还是其他音频内容,元数据都是描述这些文件的重要信息。下面来看下云炫AI智剪如何批量修改音频文件元数据,在视频剪辑中高效修改元数据的方法。 下面来看…

Java常用类---包装类

包装类 包装类简介 Java语言是典型的面向对象编程语言,但是其中的8种基本数据类型并不支持面向对象编程,基本类型数据不具备"对象"的特性,即:没有携带属性以及没有方法可以调用。 为了解决上述问题,java为…

strtok函数的介绍

_str指被分解的字符串 delim指分隔符字符串 返回类型是指针 strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0 字符…

【论文阅读笔记】Dichotomous Image Segmentation with Frequency Priors

1. 论文介绍 Dichotomous Image Segmentation with Frequency Priors 基于频率先验的二分图像分割 2023年发表在IJCAI Paper Code 2. 摘要 二分图像分割(DIS)具有广泛的实际应用,近年来得到了越来越多的研究关注。本文提出了解决DIS与信息…

vue项目 Network: unavailable的解决办法

vue项目npm run serve 后,只有localhost访问,network不能访。 看到网上说有三种情况: 多个网卡原因:打开网络共享中心,把多余的网络禁用掉,只留一个 在中配置host及public 系统环境变量问题…

Redis高并发高可用(主从复制、哨兵)

复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Redis的基础,哨兵和集群都是在复制的基础上实现高可用的。 默认…

实战:使用docker容器化服务与文件挂载-2

接着上文,演示Elasticsearch 和 Kibana 的安装,并讲解文件挂载 Elasticsearch of Docker (Kibana) 1、Elasticsearch 安装 ElasticSearch 使用 Docker 安装:https://www.yuque.com/zhangshuaiyin/guli-mall/dwrp5b 1.…

php实现支付宝商户转账

目录 一:背景介绍 一:准备工作 三:代码实现 一:背景介绍 最近工作中,要用到支付宝的商家转账功能,用php代码实现,网上找的内容,有些是老版本的实现,有些是调用sdk&am…

【经验分享】如何看论文的分区、SCI检索号、EI检索号等信息

0 前言 一般而言,被SCI检索的论文,都会同时被EI检索。我们以论文《Learning Disentangled Representation for Multimodal Cross-Domain Sentiment Analysis》为例,讲解一下如何查询论文的各项信息。 我们首先百度这个论文 可以看到它是发表…

Android性能优化系列——内存优化

内存,是Android应用的生命线,一旦在内存上出现问题,轻者内存泄漏造成App卡顿,重者直接crash,因此一个应用保持健壮,要做好内存的使用和优化。网上有很多讲JAVA内存虚拟机的好文章,我就不赘述了。…

SQL必知必会笔记(9~12章)

第九章 汇总数据 1、聚集函数用来进行记录数据的加工,然后再进行返回。 2、SQL的聚集函数: 函数 说明 AVG() 返回某列的平均值 COUNT() 返回某列的行数 MAX() 返回某列的最大值 MIN() 返回某列的最小值 SUM() 返回某列值之和 3、AVG()函数 A…

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

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

Azure AI 内容安全Content Safety Studio实战

Azure AI Content Safety 检测应用程序和服务中用户生成和 AI 生成的有害内容。 Azure AI 内容安全包括文本和图像 API,可用于检测有害材料。 交互式 Content Safety Studio,可用于查看、浏览和试用用于检测不同形式的有害内容的示例代码。 关注TechLead…

项目框架构建之6:编写通用主机基础类

本文是“项目框架构建”系列之6,本文介绍如何编写通用主机基础类。 1.为了构建通用主机,我们先创建主机接口IAppHost接口 接口需要有配置项,我们定义为HostConfiguration,比如我们希望用户可以设定他的工作目录,就可…

深度学习|4.7 参数和超参数

4.7 参数和超参数 超参数是指需要用户提前设置好的参数,这些超参数最终会影响到参数的数值(相当于参数是动态调整得到的) 学习率的选取 最优学习率应该能使得代价函数趋于一个较低的常数。

接口工具Apifox

最近发现一款接口测试工具--apifox,我我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的公式,更能说明apifox可以做什么。 Apifox Postman Swagger Mock JMeter Apifox的特点: 接口文档定义: Apif…

CSS 发光输入框动画

<template><view class="content"><input placeholder="请输入..." class="input" /> </view> </template><script></script><style>/* 设置整个页面的背景颜色为 #212121 */body{background-c…

react native中使用tailwind并配置自动补全

使用的第三方库是tailwind-react-native-classnames&#xff0c;同类的也有tailwind-rn&#xff0c;但是我更喜欢前者官方demo&#xff1a; import { View, Text } from react-native; import tw from twrnc;const MyComponent () > (<View style{twp-4 android:pt-2 b…

【办公技巧】excel中设置选项按钮的方法

大家是否会遇到需要勾中选项的情况&#xff0c;我们可以在电子表格中制作出可以勾选、选中的选项按钮&#xff0c;今天我们一起学习一下设置方法。 首先&#xff0c;我们需要先在excel工具栏中添加一个功能模块&#xff1a;开发工具 依次点击excel中的文件 – 选项 – 自定义…

第二百五十三回

文章目录 概念介绍使用方法示例代码 概念介绍 进度条是常用的组件之一&#xff0c;它主要用来显示某种动作的完成进度。Flutter提供了多种进度条组件&#xff0c;常用的是水平进度条&#xff1a;LinearProgressIndicator&#xff1b;圆形进度条 :CircularProgressIndicator和R…