DDIM,多样性与运行效率之间的trade off

2024-04-07 20:44

本文主要是介绍DDIM,多样性与运行效率之间的trade off,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DDPM的重大缺陷在于其在反向扩散的过程中需要逐步从 x t x_t xt倒推到 x 0 x_0 x0,因此其推理速度非常缓慢。相反,DDPM的训练过程是很快的,可以直接根据 x 0 x_0 x0 x t x_t xt添加的高斯噪声 ϵ \epsilon ϵ完成一次训练。

为了解决这个问题,就有了DDIM,且包括Stable Diffusion在内的现今广泛使用的Diffusion模型都在使用DDIM。

在DDPM中,我们利用 P ( x t − 1 ∣ x t ) P(x_{t-1}|x_{t}) P(xt1xt)来逐步倒推至最开始的 x 0 x_0 x0,这一过程是遵守马尔可夫过程的,即每个时刻的状态只跟上一个时刻的状态有关,因此只能一步步的倒退回去。而实际上,我们最初就是简化了加噪过程,从 x 0 x_0 x0 x t x_t xt直接一步到位,并没有使用 P ( x t ∣ x t − 1 ) P(x_t|x_{t-1}) P(xtxt1)这样按部就班的马尔可夫过程。那么,能不能在倒推的时候也采用类似的思路进行“跳步”,从而达到加快推理的目的呢?

假设我们现在想直接从 k k k时刻跳到 s s s时刻,且有 s < k − 1 s<k-1 s<k1,那么仿照DDPM我们可以写出下列式子
P ( x s ∣ x k , x 0 ) = P ( x k ∣ x s , x 0 ) P ( x s ∣ x 0 ) P ( x k ∣ x 0 ) P(x_s|x_k,x_0)=\frac{P(x_k|x_s,x_0)P(x_s|x_0)}{P(x_k|x_0)} P(xsxk,x0)=P(xkx0)P(xkxs,x0)P(xsx0)
其中 P ( x s ∣ x 0 ) P(x_s|x_0) P(xsx0) P ( x k ∣ x 0 ) P(x_k|x_0) P(xkx0)满足的分布都好说,可以从正向扩散公式中得出。不知道怎么表示的这一项 P ( x k ∣ x s , x 0 ) P(x_k|x_s,x_0) P(xkxs,x0)因为反正整个模型都没有用过,所以可以先不考虑。(这个解释确实很神奇,但是他有用啊)其实就是说DDIM打破了马尔可夫链从 0 0 0开始逐个往前扩散的模型,而是直接采用从 x 0 x_0 x0 x t x_t xt的直接公式作为整个模型的backbone,因此从 s s s k k k的正向过程可以“按需定义”,而不必采用DDPM里的公式,所以在这里就直接被忽略了。

