Diffusion Model 浅学笔记

news2024/9/23 11:17:40

Diffusion Model

Created by: 银晗 张
Created time: May 29, 2023 8:12 AM

VAE → GAN →Diffusion

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2gVx3hv-1690185475251)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled.png)]

要讲扩散模型,不得不提VAE。VAE和GAN一样,都是从隐变量Z生成目标数据X。

它们假设隐变量服从某种常见的概率分布(比如正态分布),然后希望训练一个模型

X = g ( Z ) X=g(Z) X=g(Z),这个模型将原来的概率分布映射到训练集的概率分布,也就是分布的变换。

  • 注意,VAE和GAN的本质都是概率分布的映射

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PL7nPpNo-1690185475252)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%201.png)]

是不是听上去很work?

但是这种方法本质上是难以work的,因为尽量接近并没有一个确定的关于 X X X X ˉ \bar{X} Xˉ的相似度的评判标准。

换句话说,这种方法的难度就在于,必须去猜测“它们的分布相等吗”这个问题,而缺少真正interpretable的价值判断。

有聪明的同学会问,KL散度不就够了吗?不行,因为KL散度是针对两个已知的概率分布求相似度的,而 X ˉ 和 X \bar{X}和X XˉX概率分布目前都是未知

VAE

它本质上就是在我们常规的自编码器的基础上,对 encoder 的结果(在VAE中对应着计算均值的网络)加上了“高斯噪声”,使得结果 decoder 能够对噪声有鲁棒性;而那个额外的 KL loss(目的是让均值为 0,方差为 1),事实上就是相当于对 encoder 的一个正则项,希望 encoder 出来的东西均有零均值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jk3vXJzX-1690185475253)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%202.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUP9lMag-1690185475253)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%203.png)]

为了使模型具有生成能力,VAE 要求每个 p(Z_X) 都向正态分布看齐。

那怎么让所有的 p(Z|X) 都向 N(0,I) 看齐呢?如果没有外部知识的话,其实最直接的方法应该是在重构误差的基础上中加入额外的 loss:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WrMR0xCl-1690185475254)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%204.png)]

因为它们分别代表了均值 μ k μ_k μk 和方差的对数 l o g σ 2 logσ^2 logσ2,达到 ∗ N ( 0 , I ) ∗ *N(0,I)* N(0,I) 就是希望二者尽量接近于 0 了。不过,这又会面临着这两个损失的比例要怎么选取的问题,选取得不好,生成的图像会比较模糊。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h9e9n1Pu-1690185475255)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%205.png)]

这里的 d 是隐变量 Z 的维度,而 μ ( i ) μ(i) μ(i) σ ( i ) 2 σ_{(i)}^{2} σ(i)2 分别代表一般正态分布的均值向量和方差向量的第 i 个分量。直接用这个式子做补充 loss,就不用考虑均值损失和方差损失的相对比例问题了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cVhegdEr-1690185475255)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%206.png)]

重参数技巧

其实很简单,就是我们要从 ∗ p ( Z ∣ X k ) ∗ *p(Z|X_k)* p(ZXk) 中采样一个 Z k Z_k Zk 出来,尽管我们知道了 ∗ p ( Z ∣ X k ) ∗ *p(Z|X_k)* p(ZXk) 是正态分布,但是均值方差都是靠模型算出来的,我们要靠这个过程反过来优化均值方差的模型,但是“采样”这个操作是不可导的,而采样的结果是可导的,于是我们利用了一个事实:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DbK7wkfw-1690185475256)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%207.png)]

所以,我们将从 N ( μ , σ 2 ) N(μ,σ^2) N(μ,σ2) 采样变成了从 ∗ N ( 0 , σ 2 ) ∗ *N(0,σ^2)* N(0,σ2) 中采样,然后通过参数变换得到从 ∗ N ( μ , σ 2 ) ∗ *N(μ,σ^2)* N(μ,σ2) 中采样的结果。

这样一来,“采样”这个操作就不用参与梯度下降了,改为采样的结果参与,使得整个模型可训练了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i5ClVYKc-1690185475257)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%208.png)]

Diffusion

  • VAE的生成器,是将标准高斯映射到数据样本(自己定义的)。VAE的后验分布,是将数据样本映射到标准高斯(学出来的)。

