【深度学习】扩散模型(Diffusion Model)详解

【深度学习】扩散模型(Diffusion Model)详解

文章目录

  • 【深度学习】扩散模型(Diffusion Model)详解
    • 1. 介绍
    • 2. 具体方法
      • 2.1 扩散过程
      • 2.2 逆扩散过程
      • 2.3 损失函数
    • 3. 总结
    • 4. 参考

1. 介绍

在这里插入图片描述

扩散模型有两个过程:

  • 扩散过程:如上图所示,扩散过程为从右到左X0→XTX_0 \rightarrow X_TX0XT 的过程,表示对图片逐渐加噪,且Xt+1X_{t+1}Xt+1是在 XtX_{t}Xt上加躁得到的,其只受XtX_{t}Xt的影响。因此扩散过程是一个马尔科夫过程

    • X0X_0X0表示从真实数据集中采样得到的一张图片,对X0X_0X0添加 TTT 次噪声,图片逐渐变得模糊。当 TTT 足够大时,XTX_TXT为标准正态分布。在训练过程中,每次添加的噪声是已知的,即 q(Xt∣Xt−1)q(X_t|X_{t-1})q(XtXt1) 是已知的。根据马尔科夫过程的性质,我们可以递归得到 q(Xt∣X0)q(X_t|X_0)q(XtX0),即 q(Xt∣X0)q(X_t|X_0)q(XtX0) 是已知的。

    其中,扩散过程最主要的是 q(Xt∣X0)q(X_t|X_0)q(XtX0)q(Xt∣Xt−1)q(X_t|X_{t-1})q(XtXt1)的推导。

  • 逆扩散过程:如上图所示,逆扩散过程为从左到右 XT→X0X_T \rightarrow X_0XTX0 的过程,表示从噪声中逐渐复原出图片。如果我们能够在给定 XtX_tXt 条件下知道 Xt−1X_{t-1}Xt1 的分布,即如果我们可以知道 q(Xt−1∣Xt)q(X_{t-1}|X_t)q(Xt1Xt),那我们就能够从任意一张噪声图片中经过一次次的采样得到一张图片而达成图片生成的目的。

    • 显然我们很难知道 q(Xt−1∣Xt)q(X_{t-1}|X_t)q(Xt1Xt),因此我们才会用 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt) 来近似 q(Xt−1∣Xt)q(X_{t-1}|X_t)q(Xt1Xt),而 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt) 就是我们要训练的网络,在原文中就是个U-Net。而很妙的是,虽然我们不知道 q(Xt−1∣Xt)q(X_{t-1}|X_t)q(Xt1Xt),但是 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 却是可以用 q(Xt∣X0)q(X_t|X_0)q(XtX0)q(Xt∣Xt−1)q(X_t|X_{t-1})q(XtXt1) 表示的,即 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 是可知的,因此我们可以用 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 来指导 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt) 进行训练。

    其中,逆扩散过程最主要的是 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0)的推导。

2. 具体方法

在上面的介绍中,我们已经明确了要训练 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt),但是目标函数如何确定?

有两个很直接的想法:

  • 负对数的最大似然概率,即 −logpΘ(X0)-logp_{Θ}(X_0)logpΘ(X0)
  • 真实分布与预测分布的交叉熵,即 −Eq(X0)logpΘ(X0)-E_{q(X_0)}logp_{Θ}(X_0)Eq(X0)logpΘ(X0)

但是这两种方法都很难去求解(求积分)和优化。因此扩散模型参考了VAE,不去优化这两个东西,而是优化他们的变分上界(variational lower bound),定义 LVLBL_{VLB}LVLB,如下:
在这里插入图片描述
LVLBL_{VLB}LVLB 减小就代表着−logpΘ(X0)-logp_{Θ}(X_0)logpΘ(X0)−Eq(X0)logpΘ(X0)-E_{q(X_0)}logp_{Θ}(X_0)Eq(X0)logpΘ(X0) 的上界减小。且经过推导,$L_{VLB}又可写成如下形式:
在这里插入图片描述

由上式不难发现,LtL_{t}Lt就是逆扩散过程中 q(Xt∣Xt+1X0)q(X_{t}|X_{t+1}X_0)q(XtXt+1X0)pΘ(Xt∣Xt+1)p_{Θ}(X_{t}|X_{t+1})pΘ(XtXt+1)KLKLKL 散度,即用 q(Xt∣Xt+1X0)q(X_{t}|X_{t+1}X_0)q(XtXt+1X0) 来指导 pΘ(Xt∣Xt+1)p_{Θ}(X_{t}|X_{t+1})pΘ(XtXt+1) 进行训练。这部分主要就是(1)式和(2)式的推导,细节部分见下文的损失函数。

