再议扩散模型

目录

一、基础知识

1、数学期望

2、概率表示

3、KL散度

二、扩散过程

三、理想的去噪过程

四、真实的去噪过程

五、噪声生成 


导言

       笔者早些时候曾粗略看过扩散模型的流程,但对于底层算法(尤其是概率论方面),理解不够透彻,所以重新解释底层算法。

一、基础知识

1、数学期望

       在扩散模型中经常使用数学期望来计算扩散模型的损失函数,其中期望符号的写法与概率论有所不同。

        期望计算:对于变量x在概率密度函数为p(x)下的期望(亦说为变量x在p(x)分布下的期望)记作:E_{p(x)}\left ( x \right )。由于一般来说概率密度函数p(x)已知,所以也缩写为E(x)。而扩散模型中分布函数未知,所以记作前者。

2、概率表示

        p(x_0)表示:0时刻下的概率分布。

        p(x_0:T)表示:0到T时刻下,变量x的联合概率分布,此时不一定等于\prod_{t=0}^T p(x_t),因为不一定相互独立。

        p(x_1:T|x_0)表示:考虑0时刻情况x_0成立下,1到T时刻下,变量x的联合概率分布。

        由于扩散模型遵循马尔科夫链,所以一定有1时刻完全依赖于0时刻,2时刻完全依赖于1时刻,则可以理解为相互独立。

        此时遵循贝叶斯公式:p_\theta(x_0)=\frac{p_\theta(x_0:T)}{p_\theta(x_{1:T}|x_0)}

        对于T时刻与0时刻之间的关系:q(x_1:T|x_0)=\prod _{t=1}^T q(x_t|x_{t-1})

3、KL散度

        KL散度定义:

                                               D_{KL}(p||q)=\sum_{i=1}^n p(x_i)log \frac{p({x_i})}{q(x_i)} \\ D_{KL}(p||q)=\int p(x_i)log \frac{p({x_i})}{q(x_i)}

        KL散度用来描述两个分布之间的距离,KL散度为0则两个分布相同,散度越大则越不相关。

        KL散度非负性证明?

        从凸函数定义延伸出Jetson不等式:

凸函数定义f(\lambda x_1+(1-\lambda )x_2) \leqslant \lambda f(x_1)+(1-\lambda)f(x_2)

Jensen不等式(琴生不等式):当f(x)是区间[a,b]的凸函数,则对于任意实数x_1,x_2,...,x_n \in [a,b],对所有非负实数 a_1,a_2,...,a_n \geqslant 0 ,且a_1+a_2+...+a_n=1,下式成立:

        f(a_1x_1+a_2x_2+...+a_nx_n) \leqslant a_1f(x_1)+a_2f(x_2)+...+a_nf(x_n)

由KL散度定义:

        D_{KL}(p||q)=\sum_{i=1}^n p(x_i)log \frac{p({x_i})}{q(x_i)}

其中:

        \sum_{i=1}^np(x_i)=1 , \ \ \sum_{i=1}^nq(x_i)=1

由于-log(x)为凹函数所以提取负号,进行变换:

        D_{KL}(p||q)=\sum_{i=1}^n p(x_i)log \frac{p({x_i})}{q(x_i)} \\ =\sum_{i=1}^n p(x_i)(-log \frac{p({x_i})}{q(x_i)}) \\ \geqslant -log(\sum_{i=1}^n p(x_i)\frac{q({x_i})}{p(x_i)}) \\ =-log(\sum_{i=1}^n q(x_i)) \\ =-log(1) \\ =0\beta_t

因此KL散度恒为非负。

二、扩散过程

        扩散模型就是逐次往图片里加入高斯噪声直到完全变为噪声的过程,问题在于噪声如何加,与上一帧的加权关系。

        噪声模型,本身是从一个正态分布中采样而来,分布遵循N(0,I)。

        扩散前提:保证扩散后图像仍然是一个高斯噪声图像。

        扩散迭代公式:q(x_t|x_{t-1})=N(x_t|\sqrt{1-\beta_t}x_{t-1},\beta_t \mathbf{I}),保证扩散过程是一个均值\sqrt{1-\beta_t}x_{t-1},方差为\beta_t \mathbf{I}的正态分布,\beta_t是一个随时间变化的值,满足特定的差异时间表。

        均值为什么要乘以\sqrt{1-\beta_t}?

        由于T\rightarrow \infty时刻,保证x_t仍然是一个正态分布,但显然现实场景T达不到无穷大,该想法只是一个理想条件。

        扩散模型满足马尔科夫链:q(x_1:T|x_0)=\prod _{t=1}^T q(x_t|x_{t-1})

        对于扩散模型T时刻的通项公式:q(x_t|x_0)=N(x_t;\sqrt{\bar{\alpha}_t}x_0,(1-\bar{\alpha}_t)I)

        通项公式计算如下:

        令\alpha_t=1-\beta_t ,\ \bar{\alpha_t}=\sum_1^n\alpha_i

