极市平台 | 如何通俗理解扩散模型?

news2024/11/24 12:09:47

本文来源公众号“极市平台”,仅用于学术分享,侵权删,干货满满。

原文链接:如何通俗理解扩散模型?

极市导读

还有谁没有看过diffusion的工作,席卷AI圈的diffusion到底是什么?本文作者用尽量通俗的描述向大家解释 diffusion 的来龙去脉。

实验室最近人人都在做扩散,从连续到离散,从 CV 到 NLP,基本上都被 diffusion 洗了一遍。但是观察发现,里面的数学基础并不是模型应用的必须。其实大部分的研究者都不需要理解扩散模型的数学本质,更需要的是对扩散模型的原理的经验化理解,从而应用到 research 里面去。笔者做 VAE 和 diffussion 也有一段时间了,就在这里通俗地解释一下 diffusion 的来龙去脉。

Variational AutoEncoder (VAE)

要讲扩散模型,不得不提 VAE。VAE 和 GAN 一样,都是从隐变量 Z 生成目标数据 X 。它们假设隐变量服从某种常见的概率分布(比如正态分布),然后希望训练一个模型 X = g(Z) ,这个模型将原来的概率分布映射到训练集的概率分布,也就是分布的变换。注意,VAE 和 GAN 的本质都是概率分布的映射。大致思路如下图所示:

图片来源:https://zhuanlan.zhihu.com/p/34998569

换句话说,大致意思就是先用某种分布随机生成一组隐变量,然后这个隐变量会经过一个生成器生成一组目标数据。VAE 和 GAN 都希望这组数据的分布  和目标分布 X 尽量接近。

是不是听上去很 work?但是这种方法本质上是难以 work 的,因为“尽量接近”并没有一个确定的关于 XXX 和 X^\hat{X}\hat{X} 的相似度的评判标准。换句话说,这种方法的难度就在于,必须去猜测“它们的分布相等吗”这个问题,而缺少真正 interpretable 的价值判断。有聪明的同学会问,KL 散度不就够了吗?不行,因为 KL 散度是针对两个已知的概率分布求相似度的,而  和 XXX 的概率分布目前都是未知。

GAN 的做法就是直接把这个度量标准也学过来就行,相当生猛。但是这样做的问题在于依然不 interpretable,非常不优雅。VAE 的做法就优雅很多了,我们先来看 VAE 是怎么做的,理解了 VAE 以后再去理解 Diffussion 就很自然了。

到底什么是生成模型?

VAE 的核心

仔细理解的时候有没有发现一个问题? 为什么在文章最开头, 我们强调了没法直接比较 X 和 X_k 的分布, 而在这里, 我们认为可以直接比较这俩? 注意, 这里的 X_k 是专属于 (针对于) X_k 的隐变量, 那么和 X_k 本身就有对应关系,因此右边的蓝色方框内的“生成器”, 是一一对应的生成。

另外,大家可以看到,均值和方差的计算本质上都是 encoder。也就是说,VAE 其实利用了两个 encoder 去分别学习均值和方差。

VAE 的 Variational 到底是个啥

VAE 的本质

现在我们来回顾一下 VAE 到底做了啥。VAE 在 AE 的基础上对均值的 encoder 添加高斯噪声(正态分布的随机采样),使得 decoder(就是右边那个生成器)有噪声鲁棒性;为了防止噪声消失,将所有 p(Z | X) 趋近于标准正态分布,将 encoder 的均值尽量降为 0,而将方差尽量保持住。这样一来,当 decoder 训练的不好的时候,整个体系就可以降低噪声;当 decoder 逐渐拟合的时候,就会增加噪声。

