[读书笔记] 从问题和公式角度理解 Diffusion Model

news2024/9/23 7:30:46

[小全读书笔记] 从问题和公式角度理解 Diffusion Model

此读书笔记本意是想理解文章 Denoising Diffusion Probabilistic Models (DDPM),但确实因为里边提到的公式对于跨领域读者有点晦涩难懂,但写者又希望能稍微从公式角度去理解其背后原理,写者进一步借助文章Understanding Diffusion Models: A Unified Perspective进行理解,因此本文主要记录了在阅读和理解后一篇文章的心路历程。

本文会省略掉一些关于模型背景等方面的介绍,而主要集中于理解背后公式的出发点和直观解释。

1. Diffusion Model的结构

图源自于DDPM
Diffusion Model的目标是学习一套模型,能将噪声 x T x_T xT还原成原始图片 x 0 x_0 x0的一套模型,而整个模型的结构包含了两部分:

  • 前向过程:加噪,模型由原始图片逐步变化变成完全的噪声
  • 后向过程:去噪,模型由噪声还原成原始图片

为了方便理解,“前向过程”都会表达成“加噪过程”,“后向过程”都会表达成“去噪过程”

1.1 定义与限制

同时,对模型加之以下定义和限制:

  1. 前向和后向过程均建模成马尔可夫链
    马尔科夫链背后的含义是:任何 t + 1 t+1 t+1时刻的状态只与 t t t时刻的状态有关,而与其他时刻无关,这蕴含着形如这的联合概率可展开成 P ( x t + 2 , x t + 1 ∣ x t ) = P ( x t + 2 ∣ x t + 1 ) P ( x t + 1 ∣ x t ) P(x_{t+2},x_{t+1}|x_t) = P(x_{t+2}|x_{t+1}) P(x_{t+1}|x_t) P(xt+2,xt+1xt)=P(xt+2xt+1)P(xt+1xt) 。这里的推导可以通过联合概率公式展开 P ( y , x ) = P ( y ∣ x ) ∗ P ( x ) P(y,x) = P(y|x) * P(x) P(y,x)=P(yx)P(x)
  2. 加噪过程是无参数的,而去噪过程是有参数的
    在Diffusion Model里,加噪过程的encoder被认为是已知的无需参数优化的,是一个以前一时刻的隐变量为中心的高斯模型,记为 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1),而去噪过程的decoder则是需要学习的模型,记为 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt1xt)
  3. 最终时刻隐变量 x T ∼ N ( 0 , 1 ) x_T\sim N(0,1) xTN(0,1)
  4. 模型所有时刻的隐变量维度与原始图片相同

这些定义与限制对于理解后续的公式非常重要,本人最开始并没有去真正理解这些,导致了最开始理解DDPM以及相关博客地公式都非常困难。当后来我以这些定义和限制为始,并对原文进行阅读时,公式的理解就顺畅许多。Understanding Diffusion Models: A Unified Perspective非常值得阅读。

1.2 定义与限制的数学体现

p ( x 0 : T ) = p ( x 0 , x 1 , . . . , x T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) (1) p(x_{0:T}) = p(x_0, x_1, ..., x_T) = p(x_T) \prod_{t=1}^Tp_\theta(x_{t-1}|x_t) \tag{1} p(x0:T)=p(x0,x1,...,xT)=p(xT)t=1Tpθ(xt1xt)(1)
q ( x t ∣ x t − 1 ) = N ( x t ; α t x t − 1 , ( 1 − α t ) I ) (2) q(x_t|x_{t-1}) = N(x_t;\sqrt{\alpha_t}x_{t-1}, (1-\alpha_t)\Iota)\tag{2} q(xtxt1)=N(xt;αt xt1,(1αt)I)(2)
p ( x T ) = N ( x T ; 0 , I ) (3) p(x_T) = N(x_T;0, \Iota) \tag{3} p(xT)=N(xT;0,I)(3)
公式1 是用了马尔可夫链的性质,其中提到的 p ( x 0 : T ) {p(x_{0:T})} p(x0:T)将会用于后续的求目标函数,公式二则是一个模型选择的问题(为什么模型的均值和方差要采取这种形式?)。

