Stable Diffusion核心算法DDPM解析

news2024/9/20 14:39:15

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。

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

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

相关文章

安装软件包

安装软件包 创建一个名为 /home/curtis/ansible/packages.yml 的 playbook : 将 php 和 mariadb 软件包安装到 dev、test 和 prod 主机组中的主机上 将 RPM Development Tools 软件包组安装到 dev 主机组中的主机上 将 dev 主机组中主机上的所有软件包更新为最新版本 vim packa…

低代码实操演示 | 如何快速构建企微、钉钉、飞书消息推送服务

8月15日,万应低代码培训总监胡杰为大家带来了一场低代码实操直播,这场直播同时在抖音和微信视频号两个平台进行,吸引了众多关注者的参与。 为了更好地帮助大家快速上手,我们将直播的主题内容做了文字梳理,感兴趣的小伙…

【git clone error:no matching key exchange method found】

拉起项目代码报错 git clone ssh://uidxxxgerrit-xxxxxxxx Cloning into ‘xxxxx’… Unable to negotiate with xxx.xx.xxx.ip port xxxxx: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 fatal: Could not …

经过几天的乱搞,已经搞出来第一次stm32点灯程序

看吧那个灯泡已经亮了 stm32跟51不同的地方是这里引脚一组16个,如PA0,PA1,PA2,,,,,,PA15 51一组8个 例如P00,P01,P02,,,,P07

c语言——拷贝数组

这段代码是一个简单的数组拷贝示例。它的功能是将一个原始数组 original 的内容拷贝到另一个数组 copied 中,并输出两个数组的元素。 代码执行过程如下: 首先,在 main() 函数中定义了一个整型数组 original,并初始化了它的元素。…

自动编码器:揭开数据压缩和重建的奥秘

一、介绍 你有没有想过数据是如何压缩、传输和重建的?自动编码器是人工智能世界中一个引人入胜的概念,它正是实现这一目标的。想象一下,一个神奇的盒子,它接受复杂的信息,压缩成简化的形式,然后把它恢复到原…

企业数据防泄密解决方案!

PC访问地址: 首页 数据防泄密解决方案有: 透明加密文件:计算机中常用文档类型可以加密,打开加密文档类型下的文件后,文件将自动变为加密状态。 文件操作审计和自动备份:在电脑中打开文件可以进行自动审计…

【加强管理】《别输在不懂管理上》学习记录,黄金41条

成功有时是很难效法的,但失败是可以避免的,从失败中吸取经验和教训才是管理者的必修课。释义: 图形含义🌲一级重要🍀二级重要🌿三级主要🍁存在问题🌼解决办法 1 不能从头管到脚 不…

Go自写NIPS—网络威胁防御系统

目录 0x00 摘要0x01 示例柱状图3d视图报警列表控制查询功能封堵IP实例 0x02 结语 0x00 摘要 紧接着上文,我开发了IDS的雏形,但是因为界面太丑,还频繁出现bug,并且也没有封禁等功能(还需要去防火墙自己封禁&#xff09…

【轻量级神经网络】MobileNet网络详解

文章目录 1、深度卷积(Depthwise convolution)2、逐点卷积(Pointwise Convolution)3、深度可分离卷积(Depthwise Separable Convolution)4、Xception与MobileNet深度可分离卷积的区别 深度学习领域内努力促使神经网络向小型化发展。在保证模型准确率的同时体积更小,…

opencv进阶07-支持向量机cv2.ml.SVM_create()简介及示例

支持向量机(Support Vector Machine,SVM)是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大)。当数据…

你信吗,40%的受访者表示ChatGPT会做出比自己更好的投资决策

注意:本信息仅供参考,发布该内容旨在传递更多信息的目的,并不意味着赞同其观点或证实其说法。 调查显示,很大一部分受访者认为人工智能可以比他们更好地选择股票。 对于许多人来说,人工智能仍处于相对初始阶段&#x…

Python程序设计——元组、集合和字典

可以使用元组存储一个固定的元素列表,使用集合存储和快速访问不重复的元素、使用字典存储键值对并使用这些关键字来快速访问元素。 一、元组 元组跟列表类似,但是元组中的元素是固定的;也就是说,一旦一个元组被创建,就无法对元组中的元素进行…

部署mysql到win10电脑上

中间出现了很多问题, 记录一下 我这边是去官网下载的 ,链接:https://dev.mysql.com/downloads/mysql/ 我这边选了不是最新版本的MySQL,因为第一次安装8.1.0版本的,死活运行不起来,直接卸载安重装了&#x…

Python web实战之Django的国际化和本地化详解

关键词:Django、Python、Web开发、国际化(i18n)、本地化(l10n) 今天我要和大家分享一下 Python Web 开发中的一个重要话题——Django 的国际化和本地化。 1. 国际化和本地化 你有没有想过如何让你的网站在全球范围内…

ssm蜀都天香酒楼网站设计与实现

ssm蜀都天香酒楼的网站设计与实现028 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首…

DAY06_SpringBoot—简介基础配置yaml多环境开发配置整合第三方技术

目录 一 SpringBoot简介1. 入门案例问题导入1.1 入门案例开发步骤1.2 基于SpringBoot官网创建项目1.3 SpringBoot项目快速启动 2. SpringBoot概述问题导入2.1 起步依赖2.2 辅助功能 二 基础配置1. 配置文件格式问题导入1.1 修改服务器端口1.2 自动提示功能消失解决方案1.3 Spri…

7. CSS(四)

目录 一、浮动 (一)传统网页布局的三种方式 (二)标准流(普通流/文档流) (三)为什么需要浮动? (四)什么是浮动 (五)浮…

【BASH】回顾与知识点梳理(三十二)

【BASH】回顾与知识点梳理 三十二 三十二. SELinux 初探32.1 什么是 SELinux当初设计的目标:避免资源的误用传统的文件权限与账号关系:自主式访问控制, DAC以政策规则订定特定进程读取特定文件:委任式访问控制, MAC 32.2 SELinux 的运作模式安…