系统理解扩散模型(Diffusion Models):从柏拉图洞穴之喻开始(上)

2023-10-10 07:40

本文主要是介绍系统理解扩散模型(Diffusion Models):从柏拉图洞穴之喻开始(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系统理解扩散模型(Diffusion Models):从柏拉图洞穴之喻开始(上)

  • 柏拉图洞穴之喻
  • 生成模型
  • 证据下界(Evidence Lower Bound)
  • 变分自编码器(Variational Autoencoders)
  • 层级变分自编码器(Hierarchical Variational Autoencoders)

本文参考"Understanding Diffusion Models: A Unified Perspective"

柏拉图洞穴之喻

洞穴之喻(Allegory of the Cave)是柏拉图在《理想国》514-521中描述的对人类知识的基本想象。

洞穴理论

设想在洞穴中有一批囚徒,他们终身呆在那里,被铁链束缚、不能转头,只能看到面前洞壁上的影子。他们身后有一条横贯洞穴的小道,沿小道有一堵矮墙,临着矮墙上方有一堆篝火。有一些特定的人,扛着各种根据现实中的实物所做的模型走过墙后的小道,而火光则把透出墙的器具投影到囚徒面前的洞壁上。对这些囚徒而言,他们能观测到的就是这些从不曾见识过的高维实物的低维投影。

生成模型

类似地,我们在现实世界中观测到的物体也可能是从一个抽象的表示方法(例如结合了形状、颜色、大小等多种特征组合的表示)生成的。然后,正如洞穴之喻中的囚徒观测到的是三维物体的二维投影,我们观测到的物体也是这些抽象概念的某种“投影”。尽管洞穴中的人从未看到过隐藏在身后的物体实体,他们也依然能够这些实体进行推断。同样的道理,我们也能够估计表示我们观测到的数据的潜在变量(latent variable)。一旦掌握了这种表示方法,我们就可以利用其生成新的数据,这就是生成模型的底层思想。

不同的是,洞穴之喻中的潜在变量的维度比实际观测的高;而对于生成模型,我们一般是希望寻找一个更低维度的潜在表示。这大致出于两个原因:一方面,在没有很强先验知识的前提下找到一个比实际观测维度更高的表示十分困难;另一方面,采用更低维度的表示可以看作是一个压缩过程,有助于挖掘有语意意义的结构(semantically meaningful structure)。

证据下界(Evidence Lower Bound)

数学上,我们通过联合分布 p ( x , z ) p(x, z) p(x,z)对观测值 x x x和潜在变量 z z z进行建模。那么,基于似然(likelihood-based)的生成旨在学习模型,最大化所有观测值 x x x的似然函数 p ( x ) p(x) p(x)。根据联合分布 p ( x , z ) p(x, z) p(x,z),我们有两种方式可以推出 p ( x ) p(x) p(x)。第一种是求对于 x x x的边缘概率分布:
p ( x ) = ∫ p ( x , z ) d z \begin{equation} p(x) = \int p(x, z) dz \end{equation} p(x)=p(x,z)dz
第二种则是利用贝叶斯公式进行推导:
p ( x ) = p ( x , z ) p ( z ∣ x ) \begin{equation} p(x) = \frac{p(x, z)}{p(z| x)} \end{equation} p(x)=p(zx)p(x,z)
直接计算并最大化似然函数 p ( x ) p(x) p(x)十分困难:从(1)出发,我们需要对所有的潜在变量 z z z进行积分,遇到复杂的模型更是难上加难;从(2)出发,我们则需要一个真实的潜在编码器(ground truth latent encoder) p ( x , z ) p(x, z) p(x,z)

但是,我们可以利用这两个式子推出证据下界(Evidence Lower Bound, ELBO)。所谓的“证据”即是观测值的对数似然函数(log likelihood),而ELBO正是其下界:
log ⁡ p ( x ) ≥ E q ϕ ( z ∣ x ) [ log ⁡ p ( x , z ) q ϕ ( z ∣ x ) ] \begin{equation} \log p(x) \geq \mathbb{E}_{q_\phi(z|x)}[\log \frac{p(x, z)}{q_\phi(z|x)}] \end{equation} logp(x)Eqϕ(zx)[logqϕ(zx)p(x,z)]
q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx)是一个近似变分分布, ϕ \phi ϕ是要优化的参数,其旨在近似真实的后验(posterior)分布 p ( z ∣ x ) p(z|x) p(zx)。这里,我们利用(2)推导(3):
log ⁡ p ( x ) = log ⁡ p ( x ) ∫ q ϕ ( z ∣ x ) d z = ∫ q ϕ ( z ∣ x ) ( log ⁡ p ( x ) ) d z = E q ϕ ( z ∣ x ) log ⁡ p ( x ) = E q ϕ ( z ∣ x ) [ log ⁡ p ( x , z ) p ( z ∣ x ) ] = E q ϕ ( z ∣ x ) [ log ⁡ p ( x , z ) q ϕ ( z ∣ x ) p ( z ∣ x ) q ϕ ( z ∣ x ) ] = E q ϕ ( z ∣ x ) [ log ⁡ p ( x , z ) q ϕ ( z ∣ x ) ] + E q ϕ ( z ∣ x ) [ log ⁡ q ϕ ( z ∣ x ) p ( z ∣ x ) ] = E q ϕ ( z ∣ x ) [ log ⁡ p ( x , z ) q ϕ ( z ∣ x ) ] + D K L ( q ϕ ( z ∣ x ) ∥ p ( z ∣ x ) ) ≥ E q ϕ ( z ∣ x ) [ log ⁡ p ( x , z ) q ϕ ( z ∣ x ) ] \begin{align} \log p(x) &= \log p(x) \int q_\phi(z|x)dz \\ & = \int q_\phi(z|x) (\log p(x))dz \\ & = \mathbb{E}_{q_\phi(z|x)}\log p(x) \\ & = \mathbb{E}_{q_\phi(z|x)}\left[\log\frac{p(x, z)}{p(z| x)}\right] \\ & = \mathbb{E}_{q_\phi(z|x)}\left[\log\frac{p(x, z)q_\phi(z|x)}{p(z| x)q_\phi(z|x)}\right] \\ & = \mathbb{E}_{q_\phi(z|x)}\left[\log\frac{p(x, z)}{q_\phi(z|x)}\right] + \mathbb{E}_{q_\phi(z|x)}\left[\log\frac{q_\phi(z|x)}{p(z| x)}\right] \\ & = \mathbb{E}_{q_\phi(z|x)}\left[\log\frac{p(x, z)}{q_\phi(z|x)}\right] + D_{KL}(q_\phi(z|x)\ \|\ p(z| x)) \\ & \geq \mathbb{E}_{q_\phi(z|x)}\left[\log\frac{p(x, z)}{q_\phi(z|x)}\right] \end{align} logp(x)=logp(x)qϕ(zx)dz=qϕ(zx)(logp(x))dz=Eqϕ(zx)logp(x)=Eqϕ(zx)[logp(zx)p(x,z)]=Eqϕ(zx)[logp(zx)qϕ(zx)p(x,z)qϕ(zx)]=Eqϕ(zx)[logqϕ(zx)p(x,z)]+Eqϕ(zx)[logp(zx)qϕ(zx)]=Eqϕ(zx)[logqϕ(zx)p(x,z)]+DKL(qϕ(zx)  p(zx))Eqϕ(zx)[logqϕ(zx)p(x,z)]

