【前沿技术】扩散模型是什么

0. 前言

        扩散模型的灵感来自非平衡热力学。他们定义了一个马尔可夫扩散步骤链,以缓慢地将随机噪声添加到数据中然后学习逆转扩散过程以从噪声中构建所需的数据样本。与VAE或流动模型不同,扩散模型是通过固定程序学习的,并且潜在变量具有高维数(与原始数据相同)。

图一. 不同类型的生成模型概述

1. 前向扩散过程

给定一个从真实数据分布\mathbf{x}_{0}\sim q\mathbf{(x)}中采样的点,让我们定义一个前向扩散过程,在这个过程中,我们分\mathbf{T}步向样本中添加少量的高斯噪声,产生一系列噪声样本\mathbf{x_{1},...,\mathbf{x_{T}}}。步长由方差表\{\beta_{t}\in (0,1)\}_{t=1}^T表示。

 

 随着步长t变大,数据样本\mathbf{x_{0}}会逐渐失去其可区分的特征。最终,当\mathbf{T}\rightarrow \propto\mathbf{x_{T}}等价于各向同性高斯分布。

 图 2.通过缓慢添加(去除)噪声来生成样本的正向(反向)扩散过程的马尔可夫链。(图片来源:Ho et al. 2020)

上述过程的一个很好的特性是,我们可以使用重新参数化技巧以封闭形式在任何任意时间步t长进行采样 \mathbf{x_{t}}。让\alpha_{t}=1-\beta_{t}\bar{\alpha_{t}}=\prod^{t}_{i=1}\alpha_{i}:

\begin{aligned} \mathbf{x}_t &= \sqrt{\alpha_t}\mathbf{x}_{t-1} + \sqrt{1 - \alpha_t}\boldsymbol{\epsilon}_{t-1} & \text{ ;where } \boldsymbol{\epsilon}_{t-1}, \boldsymbol{\epsilon}_{t-2}, \dots \sim \mathcal{N}(\mathbf{0}, \mathbf{I}) \\ &= \sqrt{\alpha_t \alpha_{t-1}} \mathbf{x}_{t-2} + \sqrt{1 - \alpha_t \alpha_{t-1}} \bar{\boldsymbol{\epsilon}}_{t-2} & \text{ ;where } \bar{\boldsymbol{\epsilon}}_{t-2} \text{ merges two Gaussians (*).} \\ &= \dots \\ &= \sqrt{\bar{\alpha}_t}\mathbf{x}_0 + \sqrt{1 - \bar{\alpha}_t}\boldsymbol{\epsilon} \\ q(\mathbf{x}_t \vert \mathbf{x}_0) &= \mathcal{N}(\mathbf{x}_t; \sqrt{\bar{\alpha}_t} \mathbf{x}_0, (1 - \bar{\alpha}_t)\mathbf{I}) \end{aligned}

 (*)回想一下,当我们合并两个具有不同方差的高斯分布时,\mathbf{N(0,\sigma^2_{1}I)}\mathbf{N(0,\sigma^2_{2}I)},新分布是

\mathbf{N(0,(\sigma^2_{1}+\sigma^2_{2})I)}。这里合并的标准差是\sqrt{(1-\alpha_{t})+\alpha_{t}(1-\alpha_{t-1})}=\sqrt{1-\alpha_{t}\alpha_{t-1}}

通常,当样本变得更嘈杂时,我们可以承受更大的更新步骤,因此 \beta_{1}<\beta_{2}<\cdots <\beta_{T},\bar{\alpha_{1}}>\cdots>\bar{\alpha_{T}}

2. 逆向扩散过程

如果我们能反转上述过程并从中q(\mathbf{x_{t-1}\vert\mathbf{x_{t}}})采样,我们能够从高斯噪声输入中重建真实样本。\mathbf{x_{T}\sim N(0,I)}请注意,如果\beta_{t}足够小,q(\mathbf{x_{t-1}\vert\mathbf{x_t}})也将是高斯的。不幸的是,我们不能轻易估计q(\mathbf{x_{t-1}\vert\mathbf{x_t}}),因为它需要使用整个数据集,因此我们需要学习一个模型p_{\theta}来近似这些条件概率,以便运行反向扩散过程。