到这里,我们是对diffusion model只是进行了一个定义和限制,以及这种定义之下隐含的数学体现。非常明确的一点是,我们需要对模型的参数部分,也就是后向过程进行参数求解,后续章节则为了参数求解涉及了一套美妙的数学解释。

因为这套数学解释非常复杂,写者在阅读时有两个非常naive的问题:

  1. 既然加噪过程 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1)时已知的,去噪过程本质就是加噪过程的逆分布,不能从数学公式直接推导吗,非得参数化求解?
    答案是No,加噪过程的逆运算 q ( x t − 1 ∣ x t ) = q ( x t ∣ x t − 1 ) q ( x t − 1 ) q ( x t ) q(x_{t-1}|x_t) = \frac{q(x_t|x_{t-1}) q(x_{t-1})}{q(x_t)} q(xt1xt)=q(xt)q(xtxt1)q(xt1),确实有一部分已知,但公式中的 q ( x t − 1 ) , q ( x t ) q(x_{t-1}), q(x_t) q(xt1),q(xt)的分布是完全未知且难以建模的,他们也不能先入为主的认为是 N ( 0 , 1 ) N(0, 1) N(0,1),设想 x 1 x_1 x1,这是原始图片加噪一次的结果,其不可能是正态分布,也不可能被简单的建模,其建模的难度等同于 p ( x 0 ) p(x_0) p(x0)
  2. 既然公式推导不了,为啥不考虑一些简单的损失函数,如对输入图片 x 0 ′ x'_0 x0和groundtruth图片 x 0 x_0 x0做MSE?
    我们可以把diffusion model简化来思考这个问题。假设T=1,这个模型本质就是一个variational auto encoder。若只做MSE,不对中间隐变量 x 1 x_1 x1做任何的regularization,则这个模型进一步退化成auto encoder,模型生成的效果必然很差。auto encoder为什么差,可参照这篇文章的分析。

问题1的思考也给我带来了一些新的insight。加噪过程的逆分布是我们无法得到或者intractable的,diffusion model的目标其实就是利用参数化的去噪过程去学习和逼近我们设想中的加噪过程的逆分布,即 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1}|x_t) pθ(xt1xt)的理想目标就是 q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1)的逆分布。

2. Diffusion Model的模型训练

我们已经有了模型的定义,并且对模型已经参数化了,下一步则是需要进行模型训练,这便需要我们提供一个目标函数,也就是所有隐变量的联合密度函数的对数(取对数只是为了方便计算,应该分布往往都是以指数形式存在,如正态分布)。
l o g ( p ( X ) ) = l o g ( p ( x 0 : T ) ) log(p(X)) = log(p(x_{0:T})) log(p(X))=log(p(x0:T))

Diffusion Model希望最大化概率该密度函数。

在经典的深度学习领域,如分类、检测、分割等,模型的训练往往是需要一个groundtruth的,而目标函数的定义往往衡量的是模型输出与ground truth的差距(如CE、MSE),从而让模型参数朝着减少差距的方向进行参数优化。Diffusion Model的目标函数则无须ground truth,其从统计学的角度建模了随机变量的似然函数,并从最大化似然函数为目标进行求解,3.1小节对最大似然函数进行了补充。

由于 l o g p ( X ) logp(X) logp(X)形式并不能用于求解,需要进行进一步推导,得到易于求解的形式。推导过程我将其分成了几步。

2.1 似然函数转换成ELBO

ELBO貌似是变分推断中常用的一种求解方式,但读者并未完全理解其background以及意义,后续将补充这一相关读书笔记。先留个坑。

图来源于原论文
最后一步用到了Jensen不等式。

对数函数与期望的转换是信息论里常用的应用Jensen不等式的例子。另外,一元函数是否为凸函数可以判断其二阶导是否恒>0,因此 l o g ( x ) log(x) log(x)是满足这一性质的。

2.2 拆解ELBO