本质上,是不是和 GAN 很像?!要我命名,我也可以叫 VAE 是生成对抗 encoder(手动滑稽

Diffusion Model(扩散模型,DM)

好了,到此为止,你已经理解了扩散模型的所有基础。现在我们来站在 VAE 的基础上讲讲扩散模型。目前的教程实在是太数学了,其实可以用更加通俗的语言讲清楚。从本质上说,Diffusion 就是 VAE 的升级版。

现在回过头来看看 GAN 做了啥。前面也提到过,GAN 其实就是简单粗暴,没有任何 encoder,直接训练生成器,唯一的难度在于判别器(就是下图这个“它们的分布相等吗”的东西)不好做。

好了,聪明的你也已经知道我要说什么了。Diffusion 本质就是借鉴了 GAN 这种训练目标单一的思路和 VAE 这种不需要判别器的隐变量变分的思路,糅合一下,发现还真 work 了……下面让我们来看看到底是怎么糅合的。为什么我们糅合甚至还没传统方法好,大佬糅合揉出个 diffusion?

Diffusion 的核心

知道你们都懒得划上去,我再放一下 VAE 的图。

前面也已经提到,VAE 的最大问题是这个变分后验。在 VAE 中,我们先定义了右边蓝色的生成器 X=g(Z),再学一个变分后验 p(X | Z) 来适配这个生成器。能不能反一下,先定义一个变分后验再学一个生成器呢?

如果你仔细看了上面的 VAE 部分,我相信你已经有思路了。VAE 的生成器,是将标准高斯映射到数据样本(自己定义的)。VAE 的后验分布,是将数据样本映射到标准高斯(学出来的)。那反过来,我想要设计一种方法 A,使得 A 用一种简单的“变分后验”将数据样本映射到标准高斯(自己定义的),并且使得 A 的生成器,将标准高斯映射到数据样本(学出来的)。注意,因为生成器的搜索空间大于变分后验,VAE 的效率远不及 A 方法:因为 A 方法是学一个生成器(搜索空间大),所以可以直接模仿这个“变分后验”的每一小步

好,现在我告诉你,这个 A 方法就是扩散模型(Diffusion Model)的核心思路:定义一个类似于“变分后验”的从数据样本到高斯分布的映射,然后学一个生成器,这个生成器模仿我们定义的这个映射的每一小步

Diffusion Model 的 Diffusion 到底是个啥

接触 diffusion 的你肯定知道马尔可夫链!这东西不仅 diffusion 里面有,各种怪异的算法里面也都出现了。为什么用它?因为它的一个关键性质:平稳性。一个概率分布如果随时间变化,那么在马尔可夫链的作用下,它一定会趋于某种平稳分布(例如高斯分布)。只要终止时间足够长,概率分布就会趋近于这个平稳分布。

这个逐渐逼近的过程被作者称为前向过程(forward process)。注意,这个过程的本质还是加噪声! 试想一下为什么……其实和 VAE 非常相似,都是在随机采样!马尔可夫链每一步的转移概率,本质上都是在加噪声。这就是扩散模型中“扩散”的由来:噪声在马尔可夫链演化的过程中,逐渐进入 diffusion 体系。随着时间的推移,加入的噪声(加入的溶质)越来越少,而体系中的噪声(这个时刻前的所有溶质)逐渐在 diffussion 体系中扩散,直至均匀。看看下面的图,你应该就恍然大悟了:

现在想想,为什么要用马尔可夫链。我们把问题详细地重述一下:为什么我们创造一个稳定分布为高斯分布的马尔可夫链,对于生成器模仿我们定义的某个映射的每一小步有帮助呢?这里你肯定想不出来,不然你也能发明 diffusion model ——答案是,基于马尔可夫链的前向过程,其每一个 epoch 的逆过程都可以近似为高斯分布。

懵了吧,我也懵了。真正的推导发了好几篇 paper,都是些数学巨佬的工作,不得不感叹基础科学的力量……相关工作主要用的是 SDE(随机微分方程),我们在这里不做深入,但是需要理解大致的思路,如下图所示。

图源:https://www.zhihu.com/question/536012286/answer/2533146567

下面的是前向过程,上面的是反向过程。前向过程通过马尔可夫链的转移概率不断加入噪音,从右边的采样数据到左边的标准高斯;反向过程通过 SDE 来“抄袭”对应正向过程的那一个 epoch 的行为(其实每一步都不过是一个高斯分布),从而逐渐学习到对抗噪声的能力。高斯分布是一种很简单的分布,运算量小,这一点是 diffusion 快的最重要原因。

Diffusion 的本质

现在回头看看 diffusion 到底做了个啥工作。我们着重看一下下图的 VAE 和 diffussion 的区别:

图源:https://zhuanlan.zhihu.com/p/525106459

可以很清晰的认识到,VAE 本质是一个基于梯度的 encoder-decoder 架构,encoder 用来学高斯分布的均值和方差,decoder 用变分后验来学习生成能力,而将标准高斯映射到数据样本是自己定义的。而扩散模型本质是一个 SDE/Markov 架构,虽然也借鉴了神经网络的前向传播/反向传播概念,但是并不基于可微的梯度,属于数学层面上的创新。两者都定义了高斯分布 Z 作为隐变量,但是 VAE 将 Z 作为先验条件(变分先验),而 diffusion 将 Z 作为类似于变分后验的马尔可夫链的平稳分布。

想要更深入的理解?

如评论区指出的,文章的定位本身就是让读者读懂 diffusion 而非对 diffusion 框架本身进行数学创新,是应用向而非结构向的,大佬们如果希望看到更深入的分析可以追更和评论区催更~

参考资料

https://zhuanlan.zhihu.com/p/34998569

https://www.zhihu.com/question/536012286/answer/2533146567

https://zhuanlan.zhihu.com/p/525106459

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

tcpdump快速入门及实践手册

tcpdump快速入门及实践手册 1. 快速入门 [1]. 基本用法 基本用法: tcpdump [选项 参数] [过滤器 参数] [rootkysrv1 pwe]# tcpdump -h tcpdump version 4.9.3 libpcap version 1.9.1 (with TPACKET_V3) OpenSSL 1.1.1f 31 Mar 2020 Usage: tcpdump [-aAbdDefhH…

Python爬虫使用实例

IDE:大部分是在PyCharm上面写的 解释器装的多 → 环境错乱 → error:没有配置,no model 爬虫可以做什么? 下载数据【文本/二进制数据(视频、音频、图片)】、自动化脚本【自动抢票、答题、采数据、评论、点…

3.2 实体-关系模型(ER模型)

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

Keycloak中授权的实现-转载

在Keycloak中实现授权,首先需要了解与授权相关的一些概念。授权,简单地说就是某个(些)用户或者某个(些)用户组(Policy),是否具有对某个资源(Resource&#xf…

基于SpringBoot的餐饮订单系统-计算机毕业设计源码39867

摘 要 随着现代生活节奏的加快和人们对便捷餐饮服务的需求不断增长,基于Spring Boot的餐饮订单系统的设计与实现成为当前研究的关键课题。本研究旨在开发一款包括首页、通知公告、餐饮资讯、餐饮菜单、商城管理等功能模块的系统,旨在提供便捷高效的餐饮订…

了解一下内测系统

内测系统是什么? 在软件或应用程序开发的过程中,供开发人员进行测试和调试的系统。 内测系统的作用是什么? 达到让用户使用游戏或者软件的时候体验感更好、减少风险、方便开发者更好的找到并解决自己软件中的问题。测试好后的app可以将自己的…

C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例

什么是CPPCMS? CppCMS 是一个高性能的 C Web 开发框架,专为构建快速、动态的网页应用而设计,特别适合高并发和低延迟的场景。其设计理念类似于 Python 的 Django 或 Ruby on Rails,但针对 C 提供了更细粒度的控制和更高效的性能。…

Linux--传输层协议UDP

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号(Well-Know Port Number) 两个问题 UDP 协议 UDP 协议端格式 UDP 的特点 面向数据报 UDP 的缓冲区 UDP 使用注意事项 基于 UDP 的应用层协议 进一步理解UDP协议 传输层 负责数据能够从发送端传输接收端. 再谈…

STM32F407ZET6使用LCD(9341)

1.原理图 屏幕是中景园2.8寸液晶屏,9341驱动不带触摸屏版本 2.STM32CUBEMX配置 3.编写驱动程序

【全国大学生电子设计竞赛】2021年K题

🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~

02 网络编程-UDP用户数据包协议

目录 一、UDP简介 二、UDP协议的通信流程 三、UDP相关API接口 (1)创建套接字-socket() (2)地址信息结构体sockaddr_in{} (3)地址转换接口 (4)发送消息sendto() (…

谁偷偷看了你的网站?这两款统计工具告诉你!小白易上手~

前两天,上线了一个知识库网站:花了一天时间,搭了个专属知识库,终于上线了,手把手教,不信你学不会。 想知道这个网站的流量如何,怎么搞? 网站流量统计分析工具,了解下&a…

EmguCV学习笔记 C# 2.2 Matrix类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV学习笔记目录 Vb.net EmguCV学习笔记目录 C# 笔者的博客网址:VB.Net-CSDN博客 教程相关说明以及如何获得pdf教…

全面解析Gerapy分布式部署:从环境搭建到定时任务,避开Crawlab的坑

Gerapy分布式部署 搭建远程服务器的环境 装好带docker服务的系统 Docker:容器可生成镜像,也可拉去镜像生成容器 示例:将一个环境打包上传到云端(远程服务器),其他8个服务器需要这个环境直接向云端拉取镜像生成容器,进而使用该环境,比如有MYS…

ElasticSearch读写性能调优

文章目录 ES写入数据过程ES读取数据的过程写数据底层原理提升集群读取性能数据建模优化分片 提升写入性能的方法服务器端优化写入性能建模时的优化降低Translog写磁盘的频率,但是会降低容灾能力分片设定调整Bulk 线程池和队列 ES写入数据过程 客户端选择一个node发…

Linux系统编程:进程间通信 1:管道

1.进程间的互相通信的方式 进程间互相通信的方式共有7种: (1)无名管道(同主机) (2)有名管道(同主机) (3)信号(同主机)…

大语言模型(LLM)构建产品的一年经验总结【干货长文】

这是一份涵盖战术、运营和战略方面的大语言模型产品成功建设的实用指南。 现在是构建大型语言模型(LLM)的激动人心的时刻。在过去的一年里,LLM已经变得足够好,可以用于实际应用。而且它们每年都在变得更好更便宜。伴随着社交媒体上…

成功转行软件测试工程师,年薪30W+,经验总结都在这!

这是给转行做软件测试的小白的参考,无论是从零开始,或者是转行的朋友来说,这都是值得一看的,也是可以作为一种借鉴吧。 而且我决定转行IT(互联网)行业,其实理由也很简单,不用动体力…

全网爆火的从零到一落地接口自动化测试

前段时间写了一系列自动化测试相关的文章,当然更多的是方法和解决问题的思路角度去阐述我的一些观点。结合我自己实践自动化测试的一些经验以及个人理解,这篇文章来聊聊新手如何从零到一落地实践接口自动化测试。 为什么要做接口测试 测试理念的演变 早…

awesome-react-native 收集最好的React Native库,工具,教程,文章(上篇)

image 分类 分类 会议 连锁反应 - 波特兰,或者美国React Native EU - 弗罗茨瓦夫,波兰React Alicante - 西班牙阿利坎特ReactNext - 以色列特拉维夫React Berlin - 柏林,德国 用品 参考HOWTO文档什持续集成内幕 组件 UI 导航 导航/路由文章…