三、理想的去噪过程

        去噪过程的思想就是从随机噪声中还原一个图像。

        目的:求出q(x_{t-1}|x_t)迭代公式。

        但由于我们无法通过原有的q(x_t|x_{t-1})来反向推导该目标,所以我们尝试用神经网络(一般用u-net)拟合一个p_\theta(x_t|x_{t-1}),与目标近似。

        迭代公式推导主体思想:化反向过程为前向过程!

        首先对于q(x_{t-1}|x_t,x_0)公式进行转化:

        7.1步用贝叶斯公式替换,7.2步乘法公式展开,7.3步进行整理,7.4步带入正态分布函数公式,由于差了一个\frac{1}{\sqrt{2 \pi \sigma}},所以不完全等价,保证正比于。7.5步转换为关于x_{t-1}的二次项函数,此时可以抽出方差和均值,这两者均\alpha_t有关。

        迭代公式q(x_{t-1}|x_t,x_0)=N(x_{t-1};\frac{1}{\sqrt{\alpha_t}}(x_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t} }\epsilon),\frac{(1-\bar{\alpha}_{t-1})(1-\alpha_t)}{1-\bar{\alpha}_t}I)

        最后证明为一个变量为t-1时刻的前向过程。

四、真实的去噪过程

         真实的去噪过程是预测噪声分布,一般计算变分自编码器的最大化证据下界,训练方法就是最小化负对数似然。

        上面结果中第一项约束最终第T步得到的加噪结果 X_t接近于完全的高斯噪声,最后一项约束模型生成的结果与真值接近,而中间的 t-1 项约束逆向过程的马尔科夫链中,神经网络估计出的每一个条件分布接近于对应的真实的数据分布。

         中间的第t项的KL散度可以进行化简,最后将收敛于真实噪声,如下。

      代入推导出来的均值,此时正比于一个真实噪声与预测噪声的均方误差,这个结构最后作为损失函数用于最小化。

五、噪声生成 

        噪声生成模型一般用U-net或U-net结合transformer,输入带有噪声的图像和时间步t,输出是预测出的\epsilon_\theta(x_t,t),损失函数用真实噪声与预测噪声的均方误差。

参考一年前我写过的扩散模型:NLP(6)--Diffusion Model_diffusion model nlp-CSDN博客

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

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

相关文章

pytorch学习(五)tensorboard使用

1. 创建环境 首先创建一个环境: conda create -n pytorch conda activate pytorch 然后安装tensorboard pip install tensorboard 安装opencv pip install opencv-python 2. 简单的案例 标量和图像的显示: 2.1标量实现的方法是add_scalar,第一个参数是给显…

探索Puppeteer的强大功能:抓取隐藏内容

背景/引言 在现代网页设计中,动态内容和隐藏元素的使用越来越普遍,这些内容往往只有在特定的用户交互或条件下才会显示出来。为了有效地获取这些隐藏内容,传统的静态爬虫技术往往力不从心。Puppeteer,作为一个强大的无头浏览器工…

印尼语翻译通:AI驱动的智能翻译与语言学习助手

在这个多元文化交织的世界中,语言是连接我们的桥梁。印尼语翻译通,一款专为打破语言障碍而生的智能翻译软件,让您与印尼语的世界轻松接轨。无论是商务出差、学术研究,还是探索印尼丰富的文化遗产,印尼语翻译通都是您的…

代码随想录算法训练营第三十六天|1049. 最后一块石头的重量 II 、 494. 目标和 、 474.一和零

1049. 最后一块石头的重量 II 分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。 在计算target的时候,target sum / 2 因为是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的。 那么相撞之…

.NET C# 使用 iText 生成PDF

.NET C# 使用 iText 生成PDF 文章目录 .NET C# 使用 iText 生成PDF1 安装 iText 7 库:2 变量定义3 创建一个PDF4 段落5 旋转文本6 代码块7 外部链接8 内部链接9 表格10 注释11 线条12 二维码13 嵌入图像14 列表15 设置背景16 页眉17 页脚18 事件19 水印20 分栏21 源…

老古董Lisp(1):粗鲁先生Lisp再出发

粗鲁先生Lisp再出发 开始的原因 目标和梦想是最近考虑的一个问题。什么是目标?什么是梦想?梦想可以激励改变,目标才能实现改变。 开始这个部分的时候,我的梦想是什么?我的目标是什么?我想要什么&#xf…

libwebrtc.a+exosip连接fS 环境部署tips

//运行FS服务器 sudo ./freeswitch -nc -nonat //公网sudo ./freeswitch //运行客户端 sudo ./fs_cli //加载模块 load mod_av load mod_verto0.Invite交互过程 1.fs码率设置 2.用户密码改动 3.数字签名的摘要 4.FS收不到ACK 5.公网部署 6.查看frewswitch都占用哪些端口 7.日志…