p_\theta(\mathbf{x}_{0:T}) = p(\mathbf{x}_T) \prod^T_{t=1} p_\theta(\mathbf{x}_{t-1} \vert \mathbf{x}_t)\\ \quad p_\theta(\mathbf{x}_{t-1} \vert \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \boldsymbol{\mu}_\theta(\mathbf{x}_t, t), \boldsymbol{\Sigma}_\theta(\mathbf{x}_t, t))

在数学中,闭式表达式是使用有限数量的标准运算的数学表达式。这可能包括常量、变量、某些众所周知的运算(例如 + − × ÷)和函数(例如 n 次方根、指数、对数、三角函数、反双曲函数),但通常不包括极限或积分。

3. 扩散模型的训练

  • 正向扩散→在图像中添加噪声。
  • 反向扩散过程→去除图像中的噪声。

前向扩散过程逐步将高斯噪声添加到输入图像中。尽管如此,使用以下封闭式公式可以更快地完成,以直接获取特定时间步长 t 的噪声图像: 

x_{t}=\sqrt{\bar{\alpha_{t}}}x_{0}+\sqrt{1-\bar{\alpha_{t}}}\varepsilon

反向扩散过程不可直接计算,我们训练神经网络\varepsilon_{\theta}来逼近它。

训练目标损失函数如下:

x_{t}=\sqrt{\bar{\alpha_{t}}}x_{0}+\sqrt{1-\bar{\alpha_{t}}}\varepsilon 

 L_{simple}=E_{t,x_{0},\varepsilon}[||\mathbf{\varepsilon-\varepsilon_{\theta}(x_{t,t})}||^{2}]

 Training 训练

在每一轮训练中

1.将为每个训练样本(图像)选择一个随机的时间步长t。

2.将高斯噪声(对应于t)应用于每个图像。

3.将时间步长转换为嵌入(向量)。

每一个训练步骤: 

Sampling(采样)

采样是指从高斯噪声中绘制图像。下图显示了如何使用经过训练的 U-Net 来生成图像:

Diffusion Speed Problem (扩散速度问题)

如您所见,扩散(采样)过程迭代地将全尺寸图像馈送到 U-Net 以获得最终结果。这使得纯扩散模型在总扩散步数 T 和图像尺寸较大时非常慢。

因此,Stable Diffusion 旨在解决这个问题。

Stable Diffusion(稳定扩散)

稳定扩散的原名是“潜在扩散模型”(LDM)。顾名思义,扩散过程发生在潜在空间中。这就是它比纯扩散模型更快的原因。

Departure to Latent Space

 我们将首先训练一个自动编码器来学习将图像数据压缩为低维表示。

  •  通过使用经过训练的编码器 E,我们可以将全尺寸图像编码为低维潜在数据(压缩数据)。
  • 通过使用经过训练的解码器 D,我们可以将潜在数据解码回图像。

Latent Diffusion (潜伏扩散)

将图像编码为潜在数据后,将在潜在空间中完成前向和反向扩散过程。

 前向扩散过程→向添加噪声。

 反向扩散过程→去除中的噪声。

Conditioning(条件嵌入)

Stable Diffusion 模型的真正强大之处在于它可以从文本提示生成图像。这是通过修改内部扩散模型以接受条件输入来完成的。

 通过交叉注意力机制增强其去噪U-Net,将内扩散模型转变为条件图像生成器。

上图中的开关用于控制不同类型的调节输入:

对于文本输入,首先使用语言模型τθ(例如BERT,CLIP)将它们转换为嵌入(向量),然后通过(多头)注意力(Q,K,V)层将它们映射到U-Net中。

对于其他空间对齐的输入(例如语义图、图像、修复),可以使用串联来完成调节。

