一文详解扩散模型

2024-06-20 05:04
文章标签 详解 模型 一文 扩散

本文主要是介绍一文详解扩散模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1、常见的生成模型
    • 2、变分推断简介
    • 3、文生图的评价指标
    • 4、Diffusion Models
    • 5、其他
    • 技术交流群
    • 精选

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。

针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。

合集:

《大模型面试宝典》(2024版) 正式发布!
《AIGC 面试宝典》已圈粉无数!


1、常见的生成模型

如图1所示,常见的生成模型有四种:GAN(Generative Adversarial Network)、VAE(Variational Autoencoder)、Flow-Based Models、Diffusion Models。
今天我们讲一讲扩散模型(DM,Diffusion Models)的原理。

DM和VAE一样,都是属于变分推断(VI,Variational Inference)的理论框架。
在这里插入图片描述

2、变分推断简介

2.1、统计学简介

在统计学中,一切都是分布(Distribution),到处都是分布。

统计学的根本目的就是获得数据分布。 只要得到了数据的分布,那一切问题都迎刃而解。

但现实数据的分布往往是不可得的,是极其复杂的,所以统计学在应用中到处充满假设:假设样本服从独立同分布原理;假设噪声服从高斯分布;假设特征之间相互独立等。翻开机器学习或者数理统计的书籍,到处充满着假设。没办法,现实问题太复杂!

如何获得复杂的未知分布呢? 最常用的方法就贝叶斯推断。

2.2、贝叶斯推断

贝叶斯推断的目的就是:找出复杂的未知分布。

贝叶斯推断有两类方法:一是MCMC采样;二是变分推断(VI,Variational Inference)。如图2所示。

MCMC属于采样的方法,成本高。变分推断属于数学优化的方法,成本相对较对低。
在这里插入图片描述

3、文生图的评价指标

文生图领域有两个评价指标:FID和CLIP。

3.1、FID

FID:Frechet Inception Distance。 用一个训练过的CNN网络提取图片的隐层特征,分别得到两个隐层特征的集合。一个是真实图片的隐层特征集合,一个是生成图片的隐层特征集合。再把这两个集合看作分布,计算两个分布的距离。

FID值越小越好。 如图3所示。

在这里插入图片描述

3.2、CLIP

CLIP:Contrastive Language-Image Pretraining。

一个预训练的图文对模型。基于4亿个图文对进行了对比学习。

CLIP得分越大越好。

3.3、优缺点

FID的评价很准确,但需要大量的数据,才能进行评估。

CLIP可以对单张图片进行评价,但只适用于图文对的场景。

4、Diffusion Models

4.1、Diffusion-生成过程

Diffusion生成目标对象的过程,称为生成过程、去噪过程、后向过程等。Diffusion的生成过程从噪声开始。本文都以图片生成为例。

首先, 从标准高斯分布中采样得到一张全是噪声的图片XT。

然后, 从XT 中去掉一点噪声,得到一张噪声更少的图片XT-1。**如此重复T步,**最后直到X1就是一张生成的图片。

意大利著名的雕塑家米开朗基罗说过:“塑像本来就在石头里,我只是把不需要的部分去掉。” Diffusion的生成过程与此类似,图片本来就在噪声里,Diffusion模型只是把不需要的噪声去掉,让图片显露出来!

如图5所示:

在这里插入图片描述

图5 Diffusion 去噪过程

4.2、Diffusion-扩散过程

Diffusion的扩散过程,也称为前向过程、加噪过程。 如图6所示。

扩散过程为模型的训练提供了有标注的样本。前面说过,生成过程是从噪声中逐步去噪声,最后生成图片。那模型怎么知道该去什么样的噪声,去多少噪声呢?这就是扩散过程的作用。扩散过程往已知的图片中逐步加入噪声,直到图片完全变成标准高斯噪声。这个加噪声的过程是人为控制的,所加的噪声也是知道的,所以反过来就用这个噪声作为标准,指导模型去噪,这相当于是一个有监督的学习过程。

总之,扩散过程是一个事先预定义的确定过程,用来给生成过程提供有监督的样本。

在这里插入图片描述

图6 Diffusion Model 加噪过程

4.3、Diffusion-模型训练

模型训练如图7所示。训练的神经网络是一个噪声预测器(Noise Predicter)。

Noise Predicter输入有两个:一是带噪声的图片;二是当前的步数。在Conditional的场景下,还会输入生成条件。

Noise Predicter的输出为:当前图片中所包含的噪声大小。

训练的优化目标为:预测出来的噪声与扩散过程中所加入的真实噪声之间的均方误差MSE(Mean-Square Error)。

4.4、Diffusion-模型推理

模型推理,就是生成数据的过程。确切的生成算法如图8所示。

Algorithm2来源于论文DDPM-《Denoising Diffusion Probabilistic Models》。

DDPM的主要问题是效率低下,因为必须要经过T步,才能生成最终图片。

从图中可以看出,Noise Predicter预测出图片的噪声后,用Xt减去噪声,就得到了去噪后的图片。

