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

news2024/11/27 22:28:14

扩散模型的兴起可以被视为人工智能生成艺术领域最近取得突破的主要因素。而稳定扩散模型的发展使得我们可以通过一个文本提示轻松地创建美妙的艺术插图。所以在本文中,我将解释它们是如何工作的。

扩散模型 Diffusion

扩散模型的训练可以分为两部分:

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

正向扩散过程

正向扩散过程逐步对输入图像 x₀ 加入高斯噪声,一共有 T 步。该过程将产生一系列噪声图像样本 x₁, …, x_T。

当 T → ∞ 时,最终的结果将变成一张完包含噪声的图像,就像从各向同性高斯分布中采样一样。

但是我们可以使用一个封闭形式的公式在特定的时间步长 t 直接对有噪声的图像进行采样,而不是设计一种算法来迭代地向图像添加噪声。

封闭公式

封闭形式的抽样公式可以通过重新参数化技巧得到。

通过这个技巧,我们可以将采样图像xₜ表示为:

然后我们可以递归展开它,最终得到闭式公式:

这里的ε 是 i.i.d. (独立同分布)标准正态随机变量。使用不同的符号和下标区分它们很重要,因为它们是独立的并且它们的值在采样后可能不同。

但是,上面公式是如何从第4行跳到第5行呢?

有些人觉得这一步很难理解。下面我详细介绍如何工作的:

让我们用 X 和 Y 来表示这两项。它们可以被视为来自两个不同正态分布的样本。即 X ~ N(0, αₜ(1-αₜ₋₁)I) 和 Y ~ N(0, (1-αₜ)I)。

两个正态分布(独立)随机变量的总和也是正态分布的。即如果 Z = X + Y,则 Z ~ N(0, σ²ₓ+σ²ᵧ)。因此我们可以将它们合并在一起并以重新以参数化的形式表示合并后的正态分布。

重复这些步骤将为得到只与输入图像 x₀ 相关的公式:

现在我们可以使用这个公式在任何时间步骤直接对xₜ进行采样,这使得向前的过程更快。

反向扩散过程

与正向过程不同,不能使用q(xₜ₋₁|xₜ)来反转噪声,因为它是难以处理的(无法计算)。所以我们需要训练神经网络pθ(xₜ₋₁|xₜ)来近似q(xₜ₋₁|xₜ)。近似pθ(xₜ₋₁|xₜ)服从正态分布,其均值和方差设置如下:

损失函数

损失定义为负对数似然:

这个设置与VAE中的设置非常相似。我们可以优化变分的下界,而不是优化损失函数本身。

通过优化一个可计算的下界,我们可以间接优化不可处理的损失函数。

通过展开,我们发现它可以用以下三项表示:

1、L_T:常数项

由于 q 没有可学习的参数,p 只是一个高斯噪声概率,因此这一项在训练期间将是一个常数,因此可以忽略。

2、Lₜ₋₁:逐步去噪项

这一项是比较目标去噪步骤 q 和近似去噪步骤 pθ。通过以 x₀ 为条件,q(xₜ₋₁|xₜ, x₀) 变得易于处理。

经过一系列推导,上图为q(xₜ₋₁|xₜ,x₀)的平均值μ′ₜ。为了近似目标去噪步骤q,我们只需要使用神经网络近似其均值。所以我们将近似均值 μθ 设置为与目标均值 μ̃ₜ 相同的形式(使用可学习的神经网络 εθ):

目标均值和近似值之间的比较可以使用均方误差(MSE)进行:

经过实验,通过忽略加权项并简单地将目标噪声和预测噪声与 MSE 进行比较,可以获得更好的结果。所以为了逼近所需的去噪步骤 q,我们只需要使用神经网络 εθ 来逼近噪声 εₜ。

3、L₀:重构项

这是最后一步去噪的重建损失,在训练过程中可以忽略,因为:

  • 可以使用 Lₜ₋₁ 中的相同神经网络对其进行近似。
  • 忽略它会使样本质量更好,并更易于实施。

所以最终简化的训练目标如下:

我们发现在真实变分界上训练我们的模型比在简化目标上训练产生更好的码长,正如预期的那样,但后者产生了最好的样本质量。[2]

通过测试在变分边界上训练模型比在简化目标上训练会减少代码的长度,但后者产生最好的样本质量。[2]

U-Net模型

在每一个训练轮次

  • 每个训练样本(图像)随机选择一个时间步长t。
  • 对每个图像应用高斯噪声(对应于t)。
  • 将时间步长转换为嵌入(向量)。

训练过程的伪代码

官方的训练算法如上所示,下图是训练步骤如何工作的说明:

反向扩散

我们可以使用上述算法从噪声中生成图像。下面的图表说明了这一点:

在最后一步中,只是输出学习的平均值μθ(x₁,1),而没有添加噪声。反向扩散就是我们说的采样过程,也就是从高斯噪声中绘制图像的过程。

