Diffusion:通过扩散和逆扩散过程生成图像的生成式模型

news2025/2/26 13:49:17

在当今人工智能大火的时代,AIGC 可以帮助用户完成各种任务。作为 AIGC 主流模型的 DDPM,也时常在各种论文中被提起。DDPM 本质就是一种扩散模型,可以用来生成图片或者为图片去噪。

扩散模型定义了一个扩散的马尔科夫过程,每一步逐渐将随机噪声添加到数据中,然后通过学习逆扩散过程恢复数据以实现从噪声中构建所需的数据样本。

在这里插入图片描述

本文不再按照论文解读的方式逐段记录,并且略过其中繁杂的数学证明,只专注于介绍 diffusion 模型本身,主要基于 DDPM。本文参考 What are Diffusion Models?、扩散模型(Diffusion Model)——由浅入深的理解,更多参考资料如下:

  • 模型图解:十分钟读懂Diffusion:图解Diffusion扩散模型;
  • 模型总结:由浅入深了解Diffusion Model、AIGC爆火的背后——扩散模型DDPM浅析;
  • 公式推导:Diffusion扩散模型大白话讲解,看完还不懂?不可能!;
  • 源码解读:【深度学习模型】扩散模型(Diffusion Model)基本原理及代码讲解;
  • 领域现状:读了14篇论文,终于会拿捏Diffusion了、扩散模型(Diffusion Model)首篇综述-Diffusion Models: A Comprehensive Survey of Methods and Applications、扩散模型(Diffusion Model)最新综述!;

目录

  • 一. 背景
  • 二. Diffusion 模型
    • 1. 扩散过程
    • 2. 逆扩散过程
    • 3. 训练方法
  • 三. 图片生成
  • 四. 实验
  • 五. 总结

一. 背景

随着人工智能生成能力的不断进步,内容生产已经从用户生成内容 (UGC) 到专业生成内容 (PGC) ,再到人工智能生成内容 (AIGC, AI generated content)。从 AI 作画到 AI 视频等各种 AI 生成任务层出不穷,预示着 AIGC 时代已然拉开帷幕。

在这里插入图片描述

AIGC 主要依赖一些生成式模型,如 GAN、VAE、Flow-based model 等,但这些模型都有一些自身的局限性,难以稳定且高质量地完成 AIGC 的任务。现在 AIGC 的主流模型使用的基本都是 DDPM,这是一种经典的 扩散模型 (diffusion model)。扩散模型定义了一个扩散的马尔科夫过程,每一步逐渐将随机噪声添加到数据中,然后通过学习逆扩散过程恢复数据以实现从噪声中构建所需的数据样本。与 VAE 和流模型不同,扩散模型是通过固定程序学习的,并且隐变量都具有与原始数据相同的维度。

马尔科夫过程:指具有马尔科夫性质的随机过程,即下一个状态的发生仅依赖于当前状态,而与过去状态的序列无关。这一性质也被称为 “无记忆性” 或 “马尔科夫性”。具体来说,考虑一个随机过程,其状态在不同时间点可以取不同的值。如果这个过程满足马尔科夫性,那么给定当前时刻的状态,未来的状态只与当前状态有关,而与过去状态的历史路径无关。这种性质可以表示为:
P ( X n + 1 = x ∣ X n = x n , X n − 1 = x n − 1 , … , X 0 = x 0 ) = P ( X n + 1 = x ∣ X n = x n ) P(X_{n+1} = x | X_n = x_n, X_{n-1} = x_{n-1}, \ldots, X_0 = x_0) = P(X_{n+1} = x | X_n = x_n) P(Xn+1=xXn=xn,Xn1=xn1,,X0=x0)=P(Xn+1=xXn=xn)

其实生成式建模的扩散思想早在 2015 年就在 diffusion probabilistic models 1 中被提出,但直到 2019 年斯坦福大学发布的 noise-conditioned score network 2 和 2020 年 Google Brain 发布的 denoising diffusion probabilistic models 3 改进了模型方法,才引发了 diffusion 模型的热潮。目前,包括 OpenAI 的 GLIDE 和 DALL-E 2,海德堡大学的 Latent Diffusion 和 Google Brain 的 ImageGen,都基于 diffusion 模型。

二. Diffusion 模型

