【文生图系列】Denoising Diffusion Probabilistic Models论文解读

news2025/1/24 2:14:39

文章目录

    • 扩散模型
      • 扩散过程
      • 反向过程
      • 优化目标
    • 训练过程
    • 参考

此篇论文是DDPM的奠基之作,后续扩散模型相关论文都基本继承了前向加噪-反向降噪-训练这样的框架。论文全是公式,理解起来好难好难。

【文生图系列】基础篇-马尔可夫链
【文生图系列】基础篇-变分推理(数学推导)

扩散模型

扩散模型是扩散概率模型(diffusion probabilistic model)的简称,它是一个参数化的马尔科夫链,使用变分推理进行训练,以在有限的时间后生出与数据匹配的样本。扩散模型包括前向过程(forward process)和反向过程(reverse process),其中前向过程也被成为扩散过程(diffusion process),它逐渐地从方差表(variance schedule) β 1 , ⋯   , β T \beta_{1}, \cdots, \beta_{T} β1,,βT中向数据中添加高斯噪声。反向过程则相反,不断去除噪声,用于生成图片。
在这里插入图片描述
如上图所示,前向扩散过程是从 x 0 → x T x_{0} \to x_{T} x0xT,每一步的条件概率分布定义为 q ( x t ∣ x t − 1 ) q\left( x_{t} | x_{t-1} \right) q(xtxt1),逐步地向人脸图像中添加噪声,直至第 T T T步时,人脸图像彻底为一张噪声图片。反向过程是从 x T → x 0 x_{T} \to x_{0} xTx0,每一步的条件概率分布定义为 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt),逐步地去除噪声图片中的噪声,以生成人脸图像。但是 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt)却是难以计算的,因此需要学习一个模型 p θ p_{\theta} pθ近似条件概率。

在这里插入图片描述

扩散过程

从一个真实数据分布中选择一个样本点 x 0 ∼ q ( x ) x_{0} \sim q\left( x \right) x0q(x),每一次向样本中添加少量高斯噪声,执行T次,得到噪音样本序列 x 1 , ⋯   , x T x_{1}, \cdots, x_{T} x1,,xT。前向过程用公式定义如下:
在这里插入图片描述

执行步数由方差表 { β t ∈ ( 0 , 1 ) } t = 1 T \{ \beta_{t} \in \left( 0, 1 \right) \}_{t=1}^{T} {βt(0,1)}t=1T控制, β t \beta_{t} βt为第 t t t步所采用的方差,它介于 ( 0 , 1 ) \left( 0, 1 \right) (0,1)之间。通常情况下,方差的取值会随着 T T T的增大而越来越大 β 1 < β 2 < ⋯ < β T \beta_{1} < \beta_{2} < \cdots < \beta_{T} β1<β2<<βT。而且随着 T T T的增大,样本数据 x 0 x_{0} x0会逐渐失去它的分布特征,当 T T T趋于无穷时, x T x_{T} xT则等价于一个各向同性高斯分布(isotropic Gaussian distribution)。

已知,扩散过程是一个马尔可夫链,每一步都会生成带噪音的数据 x t x_{t} xt。扩散过程的一个重要特性就是可以基于原始样本数据 x 0 x_{0} x0使用重参数技巧(reparameterization trick)采样任意 t t t步的生成数据 x t x_{t} xt, q ( x t ∣ x 0 ) = N ( x t , α ˉ t x 0 , ( 1 − α ˉ t ) I ) q\left(x_{t} | x_{0} \right)=N\left ( x_{t}, \sqrt{\bar{\alpha }_{t} } x_{0}, \left ( 1 - \bar{\alpha }_{t} \right ) I \right ) q(xtx0)=N(xt,αˉt x0,(1αˉt)I)

α t = 1 − β t , α ˉ t = ∏ s = 1 t = α s \alpha_{t} = 1 - \beta_{t}, \bar{\alpha}_{t}=\prod_{s=1}^{t}=\alpha_{s} αt=1βt,αˉt=s=1t=αs q ( x t ∣ x 0 ) q\left(x_{t} | x_{0} \right) q(xtx0)的推理过程如下所示:

在这里插入图片描述

反向过程

反向过程是前向过程的反向,从一个高斯噪声输入 x T ∼ N ( 0 , 1 ) x_{T} \sim N \left( 0, 1 \right) xTN(0,1)中创建真实案例的过程,如果 β t \beta_{t} βt足够小,那么 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt)也符合高斯分布。但是,需要全部的数据计算 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt),这是一件很困难的事情,因此,为了能够运行反向扩撒模型,需要学习一个模型 p θ p_{\theta} pθ近似估计条件概率。