KL散度: D K L ( P ∥ Q ) = ∑ i P ( i ) log ⁡ P ( i ) Q ( i ) ≥ 0 D_{KL}(P\ \| \ Q) = \sum_i P(i)\log \frac{P(i)}{Q(i)}\geq 0 DKL(P  Q)=iP(i)logQ(i)P(i)0

根据以上分析,我们引入 q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx)来近似真实的后验分布 p ( z ∣ x ) p(z|x) p(zx),这个目标可以通过最小化两者间的KL散度实现。但是,由于我们不知道 p ( z ∣ x ) p(z|x) p(zx),我们无法直接最小化该KL散度。不过,我们可以通过(10)发现,对数似然 log ⁡ p ( x ) \log p(x) logp(x)与参数 ϕ \phi ϕ无关,并且它等于ELBO和上述KL散度的和。因此,我们可以通过最大化ELBO来实现缩小 q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx) p ( z ∣ x ) p(z|x) p(zx)间的差距。此外,优化后的ELBO是对数似然的近似,可以用来估计似然函数 p ( x ) p(x) p(x)

变分自编码器(Variational Autoencoders)

在原始的变分自编码器(Variational Autoencoders,VAE)模型中,我们就是直接最大化ELBO。为了看清它们之间的联系,我们对ELBO作进一步变形:
E q ϕ ( z ∣ x ) [ log ⁡ p ( x , z ) q ϕ ( z ∣ x ) ] = E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x ∣ z ) p ( z ) q ϕ ( z ∣ x ) ] = E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x ∣ z ) ] + E q ϕ ( z ∣ x ) [ log ⁡ p ( z ) q ϕ ( z ∣ x ) ] = E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x ∣ z ) ] − D K L ( q ϕ ( z ∣ x ) ∥ p ( z ) ) \begin{align} \mathbb{E}_{q_\phi(z|x)}\left[\log\frac{p(x, z)}{q_\phi(z|x)}\right] &= \mathbb{E}_{q_\phi(z|x)}\left[\log\frac{p_\theta(x|z)p(z)}{q_\phi(z|x)}\right] \\ &= \mathbb{E}_{q_\phi(z|x)}\left[\log p_\theta(x|z)\right] +\mathbb{E}_{q_\phi(z|x)}\left[\log\frac{p(z)}{q_\phi(z|x)}\right] \\ &= \mathbb{E}_{q_\phi(z|x)}\left[\log p_\theta(x|z)\right] - D_{KL}(q_\phi(z|x) \| \ p(z)) \end{align} Eqϕ(zx)[logqϕ(zx)p(x,z)]=Eqϕ(zx)[logqϕ(zx)pθ(xz)p(z)]=Eqϕ(zx)[logpθ(xz)]+Eqϕ(zx)[logqϕ(zx)p(z)]=Eqϕ(zx)[logpθ(xz)]DKL(qϕ(zx) p(z))
对于VAE,我们学习一个可以看作是编码器(encoder)的分布 q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx),它将输入转化成可能的潜在表示;同时,我们学习一个可以解释为解码器(decoder)的函数 p θ ( x ∣ z ) p_\theta(x|z) pθ(xz),它将给定的潜在变量 z z z转化成观测值 x x x。那么,(14)中,第一项衡量了恢复的似然;第二项衡量了学习到的变分分布和潜在变量先验的差距。因此,最大化ELBO相当于最大化第一项并且最小化第二项,即最大化“似然”和最小化“差距”。