图来自原论文图来自原论文
到这里,优化ELBO需要优化三项:

  • E q ( x 1 ∣ x 0 ) [ l o g p θ ( x 0 ∣ x 1 ) ] E_{q(x_1|x_0)}[logp_\theta(x_0|x_1)] Eq(x1x0)[logpθ(x0x1)]: 最大化这一项表示去噪过程的最后一步需要最大成都还原原始图片
  • D K L ( q ( x T ∣ x 0 ) ∣ ∣ p ( x T ) ) D_{KL}(q(x_T|x_0)||p(x_T)) DKL(q(xTx0)∣∣p(xT)): 这一项对参数 θ \theta θ而言是恒定值,可以忽略
  • ∑ t = 2 T E q ( x t ∣ x 0 ) [ D K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ p θ ( x t − 1 ∣ x t ) ) ) ] \sum_{t=2}^{T}E_{q(x_t|x_0)}[D_{KL}(q(x_{t-1}|x_t,x_0)||p_\theta(x_{t-1}|x_t)))] t=2TEq(xtx0)[DKL(q(xt1xt,x0)∣∣pθ(xt1xt)))]: 这一项是表示去噪过程的每一步的分布 p θ ( x t − 1 ∣ x t ) ) p_\theta(x_{t-1}|x_t)) pθ(xt1xt))需要最大化地拟合分布 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)

到这里,一系列推导给出了一个比较直观地理解:我们原本希望 p θ ( x t − 1 ∣ x t ) ) p_\theta(x_{t-1}|x_t)) pθ(xt1xt))希望逼近 q ( x t ∣ x t − 1 ) q(x_{t}|x_{t-1}) q(xtxt1)的逆分布 q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q(xt1xt),而逆分布是intractable的(如1.2小节提到)。通过ELBO以及一些列推导,我们转换成了 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0),而该分布是有可能tractable的,也就是其形式是可知的。一旦知道其形式,就能得到参数优化的求解公式

2.3 求解关键: q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)的显示表达

首先,应用贝叶斯公式:
q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) ∗ q ( x t − 1 ∣ , x 0 ) q ( x t ∣ x 0 ) = q ( x t ∣ x t − 1 ) ∗ q ( x t − 1 ∣ , x 0 ) q ( x t ∣ x 0 ) q(x_{t-1}|x_t,x_0) = \frac{q(x_{t}|x_{t-1},x_0) * q(x_{t-1}|,x_0)}{q(x_{t}|x_0)}= \frac{q(x_{t}|x_{t-1}) * q(x_{t-1}|,x_0)}{q(x_{t}|x_0)} q(xt1xt,x0)=q(xtx0)q(xtxt1,x0)q(xt1,x0)=q(xtx0)q(xtxt1)q(xt1,x0)

q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1)的分布密度函数是已知的,上述问题的关键就转换成了求 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0)的显示表达。这里需要用到一个重参技巧(reparameterization trick:

x t ∼ q ( x t ∣ x t − 1 ) = N ( x t ; α t x t − 1 , ( 1 − α t ) I ) x_t \sim q(x_t|x_{t-1}) = N(x_t;\sqrt{\alpha_t}x_{t-1}, (1-\alpha_t)\Iota) xtq(xtxt1)=N(xt;αt xt1,(1αt)I),转换为
x t = α t x t − 1 + 1 − α t ϵ , ϵ ∼ N ( 0 , I ) x_t = \sqrt{\alpha_t}x_{t-1} + \sqrt{1-\alpha_t}\epsilon, \epsilon \sim N(0, \Iota) xt=αt xt1+1αt ϵ,ϵN(0,I)
以此类推,就比较容易得到下列事实:
x t ∼ q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) x_t \sim q(x_t|x_0) = N(\sqrt{\bar{\alpha}_t}x_0,(1-\bar\alpha_t)\Iota) xtq(xtx0)=N(αˉt x0,(1αˉt)I)

图来自于原论文
因此, q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)的形式也比较容易得到,这里也不展开了。

综上,Diffusion Model的最大似然函数的优化目标可以显示地表达出来,结合我们训练数据即可得到我们的最优参数。

一个非常有趣的感悟是:也许一开始有人会想到 q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q(xt1xt)是intractable,而 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)可以借助贝叶斯公式变成tractable。直接用 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0)近似 q ( x t − 1 ∣ x t ) q(x_{t-1}|x_t) q(xt1xt)求解,即可免去了上述一系列的ELBO及其后续的推导。这种近似虽然直觉上很好理解并觉得合理,但却缺乏数学支持而显得非常无力并难以信服。数学推导尽管痛苦,但却从理论上保证了可行性,这回答了一个非常本质的问题:以这个目标函数训练为什么能work。人们常说,人是无法赚到认知以外的钱的。而数学原理的保障给我们提供了认知,让我们能赚到这里面的钱:那就是确保模型训练的有效性,这莫不是是数学之美的一个体现。