假设 x 1 , ⋯   , x T x_{1}, \cdots, x_{T} x1,,xT为与数据 x 0 ∼ q ( x 0 ) x_{0} \sim q\left( x_{0} \right) x0q(x0)有相同维度的隐藏变量,扩散模型就是一个隐藏变量模型,用公式表示为 p θ ( x 0 ) : = ∫ p θ ( x 0 : T ) d x 1 : T p_{\theta}\left( x_{0} \right) := \int p_{\theta} \left( x_{0:T} \right) dx_{1:T} pθ(x0):=pθ(x0:T)dx1:T。反向过程则可被定义成这样的一个马尔可夫链,初始状态转移为 p ( x T ) = N ( x T , 0 , I ) p\left( x_{T} \right) = N\left( x_{T}, 0, I \right) p(xT)=N(xT,0,I)
在这里插入图片描述
p θ ( x t − 1 ∣ x t ) p_{\theta}\left( x_{t-1} | x_{t} \right) pθ(xt1xt)为参数化的高斯分布,均值和方差分别是训练的网络 μ θ ( x t , t ) \mu_{\theta}\left( x_{t}, t \right) μθ(xt,t) ∑ θ ( x t , t ) \sum_{\theta}\left( x_{t}, t \right) θ(xt,t)。最终的生成模型就是由这些均值和方差网络组成。

虽然条件分布 q ( x t − 1 ∣ x t ) q\left(x_{t-1} | x_{t} \right) q(xt1xt)是不可直接处理的,但是加上条件 x 0 x_{0} x0的后验分布 q ( x t − 1 ∣ x t , x 0 ) q\left(x_{t-1} | x_{t} , x_{0} \right) q(xt1xt,x0)却是可处理的。

在这里插入图片描述
推理过程如下图所示。第一步的 C ( c t , c 0 ) C\left( c_{t}, c_{0} \right) C(ct,c0) x t − 1 x_{t-1} xt1无关,可以省略。后验分布 q ( x t − 1 ∣ x t , x 0 ) q\left(x_{t-1} | x_{t} , x_{0} \right) q(xt1xt,x0)的方差是一个定量,均值是一个依赖 x t x_{t} xt的函数。

在这里插入图片描述

σ t 2 = β t ~ = 1 − α ˉ t − 1 1 − α t ˉ β t \sigma_{t}^{2} = \tilde {\beta_{t}} = \frac{1 - \bar{\alpha}_{t-1}}{1-\bar{\alpha_{t}}}\beta_{t} σt2=βt~=1αtˉ1αˉt1βt,其中 β t = 1 − α t \beta_{t} = 1 - \alpha_{t} βt=1αt,那么从分布 p θ ( x t − 1 ∣ x t ) p_{\theta}\left( x_{t-1} | x_{t} \right) pθ(xt1xt)中采样 x t − 1 x_{t-1} xt1,计算公式为 x t − 1 = 1 α t ( x t − β t 1 − α ˉ t ϵ t ) + σ t z x_{t-1} = \frac{1}{\sqrt{\alpha_{t}}} \left ( x_{t} - \frac{\beta_{t}}{\sqrt{1 - \bar{\alpha}_{t} } } \epsilon_{t} \right ) + \sigma_{t}z xt1=αt 1(xt1αˉt βtϵt)+σtz,其中 z z z服从正态分布 z ∼ N ( 0 , I ) z \sim N \left( 0, I \right) zN(0,I)。采样整体过程伪代码见下图Algorithm 2。

在这里插入图片描述

优化目标

如果将扩散模型中间产生的变量看作隐变量的话,那么扩散模型其实就是包含 T T T个隐变量的隐变量模型,与VAE相似,不同的是扩散模型的隐变量与原始数据同纬度。那么就可以基于变分推断得到ELBO作为最大优化目标。

推导过程如下图所示,最后的优化目标共包含 T + 1 T+1 T+1项。
在这里插入图片描述
在这里插入图片描述

  1. L T L_{T} LT计算的是噪音分布和先验分布的KL散度,先验 p ( x T ) p\left( x_{T} \right) p(xT)服从正太分布,扩散过程最后得到的随机噪音 q ( x T ∣ x 0 ) q\left( x_{T} | x_{0} \right) q(xTx0)也近似正太分布,所以它们两之间的KL散度近似为0。

  2. 假设图像数据为的整数,线性缩放到,这样能够保证神经网络反向过程从标准正太分布先验开始,在一致缩放的输入上进行操作。为了能够获得离散对数似然,反向过程中的最后一项设置为一个独立的离散解码器,该解码器源自于高斯分布 N ( x 0 , μ θ ( x 1 , 1 ) , σ 1 2 I ) N \left( x_{0}, \mu_{\theta} \left( x_{1}, 1 \right), \sigma_{1}^{2}I \right) N(x0,μθ(x1,1),σ12I)

