Stable Diffusion核心算法DDPM解析

DDPM:Denoising Diffusion Probabilistic Model,去噪扩散概率模型

本文参考:一个视频看懂扩散模型DDPM原理推导|AI绘画底层模型_哔哩哔哩_bilibili

1、大概原理

从右往左x_0\rightarrow x_T为正向加噪过程,从左往右x_t\rightarrow x_0为逆向降噪过程。

在正向过程中不断加噪,经过T次之后得到x_T,我们希望x_T\sim N(0,1)

这样在推理过程中,我们可以从N(0,1) 随机取出x_T{'}(加‘ 表明这个是新值)。

如果我们能学得x_t\rightarrow x_{t-1}的降噪方法,就可以最终通过x_T{'}\rightarrow x_0{'}的新图片。

2、扩散模型的降噪方法预测什么

现在就是需要学x_t\rightarrow x_{t-1}的降噪方法,DDPM算法不是直接学预测x_{t-1}值的方法,而是预测x_{t-1}的条件概率分布p(x_{t-1}|x_t),然后从分布中取值得到x_{t-1}的值。此方法类似于deepar预测方法,预测的是分布而不是值。

那么为什么去预测分布而不是确切的x_{t-1}的值?

因为有了分布之后就可以采样取出x_{t-1}{'},模型就有了随机性。

进一步,假如得到p(x_{t-2}|x_{t-1}),就可以抽样得到x_{t-2}{'},这样一步步下去就可以从x_T{'}\rightarrow x_0{'}。所以,我们要学习的是p的分布,而不是确切的某张图。

结论:学习过程全程是在预测分布p

后续我们会看到模型在预测噪音,这个噪音不是x_tx_{t-1}之间的噪音,而是正态分布p中的\mu计算时涉及到的噪音\varepsilon

所以,我们通过预测\varepsilon得到\mu,进而得到p。也验证了我们的结论,即:学习过程全程是在预测分布p

3、条件概率分布的拆解

公式1p(x_{t-1}|x_t)=\frac{p(x_t|x_{t-1})\cdot p(x_{t-1})}{p(x_t)},根据贝叶斯公式对最初的条件概率分布进行了转换,新得到的算式包含了3个概率分布。

(1)第1个p的计算

第1个p为:p(x_t|x_{t-1})

x_{t-1}x_t为加躁过程中的概率分布,因为加躁过程是事先定义的,所以概率分布p也是可以被定义的。

现在我们定义加躁过程如下:

公式2x_t=\sqrt{\alpha _t}\cdot x_{t-1} + \sqrt{\beta_t}\varepsilon _t,其中\varepsilon _t\sim N(0,1)的噪音,\beta_t=1-\alpha_t

因为\varepsilon _t\sim N(0,1),所以\sqrt{\beta_t} \varepsilon_t \sim N(0, \beta_t)。(ps:方差需要取平方)

可以看出\beta_t为噪音的方差,它需要非常小接近0。只有加的噪音很小,前向、后向才是服从正态分布的。

进一步推导,x_t \sim N(\sqrt{\alpha_t} \cdot x_{t-1}, \beta_t),即:

公式3:p(x_t|x_{t-1}) \sim N(\sqrt{\alpha_t} \cdot x_{t-1}, \beta_t)

(2)第3个p的计算

第3个p为:p(x_t),它和第2个p是类似的。如果找到一个的计算方法,那么另一个也可以类似得到。

上一步我们得到每一步加躁过程的公式2,以及每一步加躁的条件概率分布公式3。

针对加躁过程,x_0 \rightarrow x_t \rightarrow \cdots \rightarrow x_{t-1} \rightarrow x_t,所以理论上可以用x_0来推导出x_t

对公式1进行改造:

公式4:p(x_{t-1}|x_t,x_0)=\frac{p(x_t|x_{t-1},x_0)\cdot p(x_{t-1}|x_0)}{p(x_t|x_0)}

因为加躁过程是马尔可夫过程,所以p(x_t|x_{t-1},x_0)只跟前一步有关,和再前一步无关,即和x_0也无关,所以p(x_t|x_{t-1},x_0)=p(x_t|x_{t-1})

p(x_t|x_0)是从x_0一步步得到x_t,所以不能再做简化。进而,公式4简化为:

公式5p(x_{t-1}|x_t,x_0)=\frac{p(x_t|x_{t-1})\cdot p(x_{t-1}|x_0)}{p(x_t|x_0)}

现在重新开始计算新的第3个p的值,从公式2开始推导如下(ps:括号表示其中含有部分参数但是未写出来,省略不重要的信息):

x_t=\sqrt{\alpha_t} \cdot x_{t-1} + \sqrt{\beta_t} \cdot \varepsilon_t \\ =\sqrt{\alpha_t}(\sqrt{\alpha_{t-1}} \cdot x_{t-2}+\sqrt{\beta_{t-1} }\cdot \varepsilon_{t-1}) + \sqrt{\beta_t} \cdot \varepsilon_t \\ = \cdots \\ =\sqrt{\alpha_t \cdots \alpha_1} \cdot x_0 + ()\varepsilon_t + \cdots + ()\varepsilon_2 + ()\varepsilon_1 \\ = \sqrt{\alpha_t \cdots \alpha_1} \cdot x_0 + ()\varepsilon

最后,经过不严谨的推导我们给出官方结果:

公式6p(x_t|x_0) \sim N(\sqrt{\bar{\alpha_t}} \cdot x_0, (1- \bar{\alpha_t}) \cdot \varepsilon_t ^{2}),其中\bar{\alpha_t} = \alpha_t \cdots \alpha_0表示连乘。

(3)扩散公式求解

上一步求得p(x_t|x_0),那么也可以类似求得p(x_{t-1}|x_0)

直接给出公式4的官方结果:

公式7p(x_{t-1}|x_t, x_0) \sim N(\bar \mu (x_0,x_t), \tilde{\beta_t})

其中\tilde{\beta_t}是超参,\bar{\mu} (x_0,x_t)的公式见如下:

公式8\bar{\mu }(x_0,x_t)=\frac{\sqrt{\bar{\alpha_{t-1}}} \cdot \beta_t}{1-\bar{\alpha_t}} \cdot x_0 + \frac{\sqrt{\alpha_t} \cdot(1-\bar{\alpha_{t-1}})}{1-\bar{\alpha_t}} \cdot x_t

因为\tilde{\beta_t}固定,所以求p(x_{t-1}|x_t,x_0)的任务就变成了求\bar{\mu} (x_0,x_t)

如果有了\bar{\mu }(x_0,x_t),那么根据如下公式可以得到预测的推理值:

公式9x_{t-1}=\bar{\mu }(x_0, x_t)+ \sqrt{\tilde{\beta_t}} \cdot \varepsilon _t\varepsilon _t \sim N(0,1)

如果直接根据公式7从p(x_{t-1}|x_t,x_0)中取出一个x_{t-1},该过程是不可导的(直接通过python包输入均值、方差取值的方式),那么逆向过程有问题,所以通过重参数技巧转换为公式9这样一个可求导的公式来表达x_{t-1}

在推理阶段x_0就是我们最终想要的值,该值未知,所以需要转换为已知因子的公式。

公式6经过重参数技巧转换后如下:

公式10x_t=\sqrt{\bar{\alpha_t}} \cdot x_0 + \sqrt{1-\bar{\alpha_t}} \cdot \varepsilon _t,进而得到:

公式11x_0=\frac{1}{\sqrt{\bar{\alpha_t}}}(x_t - \sqrt{1-\bar{\alpha_t}} \cdot \varepsilon _t),这其中的t为当前加噪阶段数,会变化。同时,这个x_0是中间过程的参数值,不可以作为最终的预测值,因为推理的p过程需要遵循马尔可夫过程,所以必须一步步推导到x_0

在公式7中,未知值是\bar{\mu} (x_0,x_t),而该值中的未知值是x_0,而x_0中的未知值是\varepsilon _t,该值无法通过现有公式计算推导得到

于是我们借助UNet网络,输入x_t,输出\varepsilon _t

将公式11代入公式8,可得到:

公式12\bar{\mu }(x_0, x_t)=\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{\beta_t}{\sqrt{1-\bar{\alpha_t}}} \cdot \varepsilon_t),公式中除了\varepsilon其他均为已知。

\varepsilon是通过UNet网络预测出来的,可以表示为\varepsilon _\theta (x_t, t)\theta为UNet模型参数。

*************扩散模型通过UNet网络得到预测图像的过程**************

UNet \rightarrow \varepsilon _t \rightarrow x_0 -> \bar{\mu }(x_0,x_t) \rightarrow p(x_{t-1}|x_t,x_0) \rightarrow x_{t-1}{'} \rightarrow \cdots \rightarrow x_0{'}

以上就是扩散模型DDPM最重要的逻辑

4、模型训练

根据公式12可知,UNet网络训练的是正态分布的噪音\varepsilon

问题1:模型训练时的输入输出?

答案:输入x_t,输出\varepsilon _t

问题2:那么哪个过程进行UNet网络参数的训练呢?

答案:加噪过程。加噪过程是训练阶段,降噪过程是推理阶段。

根据公式2可知,加噪过程的噪音是实现定义好的,所以我们可以比较预测的噪音\hat{\varepsilon }和真实\varepsilon的KL散度计算loss值,在官方说明中KL散度公式一通推导后可简化为计算这两个值的mse值。

问题3:训练时是否正向一步步推导的?

答案:不需要。在训练过程中,根据公式10 x_t=\sqrt{\bar{\alpha_t}} \cdot x_0 + \sqrt{1-\bar{\alpha_t}} \cdot \varepsilon _t可知,x_t可以通过\bar{\alpha_t}x_0\varepsilon _tt 这4个值计算得到。

\bar{\alpha_t}可以提前计算好放在内存中,x_0就是输入输入的图片集,\varepsilon _t就是输入的噪音,t是加噪阶段数。

所以正向中每一步皆可直接获取x_t值。

5、训练和推理的伪代码实现

(1)训练阶段

解读:

q(x_0)表示从数据集中取出图片

Uniform(\left \{1,...,T \right \})表示随机抽取一个加噪阶段数,如之前所述,加噪过程不需要一步步来。

\sqrt{\bar{\alpha_t}} \cdot x_0 + \sqrt{1-\bar{\alpha_t}} \cdot \varepsilon _tx_t

(2)推理阶段

 

 解读:

for t=T,...,1 do 表示逆向过程需要一步步来的。

第4步的复杂计算对应公式9,计算中的第一个公式对应公式12。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专访 BlockPI:共建账户抽象未来的新一代 RPC 基础设施

在传统 RPC 服务板块上,开发者一直饱受故障风险、运行环境混乱等难题的折磨。实现 RPC 服务的去中心化,且保持成本优势和可扩展性,始终是区块链基础设施建设的重要命题之一。从 2018 年观察中心化 RPC 供应商服务现状开始,BlockPI…

Kubernetes 企业级高可用部署

1、Kubernetes高可用项目介绍 单master节点的可靠性不高,并不适合实际的生产环境。Kubernetes 高可用集群是保证 Master 节点中 API Server 服务的高可用。API Server 提供了 Kubernetes 各类资源对象增删改查的唯一访问入口,是整个 Kubernetes 系统的数…

使用断言抛异常操作

使用断言抛异常操作 常用方法 public static void isNull(Nullable Object object, String message) {if (object ! null) {throw new IllegalArgumentException(message);}}public static void notNull(Nullable Object object, String message) {if (object null) {throw n…

问道管理:股票打板风险大吗?怎么降低打板风险?

在股票市场上,一些出资者喜爱低吸,一些喜爱打板,那么,股票打板危险大吗?怎么下降打板危险?下面问道管理为大家准备了相关内容,以供参阅。 股票打板通常是指在个股涨停时买入,这种买入…

您可以购买 Banana Pi BPI-CM2 而不是 Raspberry Pi CM4。它提供什么?

最近,Banana Pi(SINOVOIP)推出了Banana Pi BPI-CM2系统级模块(SoM)。BPI-CM2 是类似于Raspberry Pi CM4 的计算模块,提供一系列令人印象深刻的功能。Banana BPI-CM2 SoM 采用Rockchip RK3568四核 Cortex-A5…

数据结构—排序

8.排序 8.1排序的概念 什么是排序? 排序:将一组杂乱无章的数据按一定规律顺序排列起来。即,将无序序列排成一个有序序列(由小到大或由大到小)的运算。 如果参加排序的数据结点包含多个数据域,那么排序往…

WebSocket服务端数据推送及心跳机制(Spring Boot + VUE)

一、WebSocket简介 HTML5规范在传统的web交互基础上为我们带来了众多的新特性,随着web技术被广泛用于web APP的开发,这些新特性得以推广和使用,而websocket作为一种新的web通信技术具有巨大意义。WebSocket是HTML5新增的协议,它的…

当你出差在外时,怎样轻松访问远程访问企业局域网象过河ERP系统?

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻,不管是财务、生产、销售还是采购,都需要用到ERP系统来协助。…

快速解决Ubuntu 中 wine 程序 中文显示为方块/显示错误/无法显示中文(2023)

解决办法就是在创建prefix的命令行里加上LANG“zh_CN.UTF8” LC_ALL“zh_CN.UTF8”,并安装cjkfonts,即可。 1、生成prefix、安装cjk字体 以下是基本流程: 现在假定wine和winetricks已经装好, // 先创建一个prefix,按…

ArcGIS 利用cartogram插件制作变形地图

成果图 注:本图数据并不完全对,只做为测试用例 操作 首先需要下载一个插件cartogram 下载地址在这里 https://www.arcgis.com/home/item.html?idd348614c97264ae19b0311019a5f2276 下载完毕之后解压将Cartograms\HelpFiles下的所有文件复制到ArcGIS…

K8s实战4-使用Helm在Azure上部署Ingress-Nginx和Tokengateway

手动发布Ingress-Nginx 1 登录到aks(dfinder-gw-aks) az login az account set --subscription ${sub ID} az aks get-credentials --resource-group ${groupname} --name ${aks name} 2 下载 ingress-nginx-4.2.5.tgz curl -LO https://github.com/kubernetes/ingress-ngi…

【002】学习笔记之typescript的【任意类型】

任意类型 顶级类型:any类型和 unknown 类型 any类型 声明变量的时候没有指定任意类型默认为any任意类型都可以赋值给any,不需要检查类型。也是他的弊端如果使用any 就失去了TS类型检测的作用 unknown 类型 TypeScript 3.0中引入的 unknown 类型也被认为…

Tomcat 一次请求的生命周期

在使用 Tomcat 的时候,我们只需要在 Servlet 实现类中写我们的业务逻辑代码即可,不需要管 Socket 连接、协议处理要怎么实现,因为这部分作为不经常变动的部分,被封装到了 Tomcat 中,程序员只需要引入 Tomcat 中即可&am…

【C# 基础精讲】文件读取和写入

文件读取和写入是计算机程序中常见的操作,用于从文件中读取数据或将数据写入文件。在C#中,使用System.IO命名空间中的类来进行文件读写操作。本文将详细介绍如何在C#中进行文件读取和写入,包括读取文本文件、写入文本文件、读取二进制文件和写…

R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

随着数字农业和智慧农业的发展,基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…

Vue用JSEncrypt对长文本json加密以及发现解密失败

哈喽 大家好啊,最近发现进行加密后 超长文本后端解密失败,经过看其他博主修改 JSEncrypt原生代码如下: // 分段加密,支持中文JSEncrypt.prototype.encryptUnicodeLong function (string) {var k this.getKey();//根据key所能编…

初识Sentinel

目录 1.解决雪崩的方式有4种: 1.1.2超时处理: 1.1.3仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制 2.1.簇点链路 …

vscode用ssh远程连接linux

1、vscode是利用ssh远程连接linux的,所以首先确保vscode已经安装了这两个插件 2、点击左下角的连接 3、选择Connect to Host…… 5、按格式输入 ssh 主机名ip 比如我的:ssh mnt192.168.198.128 6、选择第一个打开配置文件,确保输入正确 7、…

主机防护的重要性和方式

01 主机防护的重要性 主机防护是网络安全的重要组成部分。在互联网时代,网络攻击成为了一种常见的威胁,而主机防护则是保护计算机系统免受网络攻击的重要手段。 主机防护可以防范各种网络攻击,如病毒、木马、黑客攻击等,从而保…

Python 函数

Built-in Functions — Python 3.11.4 documentation