扩散模型的速度问题

扩散(采样)过程会迭代地向U-Net提供完整尺寸的图像获得最终结果。这使得纯扩散模型在总扩散步数T和图像大小较大时极其缓慢。

稳定扩散就是为了解决这一问题而设计的。

稳定扩散 Stable Diffusion

稳定扩散模型的原名是潜扩散模型(Latent Diffusion Model, LDM)。正如它的名字所指出的那样,扩散过程发生在潜在空间中。这就是为什么它比纯扩散模型更快。

潜在空间

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

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

潜在空间的扩散

将图像编码后,在潜在空间中进行正向扩散和反向扩散过程。

  • 正向扩散过程→向潜在数据中添加噪声
  • 反向扩散过程→从潜在数据中去除噪声

条件作用/调节

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

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

上图中的开关用于在不同类型的调节输入之间进行控制:

  • 对于文本输入,首先使用语言模型 𝜏θ(例如 BERT、CLIP)将它们转换为嵌入(向量),然后通过(多头)Attention(Q, K, V) 映射到 U-Net 层。
  • 对于其他空间对齐的输入(例如语义映射、图像、修复),可以使用连接来完成调节。

训练

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

  • 输入潜在数据zₜ而不是图像xₜ。
  • U-Net增加条件输入𝜏θ(y)。

采样

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

架构的比较

比较纯扩散模型和稳定扩散模型(潜在扩散模型)的整体架构。

Diffusion Model

Stable Diffusion (Latent Diffusion Model)

快速总结一下:

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

引用

[1] K. Roose, “An a.i.-generated picture won an art prize. artists aren’t happy.,” The New York Times, 02-Sep-2022.

[2] J. Ho, A. Jain, and P. Abbeel, “Denoising Diffusion Probabilistic models,” arXiv.org, 16-Dec-2020.

[3] N. A. Sergios Karagiannakos, “How diffusion models work: The math from scratch,” AI Summer, 29-Sep-2022.

[4] L. Weng, “What are diffusion models?,” Lil’Log, 11-Jul-2021.

[5] A. Seff, “What are diffusion models?,” YouTube, 20-Apr-2022.

[6] Outlier, “Diffusion models | paper explanation | math explained,” YouTube, 06-Jun-2022.

[7] R. Rombach, A. Blattmann, D. Lorenz, P. Esser, and B. Ommer, “High-resolution image synthesis with Latent Diffusion Models,” arXiv.org, 13-Apr-2022.

[8] J. Alammar, “The Illustrated Stable Diffusion,” The Illustrated Stable Diffusion — Jay Alammar — Visualizing machine learning one concept at a time.

[9] A. Gordić, “Stable diffusion: High-resolution image synthesis with latent diffusion models | ML coding series,” YouTube, 01-Sep-2022. [Online].

https://avoid.overfit.cn/post/d46c23ece6024970af77acae1c36f8b8

作者:Steins

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

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

相关文章

输出全排列(C++版)

目录 输出全排列 一、问题描述 二、运行环境说明 ​三、代码段 四、效果展示 输出全排列 备注:大二(上)数据结构课程设计A题 一、问题描述 请编…

我是如何利用cps平台赚钱的?

你好,我是你们熟悉而又陌生的好朋友梦龙,一个创业期的年轻人 今天跟你做个分享,众所周知互联网是一块非常大的蛋糕,几位互联网巨头也做不到完全吃透,这次梦龙给你分享的是实际的经验,实际的案例分享。 最开…

Spring存储和读取对象 -- 2

Spring存储和读取对象 -- 2前言一、存储 Bean 对象1.1 前置工作:配置扫描路径 (重要)1.2 添加注解存储 Bean 对象1.2.1 五大类注解Bean 命名规则1.2.2 方法注解 BeanBean 命名规则与重命名二、获取 Bean 对象 (对象注入)2.1 属性注入优点分析缺点分析2.2 Setter 注入…

如何在Jetbrain Rider中使用EntityFrameWork (Core) 命令行,如添加迁移和更新数据库

在Visual Studio中,EntityFrameWork命令如Add-Migration和Update-Database通常在包管理器控制台中运行。这在Visual Studio中工作得很好,但不幸的是,它不是可移植的。这些命令是基于powershell的,并且包管理器控制台绑定了Visual …

开源的文档型数据库--MongoDB(安装)

1、简介 MongoDB 是一个开源的、文档数据库管理系统。它提供了高性能、高可扩展性和高可用性。 MongoDB 使用了一种称为 BSON 的二进制形式的 JSON 来存储数据。这使得 MongoDB 可以轻松地存储各种数据类型,包括大型对象和二进制文件。 MongoDB 的一个重要特性是它的…

多线程1.

多线程1 1.如果想对地址空间的堆区做更细腻化的空间管理,怎么办? 搞一个vim_area_struct,他是一个双向链表。每一个节点是一块堆区空间,用链表串起来。 2.如何管理物理内存? 设定一个数据结构,如&#x…