Diffusion 模型的灵感来自非平衡热力学,通过定义一个扩散步骤的马尔科夫链:缓慢地将具有高斯分布的随机噪声添加到数据中,原始图片随着噪声的不断加入最后变为一个纯噪声图片;然后学习优化逆扩散过程,最终实现从噪声中构建所需的数据样本,反向过程可以用来生成图片。
在这里插入图片描述

如图所示,diffusion 模型包括前向和反向两个过程,无论是前向过程还是反向过程都是一个参数化的马尔科夫链 (Markov chain):

  • 前向过程 (forward process):又称为 扩散过程,图中 x 0 → x T x_0 \rightarrow x_T x0xT 的过程,表示 对图片逐渐加噪
  • 反向过程 (reverse process):又称为 逆扩散过程,图中 x T → x 0 x_T \rightarrow x_0 xTx0 的过程,表示 对图片去噪复原,可以用来生成图像;

1. 扩散过程

如上文所说,扩散过程 x 0 → x T x_0 \rightarrow x_T x0xT 对图片逐渐加噪。 x 0 x_0 x0 是从真实数据集中采样得到的一张图片,对 x 0 x_0 x0 逐渐添加具有高斯分布的噪声,图片逐会变得模糊,当 T T T 足够大时, x T x_T xT 为标准正态分布。由于每次添加的噪声是已知的,即 q ( x t + 1 ∣ x t ) q (x_{t+1} \mid x_t) q(xt+1xt) 是已知的,因此可以根据马尔科夫过程的性质,递归得到 q ( x T ∣ x t ) q (x_{T} \mid x_t) q(xTxt)
在这里插入图片描述

此处不再赘述公式推导的过程,详见 What are Diffusion Models?、扩散模型(Diffusion Model)——由浅入深的理解、由浅入深了解Diffusion Model、AIGC爆火的背后——扩散模型DDPM浅析、Diffusion扩散模型大白话讲解,看完还不懂?不可能! 等。

2. 逆扩散过程

如上文所说,逆扩散过程 x T → x 0 x_T \rightarrow x_0 xTx0 对图片去噪复原来生成图像。由于扩散过程的 T T T 取足够大时, x T x_T xT 为标准正态分布,因此 要想生成图片可以直接从标准正态分布的图像逆扩散回去就可以得到想要的图像。于是问题的关键就是学习逆扩散过程。

逆扩散不像前向过程每一步是固定的,逆扩散很难从后一张图像中去噪得到前一张图像,即 q ( x t − 1 ∣ x t ) q (x_{t-1} \mid x_t) q(xt1xt) 是未知的。因此只能用 p Θ ( x t − 1 ∣ x t ) p_\Theta (x_{t-1} \mid x_t) pΘ(xt1xt) 来近似代替 q ( x t − 1 ∣ x t ) q (x_{t-1} \mid x_t) q(xt1xt),于是 逆扩散的学习过程就成了训练 p Θ ( x t − 1 ∣ x t ) p_\Theta (x_{t-1} \mid x_t) pΘ(xt1xt) 网络,文中称为 U-Net。
在这里插入图片描述

虽然 q ( x t − 1 ∣ x t ) q (x_{t-1} \mid x_t) q(xt1xt) 是未知的,但 q ( x t − 1 ∣ x 0 x t ) q (x_{t-1} \mid x_0x_t) q(xt1x0xt) 是可知的。因此我们可以用 q ( x t − 1 ∣ x 0 x t ) q (x_{t-1} \mid x_0x_t) q(xt1x0xt) 来指导 p Θ ( x t − 1 ∣ x t ) p_\Theta (x_{t-1} \mid x_t) pΘ(xt1xt) 进行训练。此处不赘述公式推导的过程。

3. 训练方法

Diffusion 的损失函数进行了大量的数学推导,此处概述为一句话:对 p Θ ( x t − 1 ∣ x t ) p_\Theta (x_{t-1} \mid x_t) pΘ(xt1xt) 的监督就是最小化 p Θ ( x t − 1 ∣ x t ) p_\Theta (x_{t-1} \mid x_t) pΘ(xt1xt) q ( x t − 1 ∣ x 0 x t ) q (x_{t-1} \mid x_0x_t) q(xt1x0xt) 的 KL 散度。
在这里插入图片描述

三. 图片生成