那反过来,我想要设计一种方法A,使得A用一种简单的“变分后验”将数据样本映射到标准高斯(自己定义的),并且使得A的生成器,将标准高斯映射到数据样本(学出来的)

  • 注意,因为生成器的搜索空间大于变分后验,VAE的效率远不及A方法:因为A方法是学一个生成器(搜索空间大),所以可以直接模仿这个“变分后验”的每一小步

所以,A学的是样本到标准高斯分布 N ( μ , σ 2 ) N(\mu,\sigma^2) N(μ,σ2)的的映射关系 f f f,如何学?马尔可夫链


马尔可夫链:

  • 最重要的性质:平稳性

一个概率分布如果随时间变化,那么在马尔可夫链的作用下,它一定会趋于某种平稳分布(例如高斯分布)。只要终止时间足够长,概率分布就会趋近于这个平稳分布。

这个逐渐逼近的过程被作者称为前向过程(forward process)。**注意,这个过程的本质还是加噪声!**试想一下为什么……其实和VAE非常相似,都是在随机采样!马尔可夫链每一步的转移概率,本质上都是在加噪声。这就是扩散模型中“扩散”的由来:噪声在马尔可夫链演化的过程中,逐渐进入diffusion体系。

**物理扩散过程:**随着时间的推移,加入的噪声(加入的溶质)越来越少,而体系中的噪声(这个时刻前的所有溶质)逐渐在diffussion体系中扩散,直至均匀。

  • 扩散模型的本质基于马尔可夫链的前向过程,其每一个epoch的逆过程都可以近似为高斯分布。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcQHfeCO-1690185475258)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%209.png)]

前向过程通过马尔可夫链的转移概率不断加入噪音,从右边的采样数据到左边的标准高斯;

反向过程通过SDE来“抄袭”对应正向过程的那一个epoch的行为(其实每一步都不过是一个高斯分布),从而逐渐学习到对抗噪声的能力。高斯分布是一种很简单的分布,运算量小,这一点是diffusion快的最重要原因。

公式推导

前向过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J0fF4gqO-1690185475259)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%2010.png)]

任意时刻的 X t X_t Xt 可以由 X 0 X_0 X0 β \beta β 表示

  • 方差系数: 1 − β \sqrt{1-\beta} 1β ; 均值系数: β \beta β

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pqsk5A2C-1690185475260)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%2011.png)]

DDPM的每一步的推断可以总结为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pBDE7Qtj-1690185475260)(Diffusion%20Model%20f63a7539928247c8aec2be9d29737ab3/Untitled%2012.png)]

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

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

相关文章

Android Unit Test

一、测试基础知识 1.1 测试级别 测试金字塔(如图 2 所示)说明了应用应如何包含三类测试(即小型、中型和大型测试): 小型测试是指单元测试,用于验证应用的行为,一次验证一个类。 中型测试是指…

ROS中使用Kinect v2

ROS中使用Kinect v2 Kinect v2 简介 Kinect v2是微软公司推出的第二代Kinect深度摄像头,也称为Kinect for Xbox One或Kinect for Windows v2。它是Kinect系列产品的升级版本,于2013年首次发布。Kinect v2采用了一系列先进的传感器和技术,使其…

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型

