详解 Diffusion (扩散) 模型

news2024/10/7 12:19:34
alt

扩散模型是跨不同深度学习领域使用的生成模型。目前,它们主要用于图像和音频生成。最值得注意的是,这些模型是令人印象深刻的图像生成模型(例如 Dalle2 和稳定扩散)背后的驱动力。我相信您已经看过这些模型生成的闪烁图像。令人惊叹的结果证明了深度学习的进步是多么令人兴奋。

什么是Diffusion?

在物理学中,扩散只是任何事物的整体运动。 (原子,能量)从较高浓度的区域到较低浓度的区域。现在想象一下,将一小滴油漆滴入一杯水中,油漆的密度将集中在一个位置,但随着时间的推移,该滴将扩散到水中直至达到平衡。如果我们能逆转这个过程不是很好吗?不幸的是,这是不可能的。但扩散模型试图拟合一个模型,其最终目标是逆转这一过程。

其基本思想是通过迭代前向扩散过程系统地、缓慢地破坏数据分布中的结构。然后,我们学习反向扩散过程,恢复数据结构,产生高度灵活且易于处理的数据生成模型。

扩散模型尝试通过向原始图像迭代添加噪声来重现扩散过程。我们不断添加噪声,直到图像变成纯噪声。噪声由马尔可夫事件链定义。马尔可夫链是一种事件模型,其中每个时间步仅取决于前一个时间步。马尔可夫性质定义如下:

P(Xₙ = iₙ | Xₙ₋₁)

因此,任意满足上述条件的随机变量序列X₀,X₁,X2,…,Xₙ都可以被视为马尔可夫链。这种马尔可夫假设使得学习添加的噪声变得容易处理。在训练模型来预测每个时间步的噪声后,该模型将能够从高斯噪声输入生成高分辨率图像。总结一下:我们不断向图像添加噪声,直到只剩下纯粹的噪声。然后我们训练一个神经网络来消除噪音。因此扩散模型由两个阶段组成:

  1. 前向扩散过程
  2. 逆扩散过程

前向扩散过程

前向扩散过程是数据结构被破坏的阶段。这是通过应用从正态分布采样的噪声来完成的 - 最终图像随后将收敛到纯噪声 z ~ N(0, 1)。每个时间戳应用的噪声量不是恒定的。使用时间表来缩放平均值和方差。 OpenAI 的原始 DDPM 论文应用了线性调度。但 OpenAI 的研究人员再次发现,这会导致许多冗余的扩散步骤。因此,在他们的《改进的去噪扩散概率模型》论文中,他们实现了自己的余弦计划。

alt

前向过程定义为 q(xₜ|xₜ₋₁)。该函数只是在每个时间步 t 添加噪声。前向过程的数学定义如下:q(xₜ|xₜ₋₁) = N(xₜ; sqrt{1-βₜ}xₜ, βₜI)。您可能还记得在统计课上,正态分布是由均值和方差参数化的。 sqrt{1-βₜ}xₜ 是平均值。 βₜI 是方差。您在此等式中看到的 beta 只是范围在 0–1 之间的值 0<β₁<β2<…<β_T<1;贝塔值并不是恒定的,并且受“方差表”的调节。通常,您希望对每个时间步 t 重复此过程。只需一步即可完成这一过程将为我们节省大量计算量。让我们看看它是如何完成的。首先,我们定义 αₜ = 1-βₜ。然后我们可以定义所有 alpha 的累积乘积 α⁻ₜ = ∏aₛ 现在,使用重新参数化技巧,我们可以将上述公式重写如下:

alt

使用 alpha,我们可以将其重写为:

alt

正如您所猜测的,我们现在可以将其扩展到之前的时间步骤:

alt

使用所有 alpha 的乘积,最终方程将采用以下形式:

alt

逆扩散过程

如果通过计算 q(xₜ₋₁|xₜ) 来反转上述过程,那就太好了。不幸的是,这个计算需要每个时间步长。因此,我们恢复到学习近似这些条件概率的神经模型。在相反的过程中,神经网络将预测给定图像的平均值。神经网络将查看图像并尝试确定前向过程中该图像来自的图像分布。

alt

我们的扩散模型损失函数就是 -log(pθ(x₀))。问题在于扩散模型是潜变量模型,其形式如下:

alt

正如你所想象的,这种形式没有封闭的解决方案。解决这个问题的方法是计算变分下界。请注意,了解 VAE 的推导可以帮助您理解以下公式。整个逆过程定义为:

alt

由于这是联合分布,我们必须将每个逆过程相乘。请记住,pθ(xₜ₋₁|xₜ) 将您从“噪声较大”的图像变为“噪声较小”的图像。我提到了变分下界,但它是什么?在较高的层面上,假设我们有一个难以处理的函数 f(x)。如果我们能证明我们有一个小于 f(x) 的函数 g(x)。然后通过最大化 g(x),我们可以确定 f(x) 也会增加。让我们通过将 KL 散度添加到原始函数 f(x) = -log(pθ(x₀)) 来比较 -log(pθ(x₀))。

alt

通过贝叶斯定理重写KL散度,我们得到:

alt

所以我们的变分下界变成:

alt

我们现在的目标是将右侧转换为可分析计算的。让我们首先将日志重写为产品:

alt

使用对数乘积法则,我们可以重写右侧:

alt

取出求和的第一项,得到以下结果:

alt

使用贝叶斯定理重写 q(xₜ|xₜ₋₁) 并在 t = 0 时对输入图像进行调节:

alt

替代

alt

使用乘积法则:

alt

第二个求和可以进一步简化。取 T 等于任何数字,您会发现大部分项都被抵消了,您将得到以下结果:

alt

替换

alt

使用商规则,我们可以重写最后两项:

alt

您可以看到第一项和最后一项相互抵消。使用商规则的另一种用法来整理我们的公式:

alt

我们现在可以写出 KL 散度的对数项:

alt

DDPM 论文的作者忽略了第一项。如上所述,项 pθ(xₜ₋₁|xₜ) 可以重写为预测均值的神经网络:

alt

q(xₜ₋₁|xₜ, x₀) 具有如前所述的闭式解。我们可以将其写为:

alt

作者在实际 μ 和预测 μ 之间采用了简单的均方误差。他们使用超出本博客文章范围的定义来证明,得出以下结论:

alt

使用上面的定义,我们可以将均方误差简化为:

alt

这就是我们采取梯度下降步骤的术语!所有这些简化,我们得出以下结论:预测噪声。最终的目标函数采用以下形式:

alt

什么是 Stable Diffusion?

稳定扩散是 OpenAI Dalle.2 的开源替代品。由于稳定扩散是一种潜在扩散模型,因此我将尝试对 LDM 进行高级解释。还记得反向扩散过程如何使用神经网络逐渐降低噪声吗?稳定扩散使用 U-Net,这是一种基于卷积的神经网络,可将图像下采样到较低的维度,并在上采样期间重建它。在下采样层和上采样层之间添加跳跃连接以获得更好的梯度流。通过将从语言模型生成的文本嵌入连接到图像表示,将提示注入到模型中。 U-Net 中的注意力层允许模型通过交叉注意力来关注文本标记。

alt

顾名思义,LDM 不适用于原始像素。相反,图像通过编码器被编码到更小的空间中。然后通过解码器将图像解码回其原始空间。这允许扩散过程在小/潜在空间上工作并完成该空间中的去噪。您可以将其视为包含扩散过程的自动编码器。这就是为什么它被称为潜在扩散;我们不是在像素中而是在潜在空间中实现扩散过程。下图应该足以概括 LDM:

alt

总结

  1. 扩散模型的工作原理是迭代地向图像添加噪声,然后训练神经网络来学习噪声并恢复图像。
  2. U-Net 是逆向过程中使用最广泛的神经网络。
  3. U-Net 中添加了跳过连接和注意力层以获得更好的性能。
  4. LDM 的工作原理是将图像编码到较小的潜在空间并在该空间中实现扩散过程,然后通过解码器恢复图像。

本文由 mdnice 多平台发布

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

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

相关文章

Java基础-IO流

目录 1 File 类的使用 1.1 File类的概念 1.2 构造方法 1.3 常用方法 1.4 课后练习 2 IO流原理及流的分类 2.1 IO原理 2.2 流的分类 2.3 IO流体系 2.4 接口方法 2.4.1 InputStream & Reader相同点 2.4.2 InputStream方法详解 2.4.3 Reader方法详解 2.4.4 Outp…

【数据结构】顺序表实现通讯录

前言 在上一节中我们实现了顺序表&#xff0c;现在我们将使用顺序表完成通讯录的实现。&#xff08;注&#xff1a;本人水平有限&#xff0c;“小屎山”有些许bug&#xff0c;代码冗余且语无伦次&#xff0c;望谅解&#xff01;&#x1f605;&#xff09; 文章目录 一、数据结构…

postgresql14-安装(一)

安装 以管理员权限运行windows版安装包&#xff0c;否则会导致安装不全。过程中记录密码。 在服务管理&#xff0c;启动postgresql服务。 管理工具pgadmin

使用Dockerfile生成docker镜像和容器的方法记录

一、相关介绍 Docker 是一个开源的容器化平台&#xff0c;其中的主要概念是容器和镜像。 容器是 Docker 的运行实例。 它是一个独立并可执行的软件包&#xff0c;包含了应用程序及其依赖的所有组件&#xff08;如代码、运行时环境、系统工具、库文件等&#xff09;。容器可以在…

用户及授权设置API

用户及授权设置API 一、登录API——wx.login(object)二、用户信息API——wx.getUserInfor(object)三、授权API——wx.authorize(object object)四、设置API——wx.openSetting(object object)&wx.getSetting(object object)1、wx.openSetting(object object)2、wx.getSetti…

汽车屏类产品(五):中控IVI车载信息娱乐系统

前言: 车载信息娱乐系统(IVI)的起源可以追溯到20世纪,按钮调幅收音机被认为是第一个功能。从那以后,IVI系统在创造壮观的车内体验方面变得不可或缺,以至于汽车被称为“车轮上的智能手机”。但随着包括自动驾驶汽车在内的汽车技术的进步,以及对个性化体验的需求不断增长…