训练完 p Θ ( x t − 1 ∣ x t ) p_\Theta (x_{t-1} \mid x_t) pΘ(xt1xt) 后,就可以通过逆扩散过程生成图像:
在这里插入图片描述

四. 实验

详见 https://arxiv.org/pdf/2006.11239.pdf 。

网上有很多 DDPM 的实现代码,包括论文中基于 tensorflow 的实现,还有基于 pytorch 的实现,感兴趣的可以自行复现。

五. 总结

Diffusion 其实就是一个扩散和逆扩散的过程:先给一张图片逐步加噪声直到变成纯粹的噪声,然后再对噪声进行去噪得到真实的图片。所谓的扩散模型就是让神经网络学习这个去除噪声的方法。Diffusion 和其他模型最大的区别是它的隐空间特征数和原图是同尺寸大小的,当然后面也有基于压缩的 latent diffusion model 4

现在大火的最 GLIDE5、DALLE26、Imagen7,以及一系列的 Image Editing 方法,也都是基于 diffusion。


  1. Sohl-Dickstein J, Weiss E, Maheswaranathan N, et al. Deep unsupervised learning using nonequilibrium thermodynamics[C]//International conference on machine learning. PMLR, 2015: 2256-2265. ↩︎

  2. Song Y, Ermon S. Generative modeling by estimating gradients of the data distribution[J]. Advances in neural information processing systems, 2019, 32. ↩︎

  3. Ho J, Jain A, Abbeel P. Denoising diffusion probabilistic models[J]. Advances in neural information processing systems, 2020, 33: 6840-6851. ↩︎

  4. Rombach, Robin, et al. “High-Resolution Image Synthesis with Latent Diffusion Models.” arXiv preprint arXiv:2112.10752 (2021). ↩︎

  5. Nichol, Alex, et al. “Glide: Towards photorealistic image generation and editing with text-guided diffusion models.” arXiv preprint arXiv:2112.10741 (2021). ↩︎

  6. Ramesh, Aditya, et al. “Hierarchical text-conditional image generation with clip latents.” arXiv preprint arXiv:2204.06125 (2022). ↩︎

  7. Saharia, Chitwan, et al. “Photorealistic Text-to-Image Diffusion Models with Deep Language Understanding.” arXiv preprint arXiv:2205.11487 (2022). ↩︎

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

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

相关文章

删除排序链表的重复元素I和II,多种解法和思考

删除排序链表的重复元素I https://leetcode.cn/problems/remove-duplicates-from-sorted-list/description/ 一个循环就可以了,如果当前节点和下一个节点值一样,当前节点不移动让next后移动一个,如果不一样则当前节点后移。 一个循环就可以…

mysql8报sql_mode=only_full_group_by(存储过程一直报)

1:修改数据库配置(重启失效) select global.sql_mode;会打印如下信息 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION里面包含 ONLY_FULL_GROUP_BY,那么就重新设置,在数据库中输入以下代码,去掉ONLY_FULL_GROU…

水果编曲软件FL Studio21最新中文版本2023年最新FL 21中文版如何快速入门教程

水果编曲软件FL Studio介绍 各位,大家晚上好,今天给大家带来最新最新2023水果编曲软件FL Studio 21中文版下载安装激活图文教程。我们一起先了解一些FL Studio 。FL Studio21是目前流行广泛使用人数最多音乐编曲宿主制作DAW软件,这款软件相信…

PyQt基础_007_ 按钮类控件QCombox

import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class ComboxDemo(QWidget):def __init__(self, parentNone):super(ComboxDemo, self).__init__(parent)self.setWindowTitle("combox 例子") self.resize(300, 90) …

【智能算法】改进粒子群优化算法及对比分析

程序名称:改进粒子群优化算法及对比分析 实现平台:matlab 代码简介:基本粒子群算法(BPSO)中,每个优化问题的解都可以看作粒子在搜索空间中的位置,粒子通过飞行速度决定它们的搜索方向和搜索范围,粒子群通…

C语言基础--#if与#endif

目录 一、C语言中的 #if()和 #end if 用法 1. #if 表达式 程序段 #endif 形式 2. #ifdef标示符 标识符 #endif 形式 3. #if 0/ #if 1 #endif 形式 4. \可用于一行的结尾,表示本行与下一行连接起来 二、xTaskCreate函数 三、指针相关…

投资者要不要更换黄金代理?