言归正传,我们尝试求解一下上面的式子。参考DDPM,我们也可以假设 P ( x s ∣ x k , x 0 ) P(x_s|x_k,x_0) P(xsxk,x0)是满足正态分布的,其均值为 x k x_k xk x 0 x_0 x0的加权和,记为
P ( x s ∣ x k , x 0 ) ∼ N ( n x 0 + m x k , σ 2 ) P(x_s|x_k,x_0)\sim\mathcal{N}(nx_0+mx_k, \sigma^2) P(xsxk,x0)N(nx0+mxk,σ2)写出 x s x_s xs的表达式
x s = ( n x 0 + m x k ) + σ ϵ , ϵ ∈ N ( 0 , 1 ) x_s=(nx_0+mx_k)+\sigma\epsilon,\epsilon\in\mathcal{N}(0,1) xs=(nx0+mxk)+σϵ,ϵN(0,1) x k = α ‾ k x 0 + 1 − a ‾ k ϵ ′ x_k=\sqrt{\overline{\alpha}_k}x_0+\sqrt{1-\overline{a}_k}\epsilon' xk=αk x0+1ak ϵ代入,可得
x s = ( n x 0 + m x k ) + σ ϵ = ( n + m a ‾ k ) x 0 + ( m 1 − a ‾ k ϵ ′ + σ ϵ ) = ( n + m a ‾ k ) x 0 + m 2 ( 1 − a ‾ k ) + σ 2 ϵ ′ ′ \begin{aligned} x_s&=(nx_0+mx_k)+\sigma\epsilon\\ &=(n+m\sqrt{\overline{a}_k})x_0+(m\sqrt{1-\overline{a}_k}\epsilon'+\sigma\epsilon)\\ &=(n+m\sqrt{\overline{a}_k})x_0+\sqrt{m^2(1-\overline{a}_k)+\sigma^2}\epsilon'' \end{aligned} xs=(nx0+mxk)+σϵ=(n+mak )x0+(m1ak ϵ+σϵ)=(n+mak )x0+m2(1ak)+σ2 ϵ′′注意到这个的形式与从 x 0 x_0 x0直接到 x s x_s xs的公式很像,即 x s = α ‾ s x 0 + 1 − a ‾ s ϵ x_s=\sqrt{\overline{\alpha}_s}x_0+\sqrt{1-\overline{a}_s}\epsilon xs=αs x0+1as ϵ,所以我们可以将这两个系数对应起来求解,得
m = 1 − α ‾ s − σ 2 1 − α ‾ k , n = α ‾ s − 1 − α ‾ s − σ 2 1 − α ‾ k α ‾ k m=\frac{\sqrt{1-\overline{\alpha}_s-\sigma^2}}{\sqrt{1-\overline{\alpha}_k}},n=\sqrt{\overline{\alpha}_s}-\frac{\sqrt{1-\overline{\alpha}_s-\sigma^2}}{\sqrt{1-\overline{\alpha}_k}}\sqrt{\overline{\alpha}_k} m=1αk 1αsσ2 ,n=αs 1αk 1αsσ2 αk 将上面的结果带入 x s x_s xs的均值 n x 0 + m x k nx_0+mx_k nx0+mxk,可得
μ = α ‾ s x 0 + 1 − α ‾ s − σ 2 1 − α ‾ k ( x k − α ‾ k x 0 ) \begin{aligned} \mu=\sqrt{\overline{\alpha}_s}x_0+\frac{\sqrt{1-\overline{\alpha}_s-\sigma^2}}{\sqrt{1-\overline{\alpha}_k}}(x_k-\sqrt{\overline{\alpha}_k}x_0) \end{aligned} μ=αs x0+1αk 1αsσ2 (xkαk x0)这样我们就求得了 P ( x s ∣ x k , x 0 ) P(x_s|x_k,x_0) P(xsxk,x0)满足的正态分布 N ( μ , σ 2 ) \mathcal{N}(\mu,\sigma^2) N(μ,σ2),其中只剩 σ \sigma σ为变量, x 0 x_0 x0可以像DDPM一样反解为 x k x_k xk的表达式代入,通过预测加噪的噪声来得到一个确定的 μ \mu μ

至于方差 σ \sigma σ,一般有两种取值,取 0 0 0时方差为 0 0 0,这个反向扩散就成了一个确定过程,对应标题中所说的“多样性换运行效率”,此时 σ = 0 \sigma=0 σ=0的状态就是我们通常所说的DDIM。而 σ = 1 − a t 1 − a ‾ t − 1 1 − a ‾ t \sigma=\frac{\sqrt{1-a_t}\sqrt{1-\overline{a}_{t-1}}}{\sqrt{1-\overline{a}_t}} σ=1at 1at 1at1 ,即在DDPM中推出来的方差时,整个过程会退化为DDPM的倒推过程。

需要注意的是,这里的 σ \sigma σ可以自由取值是因为我们假设 P ( x s ∣ x k , x 0 ) P(x_s|x_k,x_0) P(xsxk,x0)是一个均值 μ \mu μ未知,方差为 σ 2 \sigma^2 σ2的高斯分布,通过求解 μ \mu μ得到了一个只有 σ \sigma σ为自由变量的 x s x_s xs的表达式。可以把 σ \sigma σ视作一个超参数,只是通过实验发现在 σ = 0 \sigma=0 σ=0时效果最好。而DDPM中的方差是通过三个已知的正态分布计算来的,本身就是靠计算得来的确定的方差,所以不能随便更改,如果在DDPM的过程中使 σ = 0 \sigma=0 σ=0,效果会非常差。

而从实验结果来看, σ = 0 \sigma=0 σ=0的时候还是效果最好的,FID最低。在 S S S 50 50 50 100 100 100,即加速 10 − 20 10-20 1020倍时保持相近的生成质量。
在这里插入图片描述
更妙的是,因为DDPM中的U-Net预测的是加在 x t x_t xt上的噪声 ϵ \epsilon ϵ,这个是基于正向扩散的公式来的。而DDIM并没有改变这一过程,因此一个训练好的DDPM中的U-Net也可以直接拿到DDIM里面,甚至不需要额外训练。DDIM只是更改了DDPM反向扩散的过程,通过跳步加速推理。

这篇关于DDIM,多样性与运行效率之间的trade off的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装