VAE的一个特征是通过变量 θ \theta θ ϕ \phi ϕ对ELBO进行联合优化的方式。具体而言,VAE的编码器通常对多维正态分布进行建模,而先验通常选择为标准多维正态分布:
q ϕ ( z ∣ x ) = N ( z ; μ ϕ ( x ) , σ ϕ 2 ( x ) I ) p ( z ) = N ( z ; 0 , I ) \begin{align} q_\phi(z|x) &= \mathcal{N}(z; \mu_\phi(x), \sigma^2_\phi(x)I) \\ p(z) &= \mathcal{N}(z; 0, I) \end{align} qϕ(zx)p(z)=N(z;μϕ(x),σϕ2(x)I)=N(z;0,I)
因此,(14)式中的KL散度可以写出具体形式,而第一项可以通过蒙特卡洛估计(Monte Caro Estimate)来近似。此时,我们的目标可以写为:
arg max ⁡ ϕ , θ E q ϕ ( z ∣ x ) [ log ⁡ p θ ( x ∣ z ) ] − D K L ( q ϕ ( z ∣ x ) ∥ p ( z ) ) ≈ arg max ⁡ ϕ , θ ∑ l L log ⁡ p θ ( x ∣ z ( l ) ) − D K L ( q ϕ ( z ∣ x ) ∥ p ( z ) ) \begin{align} &\argmax_{\phi, \theta} \mathbb{E}_{q_\phi(z|x)}\left[\log p_\theta(x|z)\right] - D_{KL}(q_\phi(z|x) \| \ p(z))\\ \thickapprox &\argmax_{\phi, \theta} \sum_l^L\log p_\theta(x|z^{(l)}) - D_{KL}(q_\phi(z|x) \| \ p(z)) \end{align} ϕ,θargmaxEqϕ(zx)[logpθ(xz)]DKL(qϕ(zx) p(z))ϕ,θargmaxlLlogpθ(xz(l))DKL(qϕ(zx) p(z))
其中,潜在变量 { z ( l ) } l = 1 L \{z^{(l)}\}^{L}_{l=1} {z(l)}l=1L是由数据集中的所有观测值 x x x通过 q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx)采样得到的。但是,这一随机采样过程通常是不可导的(non-differentiable)。不过,由于 q ϕ ( z ∣ x ) q_\phi(z|x) qϕ(zx)被设计成一个特定的概率分布,我们可以通过重参数化(reparameterization)来解决这个问题。