但去噪声后,又给图片加上了一点高斯噪声。这是为什么呢?通常认为这是算法落地中的一个Trick。在机器学习中,这种Trick很常见,如dropout。这样通常能增加模型的泛化性。另一种解释是,Diffusion整体上是一个自回归Autoregressive过程,与GPT类似。在AR模型中,每一步都喜欢加一点随机性,如GPT中常用的BeamSearch。

4.5、三种解释

Diffusion Models是一个马尔可夫层次化变分自编码器(Markovian Hierarchical Variational Autoencoder)。

在这里插入图片描述

优化EBLO等价于优化以下任意一种目标函数:

1. 优化对原始数据x0的预测结果;—在Discrete Diffusion Models会用到;

2 优化对原始噪声的预测结果;—连续Diffusion Models中最常用;

3. 优化对分数函数的预测结果;—基于热力学能量函数的推导时用到。

4.7、Diffusion-Conditional

前面讨论的是论文DDPM中原生的Diffusion Models。但实践使用时,我们是要根据条件来生成目标数据。如文生图,需要根据给定的文本来生成目标图片。

从原理上来看,根据给定的条件生成数据,和原生的DDPM是完全一样的。只是拟合目标由后验概率分布转化为条件后验概率分布。这两者的理论推导是完全相同的。

在实现上,Noise Predicter的输入中增加了一个条件项,如输入的文本。当然这个条件项往往是其它模态的,需要进行Embedding才能输入到Noise Predicter的神经网络里面。

5、其他

5.1

DDPM的改进

DDPM最大的问题就是它的生成过程速度慢,效率低。需要一步一步地进行Denoising。为此,论文DDIM(Denosing Diffusion Implicit Models)对它进行了改进。

DDPM通常需要1000步来生成一张图片,但DDIM通过只需要5-20步即可。当然DDIM的图片质量略差于DDPM。

5.2

离散场景

图片是一种典型的连续场景,因为每个像素的取值在给定的范围(如0-1)之间可以随便选取。但还有很多离散的场景,如Text、Graph等。在离散场景中如何使用Diffusion Models呢?这还是一个新兴的研究方向,常用的做法是改变噪声的形式。

在这里插入图片描述

图12 Diffusion + Text

5.3

Stable Diffusion

Stable Diffusion是对原生Diffusion的一种改动。Stable Diffusion原来叫 Latent Diffusion Models。它与Diffusion的最大区别是噪声加在隐状态空间。

Diffusion的噪声与图片是相同尺寸的,它的加噪声和去噪声直接发生在原始数据上。Stable Diffusion会使用一个编码器,先把图片映射到一个低维的隐状态空间中,再在这个隐空间中对图片的Embedding进行加噪声和去噪声。因为隐状态空间的维度低,所以Stable Diffusion的速度比原生的Diffusion更快。但二者的理论基础是相同的!

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了算法岗技术与面试交流群, 想要大模型技术交流、了解最新面试动态的、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

想加入星球也可以如下方式:

方式①、微信搜索公众号:机器学习社区,后台回复:交流
方式②、添加微信号:mlc2040,备注:交流

精选

  • 轻松构建聊天机器人,大模型 RAG 有了更强大的AI检索器
  • 一文搞懂大模型训练加速框架 DeepSpeed 的使用方法!
  • 保姆级学习指南:《Pytorch 实战宝典》来了
  • MoE 大模型的前世今生
  • 从零解读 SAM(Segment Anything Model)
  • AI 绘画爆火背后:扩散模型原理及实现
  • 从零开始构建和训练生成对抗网络(GAN)模型
  • CLIP/LLaVA/LLaVA1.5/VILA 模型全面梳理!
  • 从零开始创建一个小规模的稳定扩散模型!
  • Stable Diffusion 模型:LDM、SD 1.0, 1.5, 2.0、SDXL、SDXL-Turbo 等
  • 文生图模型:AE、VAE、VQ-VAE、VQ-GAN、DALL-E 等 8 模型
  • 一文搞懂 BERT(基于Transformer的双向编码器)
  • 一文搞懂 GPT(Generative Pre-trained Transformer)
  • 一文搞懂 ViT(Vision Transformer)
  • 一文搞懂 Transformer
  • 一文搞懂 Attention(注意力)机制
  • 一文搞懂 Self-Attention 和 Multi-Head Attention
  • 一文搞懂 Embedding(嵌入)
  • 一文搞懂 Encoder-Decoder(编码器-解码器)

Reference

1. What are Diffusion Models:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

2. DDPM:Denoising Diffusion Probabilistic Models:https://arxiv.org/abs/2006.11239

3. Understanding Diffusion Models – A Unified Perspective:https://arxiv.org/pdf/2208.11970.pdf

4. Hungyi Lee 《Diffusion Models》

5. 一文读懂DDIM凭什么可以加速DDPM的采样效率:https://zhuanlan.zhihu.com/p/627616358

这篇关于一文详解扩散模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class