电子会议桌牌

产品特色: 低功耗,常规使用3-5年电池寿命支持空中唤醒,刷新快速,几秒钟内看到结果点阵电子纸屏幕,视角接近180基于Web的应用界面,支持跨平台操作安装简单,快速布置电池供电不需要布线双面显示&…

神经网络模型的参数量和FlOPS

一、FLOPS、FLOPs和GFLOPs的概念 FLOPS:注意S是大写,是 “每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正…

重装系统把所有盘格式化教程

在使用电脑的过程中,可能会遇到系统重装的问题,但是有些朋友就觉得之前的分区不太合理,就打算全盘格式化重装系统,那小白一键重装系统怎么把所有盘格式化呢?这需要借助U盘或光盘来引导了。下面就来看看操作教程吧。 工具/原料&a…

2.17 STM32 SysTick—系统定时器

文章目录1、简介2、寄存器2.1 SysTick控制和状态寄存器(STK_CTRL)2.2 重载值寄存器(STK_LOAD)2.3 SysTick当前值寄存器 (STK_VAL)2.4 校准寄存器(STK_CALIB)3、SysTick 定时实验3.1 在标准库中3.2 在HAL库中的初始化4、SysTick 定…

driftingblues7靶机(eyes of network漏洞)

环境准备 靶机链接:百度网盘 请输入提取码 提取码:49by 虚拟机网络链接模式:桥接模式 攻击机系统:kali linux 2021.1 信息收集 1.arp-scan -l 2.探测靶机开放端口和服务情况 nmap -p- -A -T4 192.168.1.108 漏洞利用 1.访…

为什么开发者这么看重SQL?看完这些应用场景你就明白了

看到一个有趣的比喻,用来说明SQL与Excel的差别是什么。 如果把SQL比作火车,把Excel更比作卡车。 卡车灵活自由,高速或乡村小道想去哪就去哪,但即便每天不停歇卡车的运载量也不大,而且容易出交通事故。 火车运载量大…

P2P中的NAT穿越(打洞)方案详解

1、内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图“P2P结构模型”所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信、实时文件传输甚至文字聊天等…

【Python基础】篇四之while、for循环及其嵌套、continue、break

while循环基本格式:while 条件:条件满足时做的事1条件满足时做的事2条件满足时做的事省略注:只要条件满足就会一直执行while的条件需得到布尔类型,True表示循环继续,False表示循环结束需要设置循环终止条件&#xff0c…

map 源码思考

go 语言中 map 比较的说,和 slice 有什么区别?如果 map 是从 int 到 int 类型的话,差别还真不大。map 的 key 退化为 slice 的下标,而 value 退化为 slice 的值。 但这样也存在很大的弊端:空间浪费严重。假设 map 中只…

虹科分享 | 网络流量监控 | 构建大型捕获文件(Ⅱ)——Pcap分析仪:Allegro网络万用表的Pcap过滤器

上一期我们讨论的是如何使用Wireshark工具进行结构化搜索的技术,这一期我们将为大家进行介绍,我们该如何使用 Allegro 网络万用表来加快 pcap 分析器的工作。 前期回顾:构建大型捕获文件(Ⅰ)——Wireshark过滤器和其他…

VIVO应用商店APP侵权投诉流程

目录一、官方指引二、侵权投诉提交流程一、官方指引 https://dev.vivo.com.cn/documentCenter/doc/34 二、侵权投诉提交流程 登录 vivo 开放平台:https://dev.vivo.com.cn/,点击右下角“工单系统”: 业务类型选 “投诉举报类”&#xff0…

Redis-设置过期时间及淘汰策略

文章目录1. TTL2. 设置过期时间3. 删除过期key4. 淘汰策略Redis-设置过期时间及淘汰策略项目组使用的 Redis 服务器发出了内存不足报警,查了一些资料,记录下。 1. TTL 查看 Redis key 是否过期是 TTL 命令,或者登陆 Redis 客户端&#xff0…

重点算法排序之堆排序(下篇)

文章目录 一、堆排序的概念 1、1 堆的基本概念 1、2 堆的特性 二、堆排序的思路及代码实现 2、1 建堆 2、2 向下调整算法详解 2、3 建完堆后进行堆排序 2、3、1 排升序建大堆 2、3、2 建大堆后进行堆排序 三、堆排序的例题 2、1 例题1:堆排序 2、2 例题2&#x…

HTTP.sys远程代码执行漏洞修复

1.漏洞描述 Http.sys是Microsoft Windows处理HTTP请求的内核驱动程序。HTTP.sys会错误解析某些特殊构造的HTTP请求,导致远程代码执行漏洞。成功利用此漏洞后,攻击者可在System帐户上下文中执行任意代码。由于此漏洞存在于内核驱动程序中,攻击…