2.1 扩散过程

如上图所示,扩散过程为从右到左X0→XTX_0 \rightarrow X_TX0XT 的过程,表示对图片逐渐加噪。

  • Xt+1X_{t+1}Xt+1是在 XtX_{t}Xt上加躁得到的,其只受XtX_{t}Xt的影响。因此扩散过程是一个马尔科夫过程

下面,我们对扩散过程进行推导:

由于每一步扩散的步长受变量 {βt∈(0,1)}t=1T\{β_{t} \in (0,1)\}_{t=1}^{T}{βt(0,1)}t=1T 的影响。q(Xt∣Xt−1)q(X_{t}|X_{t-1})q(XtXt1) 可写为如下形式,即给定 Xt−1X_{t-1}Xt1 的条件下,XtX_{t}Xt服从均值为 1−βtXt−1\sqrt{1-β_{t}}X_{t-1}1βtXt1,方差为 βtIβ_{t}IβtI的正态分布:
在这里插入图片描述
用重参数化技巧表示 XtX_{t}Xt,令αt=1−βtα_{t}=1-β_{t}αt=1βt ,令 Zt∼N(0,I),t≥0Z_{t} \sim N(0,I), t \ge 0ZtN(0,I),t0,即:
在这里插入图片描述
其中,
在这里插入图片描述
可以得到,令 αˉt=∏i=1tαi\bar{α}_{t}= {\textstyle \prod_{i=1}^{t}α_{i}}αˉt=i=1tαi
在这里插入图片描述
设随机变量 Zˉt−1\bar{Z}_{t-1}Zˉt1 为:
在这里插入图片描述
Zˉt−1\bar{Z}_{t-1}Zˉt1 的期望和方差如下:
在这里插入图片描述
因此,
在这里插入图片描述

至此,我们推出了q(Xt∣Xt−1)q(X_{t}|X_{t-1})q(XtXt1)q(Xt∣X0)q(X_{t}|X_{0})q(XtX0),完成了扩散过程。

2.2 逆扩散过程

如上图所示,逆扩散过程为从左到右 XT→X0X_T \rightarrow X_0XTX0 的过程,表示从噪声中逐渐复原出图片。

  • 如果我们能够在给定 XtX_tXt 条件下知道 Xt−1X_{t-1}Xt1 的分布,即如果我们可以知道 q(Xt−1∣Xt)q(X_{t-1}|X_t)q(Xt1Xt),那我们就能够从任意一张噪声图片中经过一次次的采样得到一张图片而达成图片生成的目的。
  • 显然我们很难知道 q(Xt−1∣Xt)q(X_{t-1}|X_t)q(Xt1Xt),因此我们才会用 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt) 来近似 q(Xt−1∣Xt)q(X_{t-1}|X_t)q(Xt1Xt),而 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt) 就是我们要训练的网络。

虽然我们不知道 q(Xt−1∣Xt)q(X_{t-1}|X_t)q(Xt1Xt),但是 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 却是可以用 q(Xt∣X0)q(X_t|X_0)q(XtX0)q(Xt∣Xt−1)q(X_t|X_{t-1})q(XtXt1) 表示的,即 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 是可知的。

  • 因此我们可以用 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 来指导 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt) 进行训练。

下面我们对逆扩散过程进行推导:

先对 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0)进行推导:
在这里插入图片描述
现在,我们已经把 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0)q(Xt∣X0)q(X_t|X_0)q(XtX0)q(Xt∣Xt−1)q(X_t|X_{t-1})q(XtXt1) 进行表示,下面对 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 的表达式进行推导:
在这里插入图片描述
在这里插入图片描述
至此,我们得到了 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0)的分布表达式,完成了逆扩散过程。

2.3 损失函数

我们已经明确了要训练 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt),那要怎样进行训练?有两个很直接的想法:

  • 一个是负对数的最大似然概率,即 −logpΘ(X0)-logp_{Θ}(X_0)logpΘ(X0)
  • 另一个是真实分布与预测分布的交叉熵,即 −Eq(X0)logpΘ(X0)-E_{q(X_0)}logp_{Θ}(X_0)Eq(X0)logpΘ(X0)

然而,类似于VAE,由于我们很难对噪声空间进行积分,因此直接优化 −logpΘ-logp_{Θ}logpΘEq(X0)logpΘ(X0)E_{q(X_0)}logp_{Θ}(X_0)Eq(X0)logpΘ(X0)都是很困难的。