3. 附录

3.1 最大化似然函数

这里举个最大化似然函数求解的例子。假设已知随机变量 x ∼ N ( θ , σ 2 ) x \sim N(\theta, \sigma^2) xN(θ,σ2),现在有俩抽样样本,值分别1,2。则似然函数刻画的是出现这俩样本的概率
P ( x 1 = 1 , x 2 = 2 ) = P ( x 1 = 1 ) ∗ P ( x 2 = 2 ) = 1 2 π σ e x p ( − ( 1 − μ ) 2 2 σ 2 ) ∗ 1 2 π σ e x p ( − ( 2 − μ ) 2 2 σ 2 ) \begin{aligned} P(x_1 = 1, x_2 = 2) & = P(x_1 = 1) * P(x_2 = 2) \\ & = \frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(1-\mu)^2}{2\sigma^2}) * \frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(2-\mu)^2}{2\sigma^2}) \\ \end{aligned} P(x1=1,x2=2)=P(x1=1)P(x2=2)=2π σ1exp(2σ2(1μ)2)2π σ1exp(2σ2(2μ)2)
取对数后则为
l o g ( P ( x 1 = 1 , x 2 = 2 ) ) = − l o g ( 2 π ) − 2 l o g ( σ ) − 1 2 σ 2 ( ( 1 − μ ) 2 + ( 2 − μ ) 2 ) \begin{aligned} log(P(x_1 = 1, x_2 = 2)) & = -log(2\pi) - 2log(\sigma) - \frac{1}{2\sigma^2}((1-\mu)^2 + (2-\mu)^2) \end{aligned} log(P(x1=1,x2=2))=log(2π)2log(σ)2σ21((1μ)2+(2μ)2)

然后通过求导求最大值的方式得到 μ = μ ∗ , σ = σ ∗ \mu=\mu^*,\sigma = \sigma* μ=μ,σ=σ

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

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

相关文章

垃圾回收概述

什么是垃圾 垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题: 哪些内存需要回收?什么时候回收?如何回收? 垃圾收…

在线审片工具是什么,安捷秀如何在线审片?

当影视内容完成拍摄后,即进入漫长、繁复的后期制作过程,审片就是后期制作过程中一个非常重要的环节。传统的审片需要专门的场地、音画设备,召集人员在特定时间进行,人财物的成本都非常高,在此情况下,在线审…

GeoServer使用MySQL数据库出现“Error decoding wkb”错误的一种情况

错误 请看一下GeoServer官方文档的警告 Warning:Currently the MySQL extension is unmaintained and carries unsupported status. While still usable, do not expect the same reliability as with other extensions. 没事不要特立独行使用MySQL当GeoServer的空间数据库&am…

文件和用户管理

Linux基础 提示:个人学习总结,仅供参考。 一、Linux系统部署 二、服务器初始化 三、文件和用户管理 提示:文档陆续更新整理 文件和用户管理 Linux基础一、Linux目录结构二、文件管理1.文件类型2.文件管理命令 三、用户管理1. 用户/组基本概…

MySQL隐式类型转换

当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐式发生的。例如,MySQL会根据需要自动将字符串转换为数字,反之亦然。 转换规则 如果一个或两个参数都为NULL,则比较结果为NULL 。但是相等比较…

Android Wifi 扫描

今天拿了个新需求,要求为工厂开发一个扫地机模组检测功能的App,需求逻辑: 1.可以选择机器支持的WBR3 模组和WR3 模组; 2.可以选择机器热点名称的前缀:Thamtu 和 SmartLife,还有自定义输入前缀&#xff1b…

Java概述