在这里插入图片描述

  1. L t L_{t} Lt为前向过程和反向过程的KL散度。依据KL散度的定义和上述前向和反向过程的公式定义,对 L t L_{t} Lt进行参数化。

在这里插入图片描述

训练扩散模型时,发现忽略权重项,一个简化版的 L t L_{t} Lt会让模型性能更好。简化版的 L t L_{t} Lt如下所示。这就是上述Algorithm 1 训练伪代码第5行公式的由来。

在这里插入图片描述

训练过程

训练部署设置为 T = 1000 T=1000 T=1000,前向过程中方差从 β 1 = 1 0 − 4 \beta_{1} = 10^{-4} β1=104线性增长到 β T = 0.02 \beta_{T} = 0.02 βT=0.02

神经网络backbone是一个U-Net网络。U-Net属于编码-解码架构,编码器分成不同的stages,每个stage都包含下采样模块降低特征的空间大小;解码器将编码器压缩的特征上采样恢复。

参考

  1. Denoising Diffusion Probabilistic Models
  2. hojonathanho/diffusion
  3. What are Diffusion Models
  4. 扩散模型之DDPM
  5. 十分钟读懂Diffusion:图解Diffusion扩散模型
  6. Denoising Diffusion-based Generative Modeling: Foundations and Applications

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

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

相关文章

springboot中的properties配置文件:MySQL密码添加双引号会报错

在springboot项目中&#xff0c;如果使用的配置文件是properties 格式&#xff0c;那么给属性的值添加双引号可能会出错&#xff0c;比如给MySQL的密码添加双引号&#xff1a; 我们在调试模式下&#xff0c;一探究竟&#xff1a; 然后在其poolProperties中查看&#xff0c;密…

如何快速在vscode中实现不同python文件的对比查看

总体而言&#xff1a;两种方式。一种是直接点击vscode右上角的图标&#xff08;见下图&#xff09;。 另一种方式就是使用快捷键啦“**Ctrl**”&#xff0c;用的时候选中想要对比的python文件&#xff0c;然后快捷键就可以达到下图效果了&#xff1a; 建议大家直接使用第二种…

Java课题笔记~ SpringBoot基础配置

二、基础配置 1. 配置文件格式 问题导入 框架常见的配置文件有哪几种形式&#xff1f; 1.1 修改服务器端口 http://localhost:8080/books/1 >>> http://localhost/books/1 SpringBoot提供了多种属性配置方式 application.properties server.port80 applicati…

电动汽车太秀了!用一个技巧搞定了蓄电池!

当涉及能源存储和供应&#xff0c;特别是在太阳能、电动车和不间断电源等领域&#xff0c;蓄电池无疑是关键的组成部分。然而&#xff0c;蓄电池的状态、性能和健康状况对于系统的可靠性和效率至关重要。 蓄电池监控通过实时监测、数据分析和预警功能&#xff0c;它提供了更高效…

PCB老化测试注意事项和操作流程

PCB老化测试是为了评估PCB在实际应用环境中的可靠性和寿命而进行的测试。以下是PCB老化测试的一般步骤和一些注意事项&#xff1a; 步骤&#xff1a; 1. 确定老化条件&#xff1a;根据实际应用环境和需求&#xff0c;确定老化测试的条件&#xff0c;如温度、湿度、电压等。这些…

基于Redis实现关注、取关、共同关注及消息推送(含源码)

微信公众号访问地址&#xff1a;基于Redis实现关注、取关、共同关注及消息推送(含源码) 推荐文章&#xff1a; 1、springBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表; 2、SpringBoot用线程池ThreadPoolTaskExecutor异步处理百万级数据; 3、为什么引入Rediss…

【3Ds Max】可编辑多边形“点”层级的简单使用

目录 简介 示例 &#xff08;1&#xff09;移除 &#xff08;2&#xff09;断开 &#xff08;3&#xff09;焊接 &#xff08;4&#xff09;挤出 &#xff08;5&#xff09;切角 &#xff08;6&#xff09;目标焊接 &#xff08;7&#xff09;连接 简介 在3ds Max中&…