【MATLAB第60期】【更新中】基于MATLAB的ARMAX具有外生回归因子的移动平均自回归模型 版本更新: 2023/7/29版本: 1.增加自定义参数,方便直接套数据运行。 pre_num3;%预采样数据个数 learn_pr0.85; %训练数据比例(不包括预采样数…

通讯录--集合动态的文件版

简易的通讯录往往需要朴实的“烹饪”就能完成一道“美味的佳肴”。 我们需要一个通讯录,能够存储联系人的信息,能够对联系人的信息进行增删查改,查询,按姓名排序。相比对之前的三子棋、扫雷,有了一定的了解&#xff0c…

一起学数据结构(2)——线性表及线性表顺序实现

目录 1. 什么是数据结构: 1.1 数据结构的研究内容: 1.2 数据结构的基本概念: 1.2.1 逻辑结构: 1.2.2 存储结构: 2. 线性表: 2.1 线性表的基本定义: 2.2 线性表的运用: 3 .线性…

【学会动态规划】打家劫舍 II(12)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

JavaScript学习 -- SM3算法基本原理

SM3算法是一种由国家密码管理局发布的哈希算法,被广泛用于数字签名和消息认证等应用中。在JavaScript中,我们可以使用第三方库来计算数据的SM3哈希值。本篇文章将介绍SM3算法的基本原理和相关技术,并提供一些实例来演示如何在JavaScript中使用…

深度剖析六大国产CPU

前言 CPU 是底层硬件基础设施中的核心,当前主流芯片架构为 ARM 和 X86,均为国外主导,芯片国产化率较低。“十五”期间,国家启动发展国产 CPU 的泰山计划,863 计划也提出自主研发 CPU。2006 年核高基专项启动&#xff…

阿里云服务器CPU处理器大全

阿里云服务器CPU型号是什么?处理器主频多少?云服务器ECS和轻量应用服务器CPU处理器性能如何?阿里云服务器网分享阿里云服务器CPU型号大全、处理器主频性能型号汇总: 目录 阿里云服务器CPU处理器大全 通用型云服务器CPU 计算型…

Redis系列:Redis 的事务机制

1 复习下何为事务机制? Transaction(事务)是计算机的特有术语,它一般指单个逻辑工作单位,由一系列的操作组合而成,在这些操作执行的时候,要么都执行成功,要么都不执行,防…

ENSP中路由器配置详解

目录 一:两个主机,两个路由器配置连接 二:两主机,三路由器配置连接 三:配置浮动路由 一:两个主机,两个路由器配置连接 打开ENSP 1.点击新建拓扑 2.点击路由器 3.将两个AR3260路由器拖出来…

ShardingSphere-Proxy读写分离详解与实战

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

基于springboot的公交线路查询系统vue

本次开发一套公交线路查询系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,公交线路管理,网站公告管理,友情链接管理,留言管理,系统管理。用户可以注册登录,查看公告线路…

java使用easyexcel读写文件

文章目录 前言一、引入pom二、write1.代码部分2.执行结果 三、read1.代码部分2.运行结果 总结 前言 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题…

掌握文件锁:使用flock实现多个进程之间的无缝文件同步

使用flock实现多个进程之间的无缝文件同步? 博主简介一、引言二、文件锁的概述2.1、定义文件锁2.2、文件锁的种类2.3、文件锁的作用 三、使用flock实现文件锁3.1、flock的简介3.2、flock的使用方法3.3、flock文件锁命令3.4、flock对文件同步的帮助 四、实现多个进程…

Sestra 实用教程(二)方程求解器

目 录 一、前言二、超单元分析三、惯性释放四、模态叠加法4.1 Eigenvalue solvers4.2 Static back substitution 五、模态综合法六、Master-Slave七、参考文献 一、前言 SESAM (Super Element Structure Analysis Module)是由挪威船级社(DNV-…

QMediaPlayer播放视频

简介 使用QT的QMediaPlayer类播放MP4格式的视频。 代码示例 头文件 Ui::MainWindow *ui; QMediaPlaylist *playlist; QMediaPlayer *player; QVideoWidget *videoWidget;方式一 应用窗体外播放视频。 .cpp文件 playlist new QMediaPlaylist;playlist->addMedia(QUrl(…

ShardingSphere-Proxy垂直分片详解与实战

🚀 ShardingSphere 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜&…

python:图片修改尺寸和裁剪

作者:CSDN @ _养乐多_ 本文记录了使用python语言的PIL库对jpg格式的图像进行修改尺寸,按指定像素间隔裁剪的代码。 文章目录 一、修改图片尺寸二、按照指定像素裁剪图片2.1 将小块保存在本地2.2 将小块以一定间隔生成新的图片原图: 一、修改图片尺寸 修改尺寸后, from PI…

c++学习(布隆过滤器)[23]

布隆 布隆过滤器(Bloom Filter)是一种概率型数据结构,用于判断一个元素是否可能存在于一个集合中。它使用多个哈希函数和位图来表示集合中的元素。 布隆过滤器的基本原理如下: 初始化:创建一个长度为m的位图&#xf…