Java语言简史: 是SUN(Stanford University Network,斯坦福大学网络公司 ) 1995年推出的一门高级编程语言。 是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。这些Java程序被称为Java小程序(applet&…

foldersync使用感受

foldersync简介 ​ FolderSync pro是一款功能非常强大的设备本地存储(包括SD卡)文件/文件夹与云存储同步应用。它可以将手机中的文件自动同步到云端空间,支持包括 FTP、WebDAV、Dropbox、 Google Docs 在内的众多空间。 FolderSync Pro 支持各种不同的云服务商和文件…

CTA策略趋势类

趋势策略 趋势策略日内策略Hilbert 策略R-Braker 策略Dual Thrust 策略菲阿里四价策略空中花园策略 日间策略移动平均线MACD 策略Aberration 策略ATR 策略动量策略肯特纳通道自动识别趋势的追涨交易策略 趋势策略 市场只有两种状态:震荡和单边。 而两种市场状态只…

springboot项目:瑞吉外卖 前后端详细分析 part4

part 1 part 2 part 3 part 4 本页 文章目录 5 套餐管理5.1 新增套餐5.1.1 整体分析5.1.2 前端分析5.1.3 后端分析 持续更新中 5 套餐管理 5.1 新增套餐 5.2 套餐信息分页查询 5.3 删除套餐 其他小功能都比较简单且类似,不再赘述 5.1 新增套餐 5.1.1 整体分析 套…

jmeter取样器javaRequest脚本8

1,创建一个maven工程2,通过maven编译打包生成一个jar包3,重启jmeter,新建java request请求4,开始执行脚本本文永久更新地址: 1,创建一个maven工程 在pom.xml文件中添加 maven下载地址:https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMe…

【MySQL】关于 SQL 语句执行分析的二三事

一、为什么要发生这件事 确实, 平时我们增删改查写的好好的, 各种业务代码,各种小接口写的不亦乐乎,正常是没时间干这个的,但是但是,这不是还有点技术追求嘛,假如我们平时测一个小接口&#xf…

【LeetCode】199.二叉树的右视图

1.问题 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出: [1,3] 示例 3: 输入: [] 输出: []…

类加载过程

基本说明 反射机制是Java实现动态语言的关键,也就是通过反射实现类动态加载。 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强动态加载:运行时加载需要的类,如果运行时不用该类,即使…

C++关于线程的一些操作

线程创建和接收 std::this_thread::get_id()获取当前线程的线程ID std::this_thread::yield()让步结束当前线程的时间片 int main() {vector<thread> threads(2);threads[0] thread([]() {cout << this_thread::get_id() << endl;});threads[1] thread([](…

Baumer工业相机中偏振相机如何使用Baumer堡盟GAPI SDK来进行偏振数据的计算转换输出(C#)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

ansible自动运维——ansible使用临时命令通过模块来执行任务

大家好&#xff0c;这里是天亮之前ict&#xff0c;本人网络工程大三在读小学生&#xff0c;拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识&#xff0c;希望能提高自己的技术的同时&#xff0c;也可以帮助到大家 另外其它专栏请关注&#xff1a; 锐捷数通实验&…

【机器学习实战】Python基于SVD奇异值分解进行矩阵分解(八)

文章目录 1 前言1.1 奇异值分解1.2 奇异值分解的应用 2 简单计算SVD2.1 NumPy 计算 SVD2.2 scikit-learn 计算截断 SVD2.3 scikit-learn 计算随机 SVD 3 demo数据演示3.1 导入函数3.2 导入数据3.3 计算SVD 4 讨论 1 前言 1.1 奇异值分解 奇异值分解&#xff08;Singular Valu…

信息安全复习四:置换密码乘积密码隐写术

一、章节梗概 置换密码、Rail Fence密码、行置换密码、乘积密码、转子机、隐写术 二、置换技术 2.1 定义 重新排列明文字母&#xff0c;达到信息加密的目的。 与替代密码不同的是&#xff0c;原来明文中的字母同样出现在密文中&#xff0c;只是顺序被打断。 古典的置换密码…

.net6 core Worker Service项目发布部署到Linux,以守护进程服务的形式部署启动

一、发布项目 1、以文件夹形式 2、目标运行时选对应的平台&#xff08;Linux-x64&#xff09; 3、文件夹选项&#xff1a;在发布前删除所有现有文件 二、部署项目&#xff08;安装.net6环境&#xff1a;参考Linux安装 dotnet sdk 6.0&#xff09; &#xff08;1&#xff09;…