重参数化技巧在于将一个随机变量表示成一个噪声变量的确定性函数。例如,一个正态分布中的样本 x ∼ N ( x ; μ , σ 2 ) x \sim \mathcal{N}(x; \mu, \sigma^2) xN(x;μ,σ2)可以重新表示为:
x = μ + σ ϵ , with  ϵ ∼ N ( x ; 0 , I ) x = \mu + \sigma \epsilon, \ \text{with}\ \epsilon \sim \mathcal{N}(x; 0, I) x=μ+σϵ, with ϵN(x;0,I)
因此,我们可以先从一个标准正态分布分布采样,然后对结果进行相应的变换,以实现在任意一个正态分布上进行采样。在VAE模型中, z z z可以通过以下方式得到:
z = μ ϕ ( x ) + σ ϕ ( x ) ⊙ ϵ , with  ϵ ∼ N ( x ; 0 , I ) z = \mu_\phi(x) + \sigma_\phi(x) \odot \epsilon, \ \text{with}\ \epsilon \sim \mathcal{N}(x; 0, I) z=μϕ(x)+σϕ(x)ϵ, with ϵN(x;0,I)
⊙ \odot 表示对应元素相乘。此时,我们可以计算 ϕ \phi ϕ的梯度来优化 μ ϕ \mu_\phi μϕ σ ϕ \sigma_\phi σϕ

训练好VAE模型后,我们可以从潜在空间 p ( z ) p(z) p(z)采样后输入到解码器中生成新数据。

层级变分自编码器(Hierarchical Variational Autoencoders)

层级变分自编码器(Hierarchical Variational Autoencoders,HVAE)是对VAE模型的自然扩展,顾名思义,此时我们有多层级的潜在变量,也就是说潜在变量本身也来自于一个其它更高层级、更抽象的潜在变量。回到柏拉图的洞穴之喻,正如我们观测到的三维实体是来自于更高层级的抽象潜在变量,洞穴中的囚徒是将我们观测到的三维实体作为他们二维观测值的潜在变量。因此,对于洞穴中的囚徒而言,他们的观测值此时经过了两层“潜在”建模。

对于一般的HVAE来说,某一层级的潜在变量可由之前所有潜在变量决定。在这里,我们仅讨论一类特殊的HAVE——Markovian HVAE (MHVAE)。对于MHAVE,生成过程是一个马尔可夫链(Markov chain),也就是说每层的潜在变量 z t z_t zt仅由前一层的潜在变量 z t + 1 z_{t+1} zt+1决定。

Markovian HAVE