Java(二十一)---栈的使用和模拟实现

文章目录 前言1.什么是栈(Stack)?2. 栈的模拟实现3.stack的使用![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/80c82d22f3ee49cfaa2915d1c961573e.png)4.关于栈的oj题4.1.有效的括号4.2.逆波兰表达式4.3.栈的压入、弹出序列4.4.最小栈 前言 前面几篇我们学习了顺序…

Vue--Router(路由)

目录 一 Router(路由) 1.作用 2.实现步骤 3.注意 一 Router(路由) 1.作用 Router又叫做路由,简单来说,就是用来实现vue的页面之间跳转的。 我们都知道,使用vue必然会涉及到很多个组件,也就是页面,而页面之间肯定需…

RK3588读取不到显示器edid

问题描述 3588HDMIout接老的显示器或者HDMI转DVI接DVI显示器显示不了或者显示内容是彩色条纹,但是这种显示器测试过如果接笔记本或者主机是可以直接显示的。这一类问题是HDMI下的i2c与显示器通讯没成功,读取不到设备的edid。问题包括全志的H3 、AML的S905都有遇到 测试环境…

Qt-事件与信号

事件和信号的区别在于,事件通常是由窗口系统或应用程序产生的,信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装,如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…

【QGroundControl二次开发】二.使用QT编译QGC(Windows)

【QGroundControl二次开发】一.开发环境准备(Windows) 二. 使用QT编译QGC(Windows) 2.1 打开QT Creator,选择打开项目,打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…

vue3-tree-org实现带照片的组织架构图

官方文档&#xff1a;vue3-tree-org 显示照片需要注意的地方 使用步骤 下载 npm install vue3-tree-org --save 在main.js中引入 import "vue3-tree-org/lib/vue3-tree-org.css"; import vue3TreeOrg from vue3-tree-org;app.use(vue3TreeOrg) 实现代码 <tem…

level 6 day2 网络基础2

1.socket&#xff08;三种套接字&#xff1a;认真看&#xff09; 套接字就是在这个应用空间和内核空间的一个接口&#xff0c;如下图 原始套接字可以从应用层直接访问到网络层&#xff0c;跳过了传输层&#xff0c;比如在ubtan里面直接ping 一个ip地址,他没有经过TCP或者UDP的数…

解决TypeError: __init__() takes 1 positional argument but 2 were given

问题描述&#xff1a; 如下图&#xff0c;在使用torch.nn.Sigmoid非线性激活时报错 源代码&#xff1a; class testrelu(nn.Module):def __init__(self):super().__init__()self.sigmoid Sigmoid()def forward(self, input):output self.sigmoid(input)return outputwriter…

记录贴-芋道源码

环境搭建 文字讲解 链接: 芋道源码-环境搭建&#xff08;一&#xff09;后端 链接: 芋道源码-环境搭建&#xff08;二&#xff09;前端 链接: 基于FastGPT和芋道源码挑战一句话生成代码 视频讲解 链接: 芋道源码零基础启动教程&#xff08;上&#xff09; 链接: 芋道源码零基…

Blackbox AI:你的智能编程伙伴

目录 Blackbox AI 产品介绍 Blackbox AI 产品使用教程 Blackbox AI体验 AI问答 代码验证 实时搜索 探索&代理 拓展集成 总结 Blackbox AI 产品介绍 Blackbox是专门为程序员量身定制的语言大模型&#xff0c;它针对20多种编程语言进行了特别训练和深度优化&#xff0c;在AI代…

React 从入门到实战 一一开发环境基础搭建(小白篇)

React 从入门到实战一一开发环境基础搭建&#xff08;小白篇&#xff09; React 介绍什么是 react &#xff1f;react 主要功能react 框架特点 开发工具渲染测试 React 介绍 最近两年&#xff0c;react 也愈来愈火热&#xff0c;想要在里面分一杯羹&#xff0c;那肯定逃不过 r…

UFS协议

1. 名词解释 UFS: universal flash storage SCSI&#xff1a;小型计算机系统接口 SPC&#xff1a;SCSI Primary Commands SBC&#xff1a; SCSI Block Commands Application Client&#xff1a;作为主机中SCSI命令和任务管理功能请求源的实体。 Device Server&#xff1a;设备…

高级java每日一道面试题-2024年7月17日(java内存模型-后期完善)

面试官: 你对java内存模型了解多少? 我回答: Java内存模型&#xff08;JMM&#xff0c;Java Memory Model&#xff09;是Java虚拟机&#xff08;JVM&#xff09;规范的一部分&#xff0c;它定义了线程之间的内存可见性和并发执行时的原子性、有序性和可见性等特性。理解JMM对…