从裸机启动开始运行一个C++程序(十二)

前序文章请看&#xff1a; 从裸机启动开始运行一个C程序&#xff08;十一&#xff09; 从裸机启动开始运行一个C程序&#xff08;十&#xff09; 从裸机启动开始运行一个C程序&#xff08;九&#xff09; 从裸机启动开始运行一个C程序&#xff08;八&#xff09; 从裸机启动开始…

SpringBoot连接MySQL密码错误,报错:Access denied for user

记&#xff1a;一次连接MySQL报密码错误&#xff0c;Access denied for user 检查步骤&#xff1a; 核对用户和密码是否正确&#xff0c;用工具登陆试下。如果配置文件是yml格式&#xff0c;配置密码是123456这种纯数字&#xff0c;记得加上单/双引号。检查云上数据库配置&am…

使用rna-seq定量软件salmon运行index步骤遇到的一个问题(计算集群slurm)

salmon 帮助文档 https://salmon.readthedocs.io/en/latest/building.html#installation github主页 https://github.com/COMBINE-lab/salmon 我最开始是直接使用conda安装的 v1.4 首先第一步是对参考转录组进行索引&#xff0c;命令 salmon index -t pome.fa -i transcr…

postgresql14-用户与角色(二)

介绍 查看 SELECT rolname FROM pg_roles;postgres是系统初始化时默认创建的角色&#xff0c;为超级管理员。 \duList of rolesRole name | Attributes | Member of ------------------------------------------------------…

python 之计算矩阵乘法

文章目录 总的介绍例子 总的介绍 np.matmul 是NumPy库中的矩阵乘法函数&#xff0c;用于执行矩阵乘法操作。矩阵乘法是线性代数中的一种常见操作&#xff0c;用于将两个矩阵相乘以生成新的矩阵。在神经网络、机器学习和科学计算中&#xff0c;矩阵乘法经常用于变换和组合数据。…

简单宿舍管理系统(springboot+vue)

简单宿舍管理系统&#xff08;springbootvue&#xff09; 1.创建项目1.前端2.数据库3.后端 2.登陆1.前端1.准备工作2.登陆组件3.配置 2.后端1.链接数据库2.创建用户实体类3.数据操作持久层1.配置2.内容3.测试 4.中间业务层1.异常2.业务实现3.测试 5.响应前端控制层 3.前后对接4…

散列表:Word文档中的单词拼写检查功能是如何实现的?

文章来源于极客时间前google工程师−王争专栏。 一旦我们在Word里输入一个错误的英文单词&#xff0c;它就会用标红的方式提示“编写错误”。Word的这个单词拼写检查功能&#xff0c;虽然很小但却非常实用。这个功能是如何实现的&#xff1f; 散列别&#xff08;Hash Table&am…

linux复习笔记02(小滴课堂)

linux下输入输出错误重定向&#xff1a; 输入重定向&#xff1a;< 一个大于号是进行了覆盖。 两个大于号是追加。 输出重定向可以用于以后日志打印。 错误重定向&#xff1a; 错误重定向是不把信息打印到屏幕上而是打印到指定文件中去&#xff1a; 输出重定向其实是用的1…

【论文阅读】(2023TPAMI)PCRLv2

目录 AbstractMethodMethodnsU-Net中的特征金字塔多尺度像素恢复多尺度特征比较从多剪切到下剪切训练目标 总结 Abstract 现有方法及其缺点&#xff1a;最近的SSL方法大多是对比学习方法&#xff0c;它的目标是通过比较不同图像视图来保留潜在表示中的不变合判别语义&#xff…

可视化数学分析软件 MATLAB R2021b mac中文版软件介绍

MATLAB R2021b mac作为数学类科技应用软件中首屈一指的商业数学软件&#xff0c;可以帮助您进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。…

算法刷题-链表

算法刷题-链表 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]…

小成代码路的错误

文章目录 计算长度使用左闭右开的方法getline(解决输入空格问题和给一个输入的界限&#xff09;stoi(字符串转整形&#xff09;stoi&#xff08;整型转字符串型&#xff09;reverse&#xff08;反转函数&#xff09;将字符串立志静成员变量在类外初始化&#xff1b;但是有特例&…

FreeSWITCH 1.10.10 简单图形化界面12 - 注册IMS

FreeSWITCH 1.10.10 简单图形化界面12 - 注册IMS 0、 界面预览1、IMS注册-SIP中继基本设置界面2、IMS注册-SIP中继呼叫设置3、IMS中继-代理设置界面4、IMS注册-SIP中继状态界面5、IMS注册-SIP中继详细状态界面6、IMS注册-SIP中继代拨号码优先界面 FreeSWITCH界面安装参考&#…

Qt planeGame day10

Qt planeGame day10 Game基本框架 qt中没有现成的游戏框架可以用&#xff0c;我们需要自己搭框架首先创建一个QGame类作为框架&#xff0c;这个基本框架里面应该有如下功能&#xff1a;游戏初始化 void init(const QSize& siez,const QString& title);游戏反初始化(…