数学上,我们可以把MHVAE的联合分布和后验分布表示为:
p ( x , z 1 : T ) = p ( z T ) p θ ( x ∣ z 1 ) ∏ t = 2 T p θ ( z t − 1 ∣ z t ) q ϕ ( z 1 : T ∣ x ) = q ϕ ( z 1 ∣ x ) ∏ t = 2 T q ϕ ( z t ∣ z t − 1 ) \begin{align} p(x, z_{1:T}) &= p(z_T)p_\theta(x|z_1)\prod_{t=2}^{T}p_\theta(z_{t-1}|z_t) \\ q_\phi(z_{1:T}|x) &= q_\phi(z_1|x)\prod_{t=2}^Tq_\phi(z_t|z_{t-1}) \end{align} p(x,z1:T)qϕ(z1:Tx)=p(zT)pθ(xz1)t=2Tpθ(zt1zt)=qϕ(z1x)t=2Tqϕ(ztzt1)
进而,我们可以推导出ELBO:
log ⁡ p ( x ) = log ⁡ ∫ p ( x , z 1 : T ) d z 1 : T = log ⁡ ∫ p ( x , z 1 : T ) q ϕ ( z 1 : T ∣ x ) q ϕ ( z 1 : T ∣ x ) d z 1 : T = log ⁡ E q ϕ ( z 1 : T ∣ x ) [ p ( x , z 1 : T ) q ϕ ( z 1 : T ∣ x ) ] ≥ E q ϕ ( z 1 : T ∣ x ) [ log ⁡ p ( x , z 1 : T ) q ϕ ( z 1 : T ∣ x ) ] \begin{align} \log p(x) &= \log \int p(x, z_{1:T}) dz_{1:T} \\ &= \log \int \frac{p(x, z_{1:T})q_\phi(z_{1:T}|x)}{q_\phi(z_{1:T}|x)} dz_{1:T}\\ &= \log \mathbb{E}_{q_\phi(z_{1:T}|x)}\left[\frac{p(x, z_{1:T})}{q_\phi(z_{1:T}|x)}\right] \\ &\geq \mathbb{E}_{q_\phi(z_{1:T}|x)}\left[\log\frac{p(x, z_{1:T})}{q_\phi(z_{1:T}|x)}\right] \end{align} logp(x)=logp(x,z1:T)dz1:T=logqϕ(z1:Tx)p(x,z1:T)qϕ(z1:Tx)dz1:T=logEqϕ(z1:Tx)[qϕ(z1:Tx)p(x,z1:T)]Eqϕ(z1:Tx)[logqϕ(z1:Tx)p(x,z1:T)]

琴生不等式(Jensen’s Inequality): log ⁡ ( ∑ i = 1 n x i n ) ≥ ∑ i = 1 n log ⁡ x i n \log (\sum_{i=1}^n\frac{x_i}{n}) \geq \sum_{i=1}^n\frac{\log x_i}{n} log(i=1nnxi)i=1nnlogxi

代入(19)和(20)可得:
E q ϕ ( z 1 : T ∣ x ) [ log ⁡ p ( x , z 1 : T ) q ϕ ( z 1 : T ∣ x ) ] = E q ϕ ( z 1 : T ∣ x ) [ log ⁡ p ( z T ) p θ ( x ∣ z 1 ) ∏ t = 2 T p θ ( z t − 1 ∣ z t ) q ϕ ( z 1 ∣ x ) ∏ t = 2 T q ϕ ( z t ∣ z t − 1 ) ] \begin{align} &\mathbb{E}_{q_\phi(z_{1:T}|x)}\left[\log\frac{p(x, z_{1:T})}{q_\phi(z_{1:T}|x)}\right] \\= &\mathbb{E}_{q_\phi(z_{1:T}|x)}\left[\log\frac{p(z_T)p_\theta(x|z_1)\prod_{t=2}^{T}p_\theta(z_{t-1}|z_t)}{q_\phi(z_1|x)\prod_{t=2}^Tq_\phi(z_t|z_{t-1})}\right] \end{align} =Eqϕ(z1:Tx)[logqϕ(z1:Tx)p(x,z1:T)]Eqϕ(z1:Tx)[logqϕ(z1x)t=2Tqϕ(ztzt1)p(zT)pθ(xz1)t=2Tpθ(zt1zt)]

这篇关于系统理解扩散模型(Diffusion Models):从柏拉图洞穴之喻开始(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179010

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想