Golang使用MinIO

最近在使用Golang做了一个网盘项目&#xff08;学习&#xff09;&#xff0c;文件存储一直保存在本地&#xff08;各厂商提供的oss贵&#xff09;&#xff0c;所以就在思考怎么来处理这些文件&#xff0c;类似的方案很对hdfs、fastdfs&#xff0c;但这其中MinIO是最近几年比较火…

网安周报|Monti Ransomware团伙推出了一个新的Linux加密器

Monti Ransomware团伙推出了一个新的Linux加密器 经过两个月的休息&#xff0c;Monti 勒索软件运营商带着新的 Linux 版本的加密器返回。该变体被用于针对政府和法律部门组织的攻击。研究人员注意到两个团伙的TTP之间有多个相似之处&#xff0c;Monti运营商还基于Conti泄露的源…

Synchronized与Java线程的关系

前言 ​ Java多线程处理任务时&#xff0c;为了线程安全&#xff0c;通常会对共享资源进行加锁&#xff0c;拿到锁的线程才能进行访问共享资源。而加锁方式通过都是Synchronized锁或者Lock锁。 ​ 那么多线程在协同工作的时候&#xff0c;线程状态的变化都与锁对象有关系。 …

安防监控视频云存储平台EasyNVR出现内核报错的情况该如何解决?

安防视频监控汇聚EasyNVR视频集中存储平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。 近期有用户联系到我们&#xff0c;EasyNVR…

lab3 pgtbl

Pre 在这个lab中&#xff0c;你将探索页表&#xff0c;并且修改它们以简化从用户空间拷贝数据到内核空间的函数 在开始之前&#xff0c;需要完成 阅读xv6 book的第3章kern/memlayout.h 有关内存的布局kern/vm.c 包含大部分虚拟内存的代码kernel/kalloc.c 分配和释放虚拟内存的代…

Redisson实现分布式锁示例

一、引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.16.0</version></dependency>二、配置类 import org.redisson.Redisson; import org.redisson.api.RedissonClient;…

无涯教程-Perl - wantarray函数

描述 如果当前正在执行的函数的context正在寻找列表值,则此函数返回true。在标量context中返回false。 语法 以下是此函数的简单语法- wantarray返回值 如果没有context,则此函数返回undef&#xff1b;如果lvalue需要标量,则该函数返回0。 例 以下是显示其基本用法的示例…

调整mysql 最大传输数据 max_allowed_packet=500M

查看 -- show VARIABLES like %max_allowed_packet%; -- set global max_allowed_packet 1024*1024*64;-- show variables like %timeout%; -- show global status like com_kill; show global variables like max_allowed_packet; -- set global max_allowed_packet1024*102…

机器学习|DBSCAN 算法的数学原理及代码解析

机器学习&#xff5c;DBSCAN 算法的数学原理及代码解析 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;是一种基于密度的聚类算法&#xff0c;它能够有效地发现任意形状的聚类簇&#xff0c;并且可以识别出噪声点。在本文中&…

NineData通过AWS FTR认证,打造安全可靠的数据管理平台

近日&#xff0c;NineData 作为新一代的云原生智能数据管理平台&#xff0c;成功通过了 AWS&#xff08;Amazon Web Service&#xff09;的 FTR 认证。NineData 在 FTR 认证过程中表现出色&#xff0c;成功通过了各项严格的测试和评估&#xff0c;在数据安全管理、技术应用、流…

element时间选择器el-date-picter使用disabledDate指定禁用的日期

需要的效果 <el-date-pickerclass"selectstyle"v-model"year"value-format"yyyy"type"year":picker-options"disabledCli"placeholder"选择年"> </el-date-picker>data() {return {disabledCli: {/…

PostgreSQL中的密码验证方法

假设您想在客户端/服务器协议中实现密码身份验证方法。 您将如何做到这一点以及可能出现的问题是什么&#xff1f; 以下是 PostgreSQL 中如何完成此操作的故事。 password 一开始&#xff0c;PostgreSQL 只有 pg_hba.conf 中现在称为“password”的方法。 这是你能想象到的最…

数字化施工:解决传统施工难题,提高施工效率和质量的行业革命

建筑行业是我国国民经济的重要组成部分&#xff0c;也是支柱性产业之一。然而&#xff0c;建筑业同时也是一个安全事故多发的高风险行业。如何加强施工现场的安全管理&#xff0c;降低事故发生的频率&#xff0c;避免各种违规操作和不文明施工&#xff0c;提高建筑工程的质量&a…