有一些投资者会问,要不要更换自己的黄金代理?笔者认为,换代理这个问题有一些东西需要关注。因此,我们今天就来讨论一下投资者该不该更改代理?如果要换,新的代理如何选择? 其实很简单&#xff0c…

数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!

哈夫曼树 (Huffman Tree) 文章目录 哈夫曼树 (Huffman Tree)导论构造哈夫曼树语言描绘图形化理解 证明结论代码实现测试结果对照总结 导论 我们在学习哈夫曼树之前需要先了解 什么是哈夫曼树? 哈夫曼树 是一种最优树,是一类带权路径长度最短的二叉树,通过哈夫曼算法可以构建一…

虚幻学习笔记7—蓝图接口

一、前言 蓝图接口就是可以在蓝图中实现的接口,有它方便的地方,可以很方便的调用到实现了接口的函数。 二、实现 2.1、创建一个蓝图接口 1)可以添加多个函数。 2)函数在蓝图接口中只能规定输入和输出参数。 只有输入参数的可以…

Vue3生命周期函数(简述题)

1.图示 2.说明 3.补充 1.在vue3组合式API中,我们需要将生命周期函数先导入,然后才能使用。 import {onMounted} from vue2.beforeCreate和created被setup()方法所代替

Revit导出3D模型插件【GLTF|OBJ|DAE|STL|PLY|OFF|XYZ】

3dconvert_for_revit插件是NSDT 3DConvert工具集中的一种,可以快速将Revit模型导出为8种目标格式:GLTF、OBJ、GLB、DAE、STL、OFF、XYZ和PLY。 用户在进行格式转换之前,需要先下载安装对应Revit版本的插件。 NSDT在线工具推荐: T…

RabbitMQ消息模型之发布订阅Publish-Subscribe

发布订阅模型 Publish/Subscribe 发布订阅模型也称为广播模型,交换机类型需要指定为Fanout,正如从名称中猜到的那样,它是将接收到的所有消息广播到它知道的所有队列中。每个消费者都监听自己的队列,所以同一个消息,会…

多模块项目打包部署

目录结构 这些模块间相互依赖,打包的时候打父模块,就是带root的这个 先clean,再package,就跟一般的项目一样了。 有可能遇到报错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test&#xff…

[Java]JUC并发编程

JUC并发编程 一、什么是JUC 使用到 java.util 工具包、包、分类 二、线程和进程 进程:一个正在运行的程序,QQ.exe Music.exe 程序的集合; 一个进程往往可以包含多个线程,至少包含一个! Java默认有两个线程&#x…

微服务链路追踪组件SkyWalking实战

概述 微服务调用存在的问题 串联调用链路,快速定位问题;理清服务之间的依赖关系;微服务接口性能分析;业务流程调用处理顺序; 全链路追踪:对请求源头到底层服务的调用链路中间的所有环节进行监控。 链路…

短 URL 生成器设计:百亿短 URL 怎样做到无冲突?

Java全能学习面试指南:https://javaxiaobear.cn 我们先来看看,当高并发遇到海量数据处理时的架构。在社交媒体上,人们经常需要分享一些 URL,但是有些 URL 可能会很长,比如: https://time.geekbang.org/hyb…

C#图像处理OpenCV开发指南(CVStar,03)——基于.NET 6的图像处理桌面程序开发实践第一步

1 Visual Studio 2022 开发基于.NET 6的OpenCV桌面程序 1.1 为什么选择.NET 6开发桌面应用? 选择 .NET 6(最早称为 .NET Core)而非 Frameworks.NET 的理由是:(1)跨平台;已经支持Windows,Linux…

PyQt基础_008_ 按钮类控件QSpinbox

基本操作 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class spindemo(QWidget):def __init__(self, parentNone):super(spindemo, self).__init__(parent)self.setWindowTitle("SpinBox 例子")self.resize(300,…

错误 LNK2001 无法解析的外部符号 __imp__CrtDbgReport

”属性“ -->”设置“ --> ”c“ – > ”代码生成“ --> ”运行库“ ,将 ”多线程(MT)“ 改为 ”多线程(MTD)“。

JavaScript包装类型

前端面试大全JavaScript包装类型 🌟经典真题 🌟包装类型 🌟真题解答 🌟总结 🌟经典真题 是否了解 JavaScript 中的包装类型? 🌟包装类型 在 ES 中,数据的分类分为基本数据类型…