因此我们不直接优化它们,而是优化它们的变分上界LVLBL_{VLB}LVLB,其定义如下:
在这里插入图片描述
下面证明 LVLBL_{VLB}LVLB−logpΘ(X0)-logp_{Θ}(X_0)logpΘ(X0)−Eq(X0)logpΘ(X0)-E_{q(X_0)}logp_{Θ}(X_0)Eq(X0)logpΘ(X0) 的上界,即证明 LVLB≥−logpΘ(X0)L_{VLB} \ge -logp_{Θ}(X_0)LVLBlogpΘ(X0)LVLB≥−Eq(X0)logpΘ(X0)L_{VLB} \ge -E_{q(X_0)}logp_{Θ}(X_0)LVLBEq(X0)logpΘ(X0)
在这里插入图片描述
在这里插入图片描述
至此,证明了 LVLBL_{VLB}LVLB−logpΘ(X0)-logp_{Θ}(X_0)logpΘ(X0)−Eq(X0)logpΘ(X0)-E_{q(X_0)}logp_{Θ}(X_0)Eq(X0)logpΘ(X0)的上界。进而,对LVLBL_{VLB}LVLB进行化简,得到:
在这里插入图片描述
LtL_{t}Lt 即可看出,对 pΘ(Xt∣Xt+1)p_{Θ}(X_{t}|X_{t+1})pΘ(XtXt+1) 的监督就是最小化 pΘ(Xt∣Xt+1)p_{Θ}(X_{t}|X_{t+1})pΘ(XtXt+1)q(Xt∣Xt+1X0)q(X_t|X_{t+1}X_0)q(XtXt+1X0) 的KL散度。

3. 总结

总结来说,扩散模型的目的是希望学习出一个 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt),即能够从噪声图恢复出原图。
为了达到这一个目的,我们使用 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 来监督 pΘ(Xt−1∣Xt)p_{Θ}(X_{t-1}|X_t)pΘ(Xt1Xt) 进行训练,而q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0) 是可以用 q(Xt∣X0)q(X_t|X_0)q(XtX0)q(Xt∣Xt−1)q(X_t|X_{t-1})q(XtXt1) 进行表示的,即 q(Xt−1∣XtX0)q(X_{t-1}|X_tX_0)q(Xt1XtX0)是已知的。

4. 参考

【1】https://blog.csdn.net/Little_White_9/article/details/124435560
【2】https://lilianweng.github.io/posts/2021-07-11-diffusion-models/
【3】https://arxiv.org/abs/2105.05233
【4】https://arxiv.org/abs/1503.03585
【5】https://arxiv.org/abs/2006.11239

查看全文

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

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

相关文章:

在这里插入图片描述

【深度学习】扩散模型(Diffusion Model)详解

【深度学习】扩散模型(Diffusion Model)详解 文章目录【深度学习】扩散模型(Diffusion Model)详解1. 介绍2. 具体方法2.1 扩散过程2.2 逆扩散过程2.3 损失函数3. 总结4. 参考1. 介绍 扩散模型有两个过程: 扩散过程&amp……

Python的并发编程

我们将一个正在运行的程序称为进程。每个进程都有它自己的系统状态,包含内存状态、打开文件列表、追踪指令执行情况的程序指针以及一个保存局部变量的调用栈。通常情况下,一个进程依照一个单序列控制流顺序执行,这个控制流被称为该进程的主线……

快慢指针法解决链表问题

[1] 什么是快慢指针算法 快慢指针算法是一种基于指针的算法技巧,通常用于解决链表相关的问题。 它的核心思想是使用两个指针,一个指针移动速度较快,另一个指针移动速度较慢。通过这种方式,我们可以在遍历链表的过程中,……

记一次es6扩展运算符报错的解决办法

记一次es6扩展运算符报错的解决办法
对象展开运算符报错时需要安装一个插件: npm install –save-dev babel-plugin-transform-object-rest-spread 在.babelrc文件中配置: {“plugins”:[“transform-object-rest-spread”]}…

关于html video 在chrome浏览器下无法快进问题解决

标题 关于html5 video currentTime 在chrome浏览器下设定失败问题解决
关于html5 video currentTime 在chrome浏览器下设定失败问题解决
src引用的视频最好是在线网站视频完整引用地址 http://www.runoob.com/try/demo_source/movie.mp4,类似这样的!
……

Vue项目中无法移除事件监听问题