Training(训练)

训练目标(损失函数)与纯扩散模型中的目标非常相似。唯一的变化是:

  •  输入潜在数据z_{t}而不是图像 x_{t}
  • 向 U-Net 添加了调节输入 \tau_{\theta}(y)

Sampling(采样)

 由于潜在数据的大小比原始图像小得多,因此去噪过程会快得多。

 Architecture Comparison(架构比较)

Pure Diffusion Model(纯扩散模型)

Stable Diffusion (Latent Diffusion Model)
稳定扩散(潜伏扩散模型)

总结:

  • 扩散模型分为正向扩散和反向扩散两部分。
  • 正扩散可以用封闭形式的公式计算。
  • 反向扩散可以用训练好的神经网络来完成。
  • 为了近似所需的去噪步骤q,我们只需要使用神经网络εθ近似噪声εₜ。
  • 在简化损失函数上进行训练可以获得更好的样本质量。
  • 稳定扩散(潜扩散模型)是在潜空间中进行扩散过程,因此比纯扩散模型快得多。

参考链接:

Diffusion 和Stable Diffusion的数学和工作原理详细解释 - 知乎

https://medium.com/@steinsfu/stable-diffusion-clearly-explained-ed008044e07e

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

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

相关文章

十大经典系统架构设计面试题

十大经典系统架构设计面试题_架构_程序员石磊_InfoQ写作社区翻译自&#xff1a;https://medium.com/geekculture/top-10-system-design-interview-questions-10f7b5ea123d在我作为微软和Facebhttps://xie.infoq.cn/article/4c0c9328a725a76922f6547ad 任何 SDI 问题的提示 通过…

EasyMetagenome易宏基因组——简单易用的宏基因组分析流程-来自刘永鑫团队的秘密武器

原仓库地址如下&#xff0c;github有时候无法访问&#xff0c;等一段时间再试就行&#xff1a; YongxinLiu/EasyMetagenome: Easy Metagenome Pipeline (github.com) 相关文章&#xff0c;看文章更清晰这个可干啥&#xff1a; EasyAmplicon: An easy‐to‐use, open‐source…

深入了解汉字转拼音转换工具:原理与应用

一、引言 汉字作为世界上最古老、最具象形意的文字之一&#xff0c;承载了数千年的历史文明。然而&#xff0c;在现代信息技术环境下&#xff0c;汉字的输入、输出和检索等方面存在一定的局限性。拼音作为汉字的一种音标表达方式&#xff0c;能够有效地解决这些问题。本文将为…

C++:C++11新特性--lambda表达式和包装器

文章目录 lambda表达式lambda表达式的使用规则lambda表达式的用法lambda表达式的理解函数对象和lambda表达式 包装器bind lambda表达式 首先介绍什么是lambda表达式&#xff0c;在介绍这个情景前&#xff0c;可以回忆一下算法库中的sort排序&#xff1a; // lambda表达式 voi…

Git 标签管理

前言 标签 tag&#xff0c;就相当于对 某一次的 commit 做一个标识&#xff0c;起了一个别名&#xff0c;例如&#xff1a;在某个项目发布版本的时候&#xff0c;可针对最后一次 commit 起一个别名 v1.0 来标识这一次的commit。tag 的作用&#xff1a;commit id 相对于 tag 是很…

机械专业个人简历17篇

以下简历内容以机械专业相关岗位招聘需求为背景&#xff0c;我们整理了17篇且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴&#xff0c;助理大家在众多候选人中脱颖而出。 机械专业简历模板下载&#xff08;可在线编辑制作&#xff09;&#xff1a;来幻主简历&#xf…

GEE:均值滤波

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine(GEE)平台上,进行均值滤波操作的代码框架、核心函数和多种卷积核。 并分别以林地区域和农田区域为试验区,以NDVI图像为例。结果如下图所示, 文章目录 一、均值滤波二、完整代码三、代码链接一、均值滤波 均值滤…

CTF-PWN-堆-【malloc和free的工作流程】