Vue项目中无法移除事件监听问题在一次Vue项目开发中,给window绑定了addEventListener事件,然后在离开组件的时候调用removeEventListener移除事件,但是发现没有生效错误示例下面这样操作,是无法移除事件的正确示例后来查找到Vue中……

vue导入xlsx-style组件报错Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx

vue导入xlsx-style组件报错Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx官方给出了解决方案,我们只需要修改一下配置官方给出了解决方案,我们只需要修改一下配置
vue2x版本 就是有webpack配置 就是在webpack.base.conf.js中加入下面这段
……

xlsx-style使用(导出表格及修改单元格样式)

xlsx-style使用(导出表格及修改单元格样式)
针对导出表格 需要与xlsx配合使用,通过xlsx的方法生成sheet对象然后在对象上修改样式
本文对xlsx-style 如何修改单元格样式做了一个大致对介绍,其中前半段对常用的一些属性对官方文档做了一个简单的翻译,希望可以耐心看完,在看后边……

关于浏览器的预检(OPTION)请求

关于浏览器的预检(OPTION)请求
OPTION请求没有附带请求数据,响应体也为空
1. OPTION预检请求的作用
OPTION请求用于获取目的资源所支持的通信选项 检测服务器所支持的请求方法 CORS中的预检请求 CORS规范要求,对那些可能对服务器数据产生副作用的HTTP请求方法(特别是GET以外……

记录Docker+Mysql+Adminer搭建web数据库管理客户端

数据持久化-MySQL
Adminer
Adminer是一个类似于phpMyAdmin的MySQL管理客户端。整个程序只有一个PHP文件,易于使用和安装。Adminer支持多语言(已自 带11种翻译语言文件,可以按自己的需求翻译相应的语言)。支持PHP4.3,……

反序列化渗透与攻防(五)之shiro反序列化漏洞

Shiro反序列化漏洞
Shiro介绍
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默……

vue2+vue3

vue2vue3尚硅谷vue2vue2 课程简介【02:24】vue2 Vue简介【17:59】vue2 Vue官网使用指南【14:07】vue2 搭建Vue开发环境【13:54】vue2 Hello小案例【22:25】了解: 不常用常用:id 更常用 简单class差值总结vue 实例vue 模板 : 先 取 &#xff0……

【hello Linux】环境变量

目录 1. 环境变量的概念 2. 常见的环境变量 3. 查看环境变量 4. 和环境变量相关的命令 5. 环境变量的组织方式 6. 通过代码获取环境变量 7. 通过系统调用获取环境变量 Linux🌷 在开始今天的内容之前,先来看一幅图片吧! 不知道你们是否和我一……

【Linux基础】常用命令整理

ls命令
-a选项,可以展示隐藏的文件和文件夹-l选项,以列表形式展示内容-h,需要和-l搭配使用,可以展示文件的大小单位ls -lah等同于la -a -l -h
cd命令(change directory)
语法:cd [Linux路径]……

客快物流大数据项目(一百一十二):初识Spring Cloud

文章目录
初识Spring Cloud
一、Spring Cloud简介
二、SpringCloud 基础架构图…

C和C++中的struct有什么区别

区别一: C语言中: Struct是用户自定义数据类型(UDT)。 C语言中: Struct是抽象数据类型(ADT),支持成员函数的定义。
区别二:
C中的struct是没有权限设置的&#xff0c……

docker的数据卷详解

数据卷 数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方修改会立即同步
一个数据卷可以同时被多个容器同时挂载,一个容器也可以被挂载多个数据卷
数据卷作用:容器数据持久化 /外部机器和容器间接通信 /容器……

13、Qt生成dll-QLibrary方式使用

Qt创建dll,使用QLibrary类方式调用dll
一、创建项目
1、新建项目->其他项目->Empty qmake Project->Choose 2、输入项目名,选择项目位置,下一步 3、选择MinGW,下一步 4、完成 5、.pro中添加TEMPLATE subdirs&#xff……

基于mapreduce 的 minHash 矩阵压缩

Minhash作用: 对大矩阵进行降维处理,在进行计算俩个用户之间的相似度。
比如: 俩个用户手机下载的APP的相似度,在一个矩阵中会有很多很多的用户要比较没俩个用户之间的相似度是一个很大的计算任务 如果首先对这个矩阵降维处理&am……

关于hashmap使用迭代器的问题

keySet获得的只是key值的集合,valueSet获得的是value集合,entryset获得的是键值对的集合。 package com.test2.test;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;public class mapiterator……

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注