文章目录 关于ptmalloc的思考缓存思想 chunk结构large bin补充fast bin 补充unsorted bin 补充top chunk 补充mmaped chunk补充Last remainder补充last remainder的产生 malloc_state补充mmap收缩阈值mmap分配阈值ptmalloc响应用户内存分配要求工作流程free时工作流程 大佬的关…

【Delphi】实现彩色日志显示框

目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候&#xff0c;经常需要显示程序运行的日志&#xff0c;一般我们会使用TMemo&#xff0c;使用起来简单&#xff0c…

ElementPlus中 使用ElLoading.service, spinner: ‘el-icon-loading‘不生效

let downloadLoadingInstance ElLoading.service({ text: "正在下载数据&#xff0c;请稍候",spinner: el-icon-loading, background: "rgba(0, 0, 0, 0.7)", })使用以上代码时&#xff0c;加载的圆圈出不来&#xff0c;使用f12查看&#xff0c;即使能出…

BEVFormer环境配置

官网的教程说是Step By Step&#xff0c;但是实际上我按照步骤安装下来运行不了&#xff08;BEVFormer GitHub地址&#xff09;。主要是安装后关于包依赖产生的某些错误&#xff0c;特别是安装nuscenes-devkit没有在步骤中列出来&#xff0c;后面就不好解决某些包的版本依赖了。…

多级缓存自用

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,添加缓…

C语言实现猜数字游戏

前面我们已经了解了分支循环、数据类型及变量的知识点&#xff0c;今天我将用之前学过的知识进行实操&#xff0c;将所学的知识进行巩固和提升。下面的讲解仅我个人认知水平&#xff0c;如有欠缺之处&#xff0c;欢迎大家指正&#xff0c;并且我希望初学者在看完讲解后可以独立…

强化学习------时序差分(Temporal-Difference Learning)

简介 时序差分方法&#xff08;Temporal-Difference Learning&#xff09;简称TD算法是强化学习中非常经典的一种方法&#xff0c;Sarsa算法和Q-learning算法都是基于时序差分这种方法的。 强化学习分为基于模型和不基于模型的方法 基于模型的方法&#xff1a;是一种通过建立…

Redis之五大基础数据类型(详细总结 面试必备)

Redis之五大基础数据类型 Redis 共有 5 种基本数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 这 5 种数据类…

64. 最小路径和(Leetcode)

文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中&#xff0c;我们将要详细介绍一下Leetcode6最小路径相关的内容 一、题目分析 二、算法原理 1.状态表示 列出dp表&#xff0c;dp[i][j]代…

IDEA导入JavaWeb项目(Maven)

IDEA导入JavaWeb(Maven)项目教程 运行教程 亲爱的粉丝们&#xff0c;我深知你们对IDEA导入JAVAWeb工程的迫切需求。在这个充满竞争的时代&#xff0c;每一个项目都离不开高效的沟通。过程中需要对应的环境适配和软件安…

操作PDF相关的工具,EPUB转PDF,golang

unipdf 安装依赖 go get github.com/unidoc/unipdf/v3 示例代码 https://github.com/unidoc/unipdf-examples 获取KEY 登录 https://cloud.unidoc.io/ 注册账号&#xff0c;生成 KEY&#xff0c;但是需要收费。 chromedp 使用Golang编写&#xff0c;主要功能是调用浏览器内…

代码随想录算法训练营第四十一天 _ 动态规划_343. 整数拆分、96.不同的二叉搜索树、01背包问题。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 343. 整数拆分 动态规划五步曲&…

Mysql之数据处理增删改

Mysql之数据处理增删改查 插入数据INSERT INTO语句的使用INSERT 与子查询结合 更新数据(修改数据)UPDATE SET语句 删除数据DELETE FROM语句 Mysql8新特性&#xff1a;计算列 插入数据 INSERT INTO语句的使用 用 INSERT INTO 语句&#xff0c;向表中插入数据 方式一&#xff1a;…