Diffusion Model原理剖析

目录

前言

接着上篇文章 图像生成模型浅析(Stable Diffusion、DALL-E、Imagen) 继续学,这里主要讲解 Diffusion Model 背后的数学原理🤗

纯理论博主也看不懂,硬着头皮先记录下来了,指不定哪天突然悟了👀

以下内容来自于李宏毅老师的视频讲解

课程主页:https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php

视频链接:机器学习2023(生成式AI)

1. DDPM演算法初览

Diffusion Model 的概念我们在 图像生成模型浅析(Stable Diffusion、DALL-E、Imagen) 文章中已经讲过了,这里再来回顾一下:

在这里插入图片描述

Diffusion Model 中有一个 Forward Process 的过程,它就是把 noise 加到 image 里面去直到你看不出原来的图长什么样子,那还有一个 Reverse Process 的过程,它就是做 Denoise,你先给它一个全部都是 noise 的 image,那每次 Denoise 的过程中这个图像都会浮现一点点出来,直到最后完整的图像被产生出来,这个就是 Diffusion Model 的概念。

在这里插入图片描述

VAE 跟 Diffusion Model 其实非常的类似,等会讲数学原理的时候我们先稍微讲一下 VAE 再讲 Diffusion Model。VAE 是先有一个 Encoder 把 image 变成 Latent Representation 然后再有一个 Decoder 把这个 Latent Representation 还原回 image;Diffusion Model 中加 noise 的过程你可以想成在做 Encoder,只是这个 Encoder 不是一个 neural network,不是 learn 出来的,这个 noise 加进去的 process 是已经固定好的,它不需要学习,是人设计的

那你通过加 noise 的过程,加 N 次 noise 把一张 image 变成一个只有噪声的东西,完全看不出来它是什么,那这个只有噪声的 image 就相当于 VAE 里面的 Latent Representation,然后 Denoise 的过程就相当于 VAE 里面的 Decoder 将都是噪声的图还原成原来的图,这个是 Diffusion Model 跟 VAE 的关联

其实 Diffusion Model 的演算法非常的简单,在 DDPM 这篇原始的 paper 里面其实就是下面两个 Algorithm,但是前面我们讲这个演算法里面其实暗藏玄机!你会发现似乎跟我们前面讲的概念有一些不一样的地方

在这里插入图片描述

那我们就来看看这个演算法里面在做什么,先来看训练的演算法

在这里插入图片描述

在训练的演算法里面第一行是 repeat 就是一直重复第二行到第五行的这些事情直到 converged。第二行做的事情是说我们先要 sample 一张 image 叫做 x 0 \mathbf{x}_{0} x0,在 Diffusion Model 的文献中通常把 x 0 \mathbf{x}_{0} x0 当作是干净的图,就是真正的图你要生成的图,所以 x 0 \mathbf{x}_{0} x0 代表的是干净的图,也就是从你收集到的图像的数据库里面抽一张图出来就是 x 0 \mathbf{x}_{0} x0 也就是第二行做的事情

而第三行呢是 sample 一个 t t t { 1 , … , T } \{1,\ldots,T\} {1,,T} 这个数字间 sample 一个整数出来,那这个 T T T 会设置一个比较大的数字比如 1000,所以从 1~1000 里面 sample 一个数字出来比如说 666

然后接下来你会有一个 ϵ \epsilon ϵ,这个 ϵ \epsilon ϵ 是从一个 normal distribution 里面 sample 出来的,那这个 normal distribution 它的 mean 是 0,每一个 dimension variance 都固定是 1,就从这个 normal distribution 里面 sample 出一个 ϵ \epsilon ϵ 出来,那这个 ϵ \epsilon ϵ 它的大小跟 image 是一样的,不过它里面全部都是噪声,所以你看不到任何有意义的东西

接下来第五行是比较复杂的,我们先看 α ˉ t x 0 + 1 − α ˉ t ϵ \sqrt{\bar{\alpha}_{t}}\mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}}\boldsymbol\epsilon αˉt x0+1αˉt ϵ 做的事情, α ˉ t x 0 + 1 − α ˉ t ϵ \sqrt{\bar{\alpha}_{t}}\mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}}\boldsymbol\epsilon αˉt x0+1αˉt ϵ 做的事情是把 x 0 \mathbf{x}_{0} x0 ϵ \epsilon ϵ 做 weighted sum,那这个 weighted sum 的 weight 是什么呢?这个 weight 是事先定好的 α ˉ 1 , α ˉ 2 , . . . α ˉ T \bar{\alpha}_1,\bar{\alpha}_2,...\bar{\alpha}_T αˉ1,αˉ2,...αˉT,我们事先定好了一组 weight 从 α ˉ 1 \bar{\alpha}_1 αˉ1 α ˉ T \bar{\alpha}_T αˉT,那你把 x 0 \mathbf{x}_{0} x0 ϵ \epsilon ϵ 做 weighted sum 以后你得到的就是一个有噪声的图,也就是说 α ˉ t x 0 + 1 − α ˉ t ϵ \sqrt{\bar{\alpha}_{t}}\mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}}\boldsymbol\epsilon αˉt x0+1αˉt ϵ 代表的是一张有噪声的图

α ˉ 1 , α ˉ 2 , . . . α ˉ T \bar{\alpha}_1,\bar{\alpha}_2,...\bar{\alpha}_T αˉ1,αˉ2,...αˉT 通常的设计是由大到小,所以今天你 sample 到的这个 t t t 越大的话,那 α ˉ t \bar{\alpha}_t αˉt 越小,意味着原来的图 x 0 \mathbf{x}_{0} x0 占的比例越少,那你的 noise 即 ϵ \epsilon ϵ 占的比率越多,所以 sample 到的这个 t t t 越大代表说我们的 noise 加得越凶狠

那我们在 α ˉ t x 0 + 1 − α ˉ t ϵ \sqrt{\bar{\alpha}_{t}}\mathbf{x}_{0}+\sqrt{1-\bar{\alpha}_{t}}\boldsymbol\epsilon αˉt x0+1αˉt ϵ 中就得到了一张 noise 的 image,接下来做的事情是什么呢?这边有一个看起来比较复杂的式子 ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) \boldsymbol{\epsilon}_\theta(\sqrt{\bar{\alpha}_t}\mathbf{x}_0+\sqrt{1-\bar{\alpha}_t}\boldsymbol{\epsilon},t) ϵθ(αˉt x0+1αˉt ϵ,t) 将 noise 的 image 跟 t t t 当做 ϵ θ \boldsymbol{\epsilon}_\theta ϵθ 这个 function 的输入,那这个 ϵ θ \boldsymbol{\epsilon}_\theta ϵθ 就是 Noise predictor 啊,它就是 predict noise 的那个 network,这个 noise predictor 的 network 就是吃一张 noise 的 image 跟一个 sample 到的数字 t t t 然后就产生一个 noise

那我们现在要学习的目标是什么呢?我们这个 Noise predictor 它要 output 的目标是什么,它的 ground truth 是什么,它的正确答案是什么呢?正确答案其实就是你当初 smaple 出来的那个 noise 也就是 ϵ \epsilon ϵ

整个过程的描述如下图所示:

在这里插入图片描述

那如果看这个演算法你没有看得懂得话,这边画个图跟你说明一下,如下图所示:

在这里插入图片描述

我们先准备好一排数值 α ˉ 1 , α ˉ 2 , . . . α ˉ T \bar{\alpha}_1,\bar{\alpha}_2,...\bar{\alpha}_T αˉ1,αˉ2,...αˉT,然后从你的数据库里面抽一张图 x 0 \mathbf{x}_{0} x0 出来,sample 一个 noise 出来,sample 一个整数 t t t 出来,然后我们就把我们 sample 到的干净的图乘以一个比例 α ˉ t \bar{\alpha}_{t} αˉt 加上噪声乘以一个比例 1 − α ˉ t 1-\bar{\alpha}_{t} 1αˉt 得到一个噪声的图,接下来你要训练 Noise Predicter 它就是吃这个有噪声的图和一个整数然后去预测混入的噪声 ϵ \epsilon ϵ 长什么样子。这个实际上是 DDPM、Diffusion Model 它的演算法真正做的事情

如果你再回忆我们上篇文章讲的东西你会发现其实有点不太一样,上次讲的 Diffusion Model 是一个概念中的讲法,就是我们想象中这个 Diffusion Model 的运作应该是下面这个样子的:

在这里插入图片描述

首先你有个最干净的 image 加点噪声变得有点模糊,再多加一点噪声变得更模糊,然后你每次训练你的 Noise Predicter 的时候它是把有噪声的 image 当作输入然后再给它一个 Step ID 的数值,然后它要预测的是混入图片中的这个噪声,最后的结果是要把有噪声的图还原成原始输入的没有那么多噪声的图

在这里插入图片描述

但是 DDPM 演算法做的事情是干净的图直接混入一个噪声,那这个噪声通过 α ˉ t \bar{\alpha}_{t} αˉt 来决定它的大小,然后训练的时候就是把有噪声的图跟 t t t 当作输入直接预测混入的噪声。

那你发现说实际上做的事情跟我们想象中做的事情其实是有点不一样,在我们想象中噪声是一点一点加进去的,Denoise 的时候也是把噪声一点一点的抹去,但是实际上我们真正做的事情,噪声并没有一步一步的加进去,并没有加多次噪声这件事,一次就把噪声 ϵ \epsilon ϵ 加进去,然后在 Denoise 的时候也是一次就要把 ϵ \epsilon ϵ Denoise 出来,DDPM 的演算法就是这个样子

OK,我们再来看看产生图的过程,产生图的过程的演算法如下所示:

在这里插入图片描述

我们一开始先 sample 一个全部都是 noise 的图叫做 x T \mathbf{x}_{T} xT,那在 Diffusion Model 的文献里面通常把 x T \mathbf{x}_{T} xT 代表一个纯粹都是噪声的图,我们 sample 了一个纯粹都是噪声的图,接下来就开始跑 Reverse Process 把图产生出来

那它总共要跑 T T T 批次,所以 t = T , … , 1 t=T,\ldots,1 t=T,,1,那你发现每次生图的时候首先它都要先 sample 一个 noise 出来,在第三行又再 sample 了一次 noise,就第一行已经 sample 过一次 noise 得到 x T \mathbf{x}_{T} xT 了,这边不知道为什么居然还要再 sample 一次得到 z \mathbf{z} z

第四行就是计算 Denoise 的结果,这个式子看着有点复杂,我们下面用图的方式来呈现:

在这里插入图片描述

首先上一个 iteration 产生出来的图叫 x t \mathbf{x}_{t} xt,然后你要准备两组数值 α ˉ 1 , α ˉ 2 , . . . α ˉ T \bar{\alpha}_1,\bar{\alpha}_2,...\bar{\alpha}_T αˉ1,αˉ2,...αˉT 还有 α 1 , α 2 , . . . α T \alpha_1,\alpha_2,...\alpha_T α1,α2,...αT,然后 Noise Predicter 吃 x t \mathbf{x}_{t} xt 这张图当作输入吃 t t t 当作输入,产生一个 noise prediction 的结果 ϵ θ ( x t , t ) \boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t) ϵθ(xt,t),它会 predict 出一个 noise 出来,然后把这个减掉 x t \mathbf{x}_{t} xt,这个 noise 减之前你要乘上一个常数 1 − α t 1 − α ˉ t \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}} 1αˉt 1αt,那这一项的大小取决于现在在第几个 iteration,那相减之后得到 ( x t − 1 − α t 1 − α ˉ t ϵ θ ( x t , t ) ) \left(\mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar{\alpha}_t}}\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t)\right) (xt1αˉt 1αtϵθ(xt,t))

之后你要乘上一个常数 1 α t \frac1{\sqrt{\alpha_t}} αt 1,但是这居然不是我们最终的结果,本来在我们的想象里面我们就是把 noise 给 predict 出来,然后把又噪声的图减掉噪声应该得到更干净的图,照理说应该就是这个样子就结束了,那这里有个奇怪的玄机,不知道为什么还要再 sample 一个噪声,把这个噪声再加到你的图像里面去得到最终的输出 x t − 1 \mathbf{x}_{t-1} xt1

这个也是一个令人匪夷所思的操作,所以说这个 DDPM 其实它的演算法里面是暗藏玄机的,下面我们就来一起探讨下为什么会是这个样子的

2. 图像生成模型共同目标

这边还是要从图像生成模型本质上共同的目标开始讲起

在这里插入图片描述

那图像生成模型本质上共同的目标是什么?它们本质上共同的目标是:在 input 的地方你有一个简单的 Distribution,你知道怎么做 sample 的 Distribution,通常就是一个 Gaussian Distribution,那可能设成 mean 是 0,然后每一个 dimension 的 variance 是 1,就这样一个简单的 Distribution,那从这里面 sample 一个东西出来比如一个 vector,然后把这个 vector 丢到一个 network 里面去,这个 network 我们用 G G G 来表示,它的输入是从 Gaussian Distribution 里面 sample 出来的 vector z z z,输出是 x x x,那这个 x x x 就是一张图片

我们每次从 input 这个简单的 Distribution sample 一个 vector 出来,那通过一个 network 就变成一张图片,sample 一个 vector 出来通过 network 就变成一张图片。就算是输入是一个非常简单的 Gaussian Distribution 通过这个 network 的转换它输出会变成一堆图片,这些图片会组合成一个非常复杂的 Distribution,而我们期待的事情是我们找到一个 network,这个 network 应该做到的事情是产生出来的图片跟真正的图片的 Distribution 越接近越好,这个是图像生成模型本质上所有各种不同的方法都在奋斗的目标

在这里插入图片描述

那我们知道说今天做图像生成模型也不是只有生成图而已,通常更常见的应用是直接给一段文字叫你把图生出来,那在原理上跟我们刚才讲的图像生成模型本质上共同的目标并没有什么不同,只是多加了一段文字,我们叫做 condition,通过多加了 condition 以后我们生成出来的是根据这个 condition 所产生出来的图片,但是它仍然是一个 Distribution

我们前面有讲过,当你说“一只在奔跑的狗”,虽然文字是一只在奔跑的狗但是图像它可以千变万化,一张图胜过千言万语,只拿一个句子是没办法描述一张图的,所以当你只输入一段文字要机器生成图片的时候,它的目标其实是产生一个 distribution,产生所有各式各样在奔跑的狗。那我们的目标呢一样是要让今天产生出来的 distribution 跟真正的 distribution 越接近越好,所以当图像生成模型有加上文字的 condition 的时候并没有什么本质上的差异

我们接下来都假设没有这个 condition,这样数学推导更简洁一点,但是在实际应用的时候有加上这个文字的 condition 并不会影响你的演算法

在这里插入图片描述

OK,那我们刚才讲我们的目标就是希望这个 network 它输入从某一个 distribution sample 出来的东西然后产生另外一个 distribution,而它产生出来的 distribution 应该跟我们目标的 distribution 越接近越好

但是什么叫做越接近越好呢?怎么衡量所谓的两个 distribution 越接近越好这件事呢?那多数的这个图像生成模型采取的都是 Maximum Likelihood Estimation(MLE)最大似然估计,什么叫 MLE 呢?它的操作是这样子的,我们假设 network 它的参数我们用 θ \theta θ 来表示,然后这个 network 产生出来的这个 distribution 我们用 P θ P_\theta Pθ 来表示,真正的 distribution 我们用 P d a t a P_{data} Pdata 来表示

那 MLE 是这样运作的,首先我们从 P d a t a ( x ) P_{data}(x) Pdata(x) 里面 sample 出一堆的 image { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm},那这个步骤其实就是你今天在训练模型的时候你需要一些训练数据,那这些训练数据你要想办法找到,可能是你在网络上收集的,可能是你买来的,总之你收集到了一堆训练数据,那你收集训练数据这个过程其实就是从全世界所有可能的图也就是 P d a t a ( x ) P_{data}(x) Pdata(x) 里面取样出一些 image 出来,取样一些图片出来,所以我们从 P d a t a ( x ) P_{data}(x) Pdata(x) 里面取样一些图出来就是 { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm}

那这边我们假设随便给定一张图 x i x^i xi 我们都能够计算 P θ ( x i ) P_{\theta}(x^i) Pθ(xi),也就是通过参数是 θ \theta θ 的 network 产生某一张图的机率,那这件事情实际上可能是做不到的,因为 P θ P_{\theta} Pθ 非常的复杂,它不是一个 Gaussian Distribution,它是一个非常非常复杂,你难以想象的 distribution,那既然它是一个你难以想象的 distribution,随便给你一张图,你可能是算不出这个图根据这个 distribution 产生出来的机率的,但是没关系我们就是先假设我们可以做到这件事情

OK,假设我们能够计算出这个 distribution 产生某一张图的机率,那接下来我们要找什么样的 θ \theta θ 呢?我们要找的 θ \theta θ 就是可以让我们 sample 到的这些图产生出来的机率最高的那个 θ \theta θ,那你的 objective function 你要去 maximize 的目标就是 KaTeX parse error: Expected group after '_' at position 17: …theta^*=arg\max_̲\limits{\theta}…

你要去找一组参数,这组参数可以让 KaTeX parse error: Expected group after '_' at position 6: \prod_̲\limits{i=1}^mP… 这个式子的值最大,这个式子就是对你 sample 到的每一张图你都拿 P θ P_{\theta} Pθ 去算它产生出来的机率,你把 sample 到的图 { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm} 每一张都计算 P θ P_{\theta} Pθ 产生它的机率然后全部乘起来,你要找一个 θ \theta θ { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm} 产生出来的机率越大越好,这个可以让 { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm} 产生出来机率最大的那个 θ \theta θ 我们叫做 θ ∗ \theta^* θ,这个就是我们今天学习的时候要找出来的结果

那其实不同的图像生成模型它们用的都是这种 MLE,就是要想办法让产生 sample 出来的 image { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm} 的机率越大越好,那如果你对 MLE 熟悉的话那这个操作也许对你来说非常自然的,但是有人会问说到底让这些 { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm} 产生出来的机率越大越好是什么意思,跟让 P θ P_{\theta} Pθ P d a t a P_{data} Pdata 越接近越好有什么样的关系呢?

接下来我们就来说明 Maximum Likelihood Estimation 跟让两个 distribution 越接近越好的关联性是什么
θ ∗ = a r g max ⁡ θ ∏ i = 1 m P θ ( x i ) = a r g max ⁡ θ l o g ∏ i = 1 m P θ ( x i ) = a r g max ⁡ θ ∑ i = 1 m l o g P θ ( x i ) ≈ a r g max ⁡ θ E x ∼ P d a t a [ l o g P θ ( x ) ] = a r g max ⁡ θ ∫ x P d a t a ( x ) l o g P θ ( x ) d x − ∫ x P d a t a ( x ) l o g P d a t a ( x ) d x = a r g max ⁡ θ ∫ x P d a t a ( x ) l o g P θ ( x ) P d a t a ( x ) d x = a r g min ⁡ θ K L ( P d a t a ∣ ∣ P θ ) \begin{aligned} \theta^{*}&=arg\max_{\theta}\prod_{i=1}^{m}P_{\theta}\big(x^{i}\big) =arg\max_{\theta}log\prod_{i=1}^{m}P_{\theta}\big(x^{i}\big) \\ &=arg\max_\theta\sum_{i=1}^mlogP_\theta(x^i)\approx arg\max_\theta E_{x\sim P_{data}}[logP_\theta(x)] \\ &=arg\max_{\theta}\int_{x}P_{data}(x)logP_{\theta}(x)dx -\int_{x}P_{data}(x)logP_{data}(x)dx \\ &=arg\max_{\theta}\int_{x}P_{data}(x)log\frac{P_{\theta}(x)}{P_{data}(x)}dx =arg\min_{\theta}KL(P_{data}||P_{\theta}) \end{aligned} θ=argθmaxi=1mPθ(xi)=argθmaxlogi=1mPθ(xi)=argθmaxi=1mlogPθ(xi)argθmaxExPdata[logPθ(x)]=argθmaxxPdata(x)logPθ(x)dxxPdata(x)logPdata(x)dx=argθmaxxPdata(x)logPdata(x)Pθ(x)dx=argθminKL(Pdata∣∣Pθ)
这个推导中的某些过程博主没有看懂,因此让 ChatGPT 帮忙解释了一下,如下所示:(from ChatGPT)

这个推导用来展示如何通过最大化似然函数来让模型产生的分布 P θ P_{\theta} Pθ 逼近真实数据的分布 P d a t a P_{data} Pdata,让我们逐步分析这个过程:

1. 最大似然估计(MLE)

最大似然估计的目标是找到参数 θ \theta θ 使得模型产生观测数据的概率最大。对于独立同分布(i.i.d.)的数据样本 { x i } i = 1 m \{x^i\}_{i=1}^m {xi}i=1m,似然函数是所有数据样本概率的乘积:
∏ i = 1 m P θ ( x i ) \prod_{i=1}^m P_\theta(x^i) i=1mPθ(xi)
这个乘积直接最大化通常不便于处理,所以我们转而最大化其对数似然函数(对数是单调增函数,不改变最大值位置):
log ⁡ ∏ i = 1 m P θ ( x i ) = ∑ i = 1 m log ⁡ P θ ( x i ) \log\prod_{i=1}^m P_\theta(x^i) = \sum_{i=1}^m \log P_\theta(x^i) logi=1mPθ(xi)=i=1mlogPθ(xi)
这里 log ⁡ P θ ( x i ) \log P_\theta(x^i) logPθ(xi) 是第 i i i 个数据样本在参数为 θ \theta θ 的模型下的对数似然。

2. 期望的引入

当样本量 m m m 非常大时,求和 ∑ i = 1 m log ⁡ P θ ( x i ) \sum_{i=1}^m \log P_\theta(x^i) i=1mlogPθ(xi) 可以通过期望来近似:
1 m ∑ i = 1 m log ⁡ P θ ( x i ) ≈ E x ∼ P d a t a [ log ⁡ P θ ( x ) ] \frac{1}{m} \sum_{i=1}^m \log P_\theta(x^i) \approx E_{x \sim P_{data}}[\log P_\theta(x)] m1i=1mlogPθ(xi)ExPdata[logPθ(x)]
其中 E x ∼ P d a t a [ log ⁡ P θ ( x ) ] E_{x \sim P_{data}}[\log P_\theta(x)] ExPdata[logPθ(x)] 表示对于真实数据分布 P d a t a P_{data} Pdata 的期望,这是因为大数定律指出,随着样本量 m m m 的增加,样本均值会趋向于总体期望值。

因此,我们的优化目标变成最大化这个期望:
a r g max ⁡ θ ∑ i = 1 m log ⁡ P θ ( x i ) ≈ a r g max ⁡ θ m E x ∼ P d a t a [ log ⁡ P θ ( x ) ] arg\max_\theta \sum_{i=1}^m \log P_\theta(x^i) \approx arg\max_\theta m E_{x \sim P_{data}}[\log P_\theta(x)] argθmaxi=1mlogPθ(xi)argθmaxmExPdata[logPθ(x)]
因为 m m m 是一个常数,优化这个表达式等价于优化 E x ∼ P d a t a [ log ⁡ P θ ( x ) ] E_{x \sim P_{data}}[\log P_\theta(x)] ExPdata[logPθ(x)]

3. Kullback-Leibler 散度(KL 散度)

接下来,公式通过引入 KL 散度来进一步说明这一点:
∫ x P d a t a ( x ) log ⁡ P θ ( x ) d x − ∫ x P d a t a ( x ) log ⁡ P d a t a ( x ) d x \int_x P_{data}(x) \log P_\theta(x) \, dx - \int_x P_{data}(x) \log P_{data}(x) \, dx xPdata(x)logPθ(x)dxxPdata(x)logPdata(x)dx
这里第一项 ∫ x P d a t a ( x ) log ⁡ P θ ( x ) d x \int_x P_{data}(x) \log P_\theta(x) \, dx xPdata(x)logPθ(x)dx P d a t a P_{data} Pdata 下对 log ⁡ P θ ( x ) \log P_\theta(x) logPθ(x) 的期望,而第二项( − ∫ x P d a t a ( x ) log ⁡ P d a t a ( x ) d x -\int_x P_{data}(x) \log P_{data}(x) \, dx xPdata(x)logPdata(x)dx)是常数,因为它只依赖于数据分布 P d a t a P_{data} Pdata,与 θ \theta θ 无关。

因此,最大化 ∫ x P d a t a ( x ) log ⁡ P θ ( x ) d x \int_x P_{data}(x) \log P_\theta(x) \, dx xPdata(x)logPθ(x)dx 相当于最小化负的这个值,即最小化:
K L ( P d a t a ∥ P θ ) = ∫ x P d a t a ( x ) log ⁡ P d a t a ( x ) P θ ( x ) d x KL(P_{data} \| P_\theta) = \int_x P_{data}(x) \log \frac{P_{data}(x)}{P_\theta(x)} \, dx KL(PdataPθ)=xPdata(x)logPθ(x)Pdata(x)dx
KL 散度衡量了两个概率分布之间的相对熵,这里我们想要最小化 P d a t a P_{data} Pdata P t h e t a P_{theta} Ptheta 之间的 KL 散度,从而使 P θ P_{\theta} Pθ 尽可能地接近 P d a t a P_{data} Pdata

结论

这整个过程展示了通过最大化对数似然来最小化真实数据分布和模型分布之间的 KL 散度,进而使模型分布逼近真实数据分布的方法。这是统计建模中非常核心的思想,也直接应用于现代机器学习模型的训练中,包括深度学习中的 Diffusion Models。

所以现在就知道说所谓的 Maximum Likelihood Estimate 其实就是 Minimize KL Divergence,所以假设你不能够接受 Maximum Likelihood Estimate 这个概念,那就告诉你说 Maximum Likelihood Estimate 等价于让 P d a t a P_{data} Pdata P θ P_{\theta} Pθ 它们的 KL Divergence 越小越好,它们的差异要越接近越好

那对于这些图像的生成模型来说,像 VAE、Diffusion Model 还有 Flow-based Model 它们都是试图去 Maximum Likelihood Estimate,那像 GAN 的话它是 Minimize 某一个 Divergence,但它通常不是 Minimize KL Divergence,最原始的 GAN 它是 Minimize JS Divergence,那后来的 WGAN 是 Minimize Wasserstein distance,那你其实也可以修改一下 GAN 的 formulation 让它变成 Minimize KL Divergence 只是效果不会更好

OK,总之这边就是告诉你说所有的图像生成模型共同的目标就是 Maximum Likelihood Estimate 或者 Minimize 某一种 Divergence,而 Maximum Likelihood Estimate 等同于 Minimize KL Divergence

3. VAE: Lower bound of l o g P ( x ) logP(x) logP(x)

那接下来我们先看一下 VAE,那之所以先讲 VAE 是要让你知道说其实 VAE 跟 Diffusion Model 它们非常的类似,所有很多 VAE 里面推导过的东西对 Diffusion Model 来说是不需要再推导一次的

在这里插入图片描述

那我们先来看在 VAE 里面所谓的 P θ ( x ) P_{\theta}(x) Pθ(x) 它是长什么样子,我们说这个 P θ ( x ) P_{\theta}(x) Pθ(x) 是什么东西呢?就是我们把 input 从 Gaussian Distribution sample 出来的 vector 通过 network 所形成的 distribution,照理说如果我们要定义 P θ ( x ) P_{\theta}(x) Pθ(x) 它应该写成 ∫ z P ( z ) P θ ( x ∣ z ) d z \int\limits_{z}P(z)P_{\theta}(x|z)dz zP(z)Pθ(xz)dz,我们要算 P θ ( x ) P_{\theta}(x) Pθ(x) 我们就去看每一个 z z z 被产生出来的机率 P ( z ) P(z) P(z),再看每一个 z z z 产生 x x x 的机率 P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz),再对所有的 z z z 做积分就是 x x x 被产生出来的机率

那每一个 z z z 被产生出来的机率没有什么问题,因为 z z z 是从一个简单你会 sample 的 distribution 产生出来的,比如说 Gaussian Distribution, P ( z ) P(z) P(z) 是没有问题的,但是 P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz) 是怎么回事呢?你可以这样定义 P θ ( x ∣ z ) = { 1 , G ( z ) = x 0 , G ( z ) ≠ x P_\theta(x|z)=\begin{cases}1,\quad G(z)=x\\0,\quad G(z)\neq x\end{cases} Pθ(xz)={1,G(z)=x0,G(z)=x

你可以说如果给一个 z z z 通过这个 network 以后它产生出来的正好就是我们要算它的机率的那个 x x x,我们就说 P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz) 等于 1,反之就是 0,你可以这样定义,那这样定义的坏处就是说你会发现你算出来的机率可能几乎都是 0,每一张 image 它产生的机率都是 0,因为今天这个 Gaussian Distribution 里面你 sample 出来的结果都不会跟某张 image 完完全全一模一样,如果按照上面的定义,只要一两个 pixel 有差异你就要算它的机率是 0,那你可能每张图算出来的机率通通都是 0,这可能会导致你在实际做的时候有计算上的困难,所以怎么办呢?

在这里插入图片描述

在 VAE 里面其实是这样假设的,我们假设说你输入一个 z z z 输出 G ( z ) G(z) G(z),这个 G ( z ) G(z) G(z) 代表的是什么呢?这个 G ( z ) G(z) G(z) 代表的是一个 Gaussian Distribution 的 mean,所以 P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz) 正比于 e x p ( − ∥ G ( z ) − x ∥ 2 ) exp(-\|G(z)-x\|_2) exp(G(z)x2)

这里,们将简单探讨为何 P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz) 可以表示为 exp ⁡ ( − ∥ G ( z ) − x ∥ 2 ) \exp(-\|G(z)-x\|_2) exp(G(z)x2) 的形式:(from ChatGPT)

1. 从高斯分布出发

在 VAE 中,假设给定隐变量 z z z 后,观测变量 x x x 条件分布是高斯分布,也就是 P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz) 是 Gaussian Distribution。这是一个常用的假设,因为高斯分布具有良好的数学性质(如连续性和有限的矩),并且能够通过其均值和方差完整描述。数学表达为:
P θ ( x ∣ z ) = N ( x ; μ ( z ) , σ 2 ( z ) I ) P_{\theta}(x|z) = \mathcal{N}(x; \mu(z), \sigma^2(z)I) Pθ(xz)=N(x;μ(z),σ2(z)I)
其中, μ ( z ) = G ( z ) \mu(z) = G(z) μ(z)=G(z) 是由 z z z 通过神经网络 G G G 生成的均值, σ 2 ( z ) I \sigma^2(z)I σ2(z)I 是方差(通常在简化的 VAE 模型中,方差可能被设置为常数或者另一个网络输出)。

2. 概率密度函数的形式

高斯分布的概率密度函数(PDF)表达式为:
N ( x ; μ , σ 2 ) = 1 2 π σ 2 exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) \mathcal{N}(x; \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) N(x;μ,σ2)=2πσ2 1exp(2σ2(xμ)2)
将这个表达式扩展到向量形式和对应于 P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz),我们得到:
P θ ( x ∣ z ) = 1 ( 2 π σ 2 ) d / 2 exp ⁡ ( − ∥ x − G ( z ) ∥ 2 2 2 σ 2 ) P_{\theta}(x|z) = \frac{1}{(2\pi\sigma^2)^{d/2}} \exp\left(-\frac{\|x-G(z)\|_2^2}{2\sigma^2}\right) Pθ(xz)=(2πσ2)d/21exp(2σ2xG(z)22)
这里 d d d x x x 的维度。

3. 概率密度函数的简化

在许多 VAE 的应用中,方差 σ 2 \sigma^2 σ2 被假设为一个小的常数(例如 σ 2 = 1 \sigma^2 = 1 σ2=1),简化计算并避免过拟合。这样的假设下,上式可以进一步简化为:
P θ ( x ∣ z ) ∝ exp ⁡ ( − ∥ x − G ( z ) ∥ 2 2 2 ) P_{\theta}(x|z) \propto \exp\left(-\frac{\|x-G(z)\|_2^2}{2}\right) Pθ(xz)exp(2xG(z)22)
因为常数系数 1 ( 2 π σ 2 ) d / 2 \frac{1}{(2\pi\sigma^2)^{d/2}} (2πσ2)d/21 1 2 σ 2 \frac{1}{2\sigma^2} 2σ21 不影响概率模型的参数 θ \theta θ 的优化,因此我们经常只关心 exp ⁡ \exp exp 项的影响。

4. 欧氏距离的解释

上述模型中的 exp ⁡ ( − ∥ x − G ( z ) ∥ 2 2 ) \exp(-\|x-G(z)\|_2^2) exp(xG(z)22) 形式实际上是建立在 x x x G ( z ) G(z) G(z) 之间的欧氏距离的基础上。这种形式强调了 x x x 被认为是由位于 G ( z ) G(z) G(z) 的高斯分布生成的,其生成误差由欧氏距离衡量。这种模型非常适合于处理那些误差本质上可视为高斯噪声的情况。

结论

P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz) 正比于 exp ⁡ ( − ∥ G ( z ) − x ∥ 2 ) \exp(-\|G(z)-x\|_2) exp(G(z)x2) 实际上是一种用高斯分布来模拟生成过程的误差分布的做法,其中 G ( z ) G(z) G(z) 作为均值,固定方差(如果假设方差为常数)映射了从隐空间到数据空间的生成过程。这种建模方法在 VAE 中是核心概念之一,并为后续模型如 Diffusion Models 提供了理论基础和启示。

那我们通常在算这个 VAE 的时候,你没有办法直接 Maximum P θ ( x ) P_{\theta}(x) Pθ(x),我们通常真正 Maximum 的是 P θ ( x ∣ z ) P_{\theta}(x|z) Pθ(xz) 的一个 Lower bound 也就是它的一个下界,我们来看这个推导:
l o g P θ ( x ) = ∫ z q ( z ∣ x ) l o g P ( x ) d z = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) P ( z ∣ x ) ) d z = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) q ( z ∣ x ) P ( z ∣ x ) ) d z = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) ) d z + ∫ z q ( z ∣ x ) l o g ( q ( z ∣ x ) P ( z ∣ x ) ) d z = ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) ) d z + K L ( q ( z ∣ x ) ∣ ∣ P ( z ∣ x ) ) ≥ ∫ z q ( z ∣ x ) l o g ( P ( z , x ) q ( z ∣ x ) ) d z = E q ( z ∣ x ) [ l o g ( P ( x , z ) q ( z ∣ x ) ) ] \begin{aligned} logP_\theta(x)&=\int_zq(z|x)logP(x)dz \\ &=\int_{z}q(z|x)log\left(\frac{P(z,x)}{P(z|x)}\right)dz =\int_{z}q(z|x)log\left(\frac{P(z,x)}{q(z|x)}\frac{q(z|x)}{P(z|x)}\right)dz \\ &=\int_zq(z|x)log\left(\frac{P(z,x)}{q(z|x)}\right)dz+\int_zq(z|x)log\left(\frac{q(z|x)}{P(z|x)}\right)dz \\ &= \int_zq(z|x)log\left(\frac{P(z,x)}{q(z|x)}\right)dz+ KL(q(z|x)||P(z|x)) \\ &\geq\int_{z} q(z|x)log\left(\frac{P(z,x)}{q(z|x)}\right)dz =\mathrm{E}_{q(z|x)}[log\left(\frac{P(x,z)}{q(z|x)}\right)] \end{aligned} logPθ(x)=zq(zx)logP(x)dz=zq(zx)log(P(zx)P(z,x))dz=zq(zx)log(q(zx)P(z,x)P(zx)q(zx))dz=zq(zx)log(q(zx)P(z,x))dz+zq(zx)log(P(zx)q(zx))dz=zq(zx)log(q(zx)P(z,x))dz+KL(q(zx)∣∣P(zx))zq(zx)log(q(zx)P(z,x))dz=Eq(zx)[log(q(zx)P(x,z))]
在上面推导中 θ \theta θ 通常会被省略掉,有时候有一些机率是需要 network 的参数才算得出来的,那它理论上应该要加一个下标 θ \theta θ 代表说这个机率是通过 network 算出来的,但是我们为了方便就把这个 θ \theta θ 省略掉了

E q ( z ∣ x ) [ l o g ( P ( x , z ) q ( z ∣ x ) ) ] \mathrm{E}_{q(z|x)}[log\left(\frac{P(x,z)}{q(z|x)}\right)] Eq(zx)[log(q(zx)P(x,z))] l o g P θ ( x ) logP_{\theta}(x) logPθ(x) 的 Lower bound,那在做 VAE 的时候我们实际上就有一个好的方法可以去 Maximum 这个 Lower bound,它是比 l o g P θ ( x ) logP_{\theta}(x) logPθ(x) 还要小,那我们就期待说能够 Maximum 这个 Lower bound 借此让 P θ ( x ) P_{\theta}(x) Pθ(x) 可以得到比较大的值,那在 VAE 里面 q ( z ∣ x ) q(z|x) q(zx) 就是我们的 Encoder,这个就是 VAE

4. Diffusion Model背后的数学原理

那我们接下来就来看 DDPM,在 DDPM 里面这个 P θ ( x ) P_{\theta}(x) Pθ(x) 是怎么被计算出来的呢?我们知道说在做 DDPM 的时候你生成图片的过程是下面这个样子的:

在这里插入图片描述

你先产生 x T x_T xT 再做 Denoise 产生 x T − 1 x_{T-1} xT1 再做 Denoise 一直到产生 x 0 x_0 x0,那你可以把 Denoise 的过程想成也是产生了一个 Gaussian Distribution

在这里插入图片描述

当你把 x t x_t xt 丢到 Denoise 的 Model 的时候它会 output 一个结果,这个 output 出来的结果你把它想成是 Gaussian 的 mean,如果说今天这个 x t − 1 x_{t-1} xt1 跟 output 出来的结果正好一模一样,那这个是机率最大的情况,那如果今天这个 x t − 1 x_{t-1} xt1 跟 Gaussian 的 mean 差很远的话,那这个机率就小很多

所以整个 DDPM 在产生某一张 image x 0 x_0 x0 的机率可以写成下面这个看起来非常复杂的式子:
P θ ( x 0 ) = ∫ x 1 : x T P ( x T ) P θ ( x T − 1 ∣ x T ) . . . P θ ( x t − 1 ∣ x t ) . . . P θ ( x 0 ∣ x 1 ) d x 1 : x T P_\theta(x_0)=\intop_{x_1:x_T}P(x_T)P_\theta(x_{T-1}|x_T)...P_\theta(x_{t-1}|x_t)...P_\theta(x_0|x_1)dx_1:x_T Pθ(x0)=x1:xTP(xT)Pθ(xT1xT)...Pθ(xt1xt)...Pθ(x0x1)dx1:xT
P θ ( x 0 ) P_{\theta}(x_0) Pθ(x0) 表示我们 sample 出 x T x_T xT 经过 network 的 θ \theta θ 参数后产生 image x 0 x_0 x0 的机率

在这里插入图片描述

刚才有讲到说 VAE 我们真正要去 Maximize 的是一个 Lower bound,在 DDPM 里面我们有一个跟 VAE 看起来形式上一模一样的 Lower bound,推导的过程和之前的 VAE 完全一样,这里就不再赘述了,那它唯一的不同就只是把一些符号替换一下

在 VAE 里面 q ( z ∣ x ) q(z|x) q(zx)Encoder,在 DDPM 里面 q ( x 1 : x T ∣ x 0 ) q(x_1:x_T|x_0) q(x1:xTx0) 就是那个加 noise 的过程,就是那个 Forward Process,那这个 q ( x 1 : x T ∣ x 0 ) q(x_1:x_T|x_0) q(x1:xTx0) 如果你想算的话它其实是长这个样子的:
q ( x 1 : x T ∣ x 0 ) = q ( x 1 ∣ x 0 ) q ( x 2 ∣ x 1 ) . . . q ( x T ∣ x T − 1 ) q(x_1:x_T|x_0)=q(x_1|x_0)q(x_2|x_1)...q(x_T|x_{T-1}) q(x1:xTx0)=q(x1x0)q(x2x1)...q(xTxT1)
那接下来就要看一下说 q ( x t ∣ x t − 1 ) q(x_{t}|x_{t-1}) q(xtxt1) 这种式子要怎么被算出来呢?在 DDPM 里面这个 x t x_t xt x t − 1 x_{t-1} xt1 的关系是这样子的:

在这里插入图片描述

你先有一张图叫做 x t x_t xt 乘上 1 − β t \sqrt{1-\beta_t} 1βt ,那这个 β t \beta_t βt 是事先准备好的值啦,你会先定义一串值叫做 β 1 , β 2 , . . . , β T \beta_1,\beta_2,...,\beta_T β1,β2,...,βT,这是你要事先定好的,那这个东西有点像 hyperparameter,learning rate 一样可以调啊,调了也会影响你的结果,这个就是你要先定好一组 β 1 , β 2 , . . . , β T \beta_1,\beta_2,...,\beta_T β1,β2,...,βT 代表在每一步的时候我们的 noise 要加多大才好

然后 x t x_t xt 这个 image 乘上 1 − β t \sqrt{1-\beta_t} 1βt 再加上 β t \sqrt{\beta_t} βt 乘上一个 noise,那这个 noise 是从一个 mean 是 0,variance 是 1 的 Gaussian Distribution 中 sample 出来的,noise 前面乘上的 β t \sqrt{\beta_t} βt 代表这个 noise 的大小,所以你就会知道说这个 distribution 其实还是一个 Gaussian Distribution,它的 mean 是 1 − β t \sqrt{1-\beta_t} 1βt ,variance 是 β t \beta_t βt,然后它的每一个 dimension 的 variance 都是一样的

OK,那怎么算 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0) 呢?

在这里插入图片描述

你的想象中可能是上图这个样子的,先产生 x 0 x_0 x0 然后再产生 x 1 x_1 x1 再产生 x 2 x_2 x2 一直到产生这个 x t x_t xt,你就可以算出 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0) 得机率,但是其实呢 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0) 的机率是可以直接被算出来的,我们这边就看一下,怎么直接把它这个机率算出来

在这里插入图片描述

我们知道说 x 1 x_1 x1 x 0 x_0 x0 它们中间有这样子的一个关系,就是 x 1 x_1 x1 等于 1 − β 1 \sqrt{1-\beta_1} 1β1 乘上 x 0 x_0 x0 加上 β 1 \sqrt{\beta_1} β1 乘上 noise,那这个 noise 是从一个 Gaussian Distribution sample 出来的,那同理 x 2 x_2 x2 等于 1 − β 2 \sqrt{1-\beta_2} 1β2 乘上 x 1 x_1 x1 加上 β 2 \sqrt{\beta_2} β2 乘上 noise,这个 noise 也是从 Gaussian Distribution sample 出来的

那这两个 noise sample 的过程它们是 independent 的,所以它们是从同样的 distribution sample 出来但是这两次的 sample 是独立的,这两次的 sample 是没有关系的

那接下来我们就可以把 x 1 x_1 x1 代到 x 2 x_2 x2 的计算中,也就是上图红色框中的内容代入就可以知道 x 2 x_2 x2 x 0 x_0 x0 之间的关系:

在这里插入图片描述

所以你知道说 x 2 x_2 x2 等于 x 0 x_0 x0 乘上 1 − β 2 1 − β 1 \sqrt{1-\beta_2} \sqrt{1-\beta_1} 1β2 1β1 加上某一个从 Gaussian Distribution sample 出来的 noise 前面乘 1 − β 2 β 1 \sqrt{1-\beta_2}\sqrt{\beta_1} 1β2 β1 再加上另外一个从同一个 Gaussian Distribution sample 出来的 noise 乘上 β 2 \sqrt{\beta_2} β2 ,不过两次 sample 是对立的,这就是 x 2 x_2 x2 x 0 x_0 x0 之间的关系

在这里插入图片描述

值得注意的是从同一个 Gaussian Distribution sample 两次再乘上两个不同的 weight 加起来的这一个 distribution 可以把它简化成只 sample 一次,然后前面乘上另外一个不同的 weight,所以从 Gaussian Distribution 里面 sample 两次前面分别乘上 1 − β 2 β 1 \sqrt{1-\beta_2}\sqrt{\beta_1} 1β2 β1 β 2 \sqrt{\beta_2} β2 这两个 weight 等同于从同一个 Gaussian Distribution 去 sample 一次前面的 weight 乘上 1 − ( 1 − β 2 ) ( 1 − β 1 ) \sqrt{1-(1-\beta_2)(1-\beta_1)} 1(1β2)(1β1)

所以 x 2 x_2 x2 x 0 x_0 x0 之间的关系可以写成这样: x 2 x_2 x2 等于 x 0 x_0 x0 前面乘上一些系数加上从 Gaussian Distribution 里面只 sample 一次,本来其实从 x 0 x_0 x0 x 2 x_2 x2 它产生的过程应该 sample 两次,当 sample 两次得到的 distribution 等同于 sample 一次,只是前面乘上的 weight 是 1 − ( 1 − β 2 ) ( 1 − β 1 ) \sqrt{1-(1-\beta_2)(1-\beta_1)} 1(1β2)(1β1)

在这里插入图片描述

所以依此类推如果你今天从 x 0 x_0 x0 x 1 x_1 x1 x 1 x_1 x1 x 2 x_2 x2,一直到 x t − 1 x_{t-1} xt1 x t x_t xt 这整个过程可以全部合起来,就写成 1 − β 1 . . . 1 − β t \sqrt{1-\beta_{1}}...\sqrt{1-\beta_{t}} 1β1 ...1βt 乘上 x 0 x_0 x0 然后再加上那个 Gaussian noise 前面乘上 1 − ( 1 − β 1 ) . . . ( 1 − β t ) \sqrt{1-(1-\beta_1)...(1-\beta_t)} 1(1β1)...(1βt)

那为了简化这边令 α t = 1 − β t \alpha_t=1-\beta_t αt=1βt α ˉ t = α 1 α 2 … α t \bar{\alpha}_t=\alpha_1\alpha_2\ldots\alpha_t αˉt=α1α2αt,然后上面的公式就可以替换成 α ˉ t \sqrt{\bar{\alpha}_t} αˉt 乘上 x 0 x_0 x0 再加上 1 − α ˉ t \sqrt{1-\bar{\alpha}_t} 1αˉt 乘上 noise,有没有感到很熟悉呢?这其实就是 DDPM 演算法里面的计算公式!

接下来继续我们真正想要 Maximize 的 Lower bound 是 E q ( x 1 : x T ∣ x 0 ) [ l o g ( P ( x 0 ; x T ) q ( x 1 : x T ∣ x 0 ) ) ] \mathrm{E}_{q(x_{1}:x_{T}|x_{0})}[log\left(\frac{P(x_{0};x_{T})}{q(x_{1}:x_{T}|x_{0})}\right)] Eq(x1:xTx0)[log(q(x1:xTx0)P(x0;xT))],接下里你要把它经过一番整理变成你可以算的样子,那这个过程就比较繁琐,这边直接把 Understanding Diffusion Models: A Unified Perspective 这篇 paper 中的推导拿过来了,大家感兴趣的话可以自己看下

在这里插入图片描述

在这里插入图片描述

总之经过一番推导之后它变成了最下面这个式子,这是我们真正要去 Maximize 的 Lower bound,我们真正要去 Maximize 的东西

E q ( x 1 ∣ x 0 ) [ l o g P ( x 0 ∣ x 1 ) ] − K L ( q ( x T ∣ x 0 ) ∣ ∣ P ( x T ) ) − ∑ t = 2 T E q ( x t ∣ x 0 ) [ K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ P ( x t − 1 ∣ x t ) ) ] \begin{aligned}\mathbb{E}_{q(x_1|x_0)}[logP(x_0|x_1)]&-KL\big(q(x_T|x_0)||P(x_T)\big)\\&-\sum_{t=2}^T\mathbb{E}_{q(x_t|x_0)}[KL\big(q(x_{t-1}|x_t,x_0)||P(x_{t-1}|x_t)\big)\big]\end{aligned} Eq(x1x0)[logP(x0x1)]KL(q(xTx0)∣∣P(xT))t=2TEq(xtx0)[KL(q(xt1xt,x0)∣∣P(xt1xt))]
其中第二项 K L ( q ( x T ∣ x 0 ) ∣ ∣ P ( x T ) ) KL\big(q(x_T|x_0)||P(x_T)\big) KL(q(xTx0)∣∣P(xT)) 你不需要去管它,因为它跟 network 的参数是没有关系的,我们现在的目标是找一个 network 的参数,找个 θ \theta θ 它去 Maximize 上面的这个式子,而第二项是跟 θ \theta θ 完全无关的,首先 P ( x T ) P(x_T) P(xT) 是从 Gaussian Distribution 里面 sample 出来的一个全部都是噪声的 image,你的 network 根本没办法影响这一项,那 q ( x T ∣ x 0 ) q(x_T|x_0) q(xTx0) 中的 q q q 跟你的 network 是完全没有关系的,那 q q q 就是 diffusion 的 process 是你人工定好的,跟你的 network 的训练也没有关系,所以这一项我们就无视它

接下来就是看一下第三项的计算是怎么做的,那第一项和第三项非常的像,所以这边就不讲这个,只讲第三项是怎么做的,那在这一项里面我们先来看看什么叫做 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0),我们之前学到的都是 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0) q ( x t − 1 ∣ x 0 ) q(x_{t-1}|x_0) q(xt1x0) q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1) 这种的计算:

在这里插入图片描述

q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 这是你不会算的东西,怎么办,这项到底是什么意思呢?这项的含义是这样,假设我们已经看到 x 0 x_0 x0 x t x_t xt,就是你已经先给了一张 image x 0 x_0 x0 然后做了 t t t 次的 diffusion 得到了 x t x_t xt,但是中间的过程你没有看见,然后问你 x t − 1 x_{t-1} xt1 的分布应该长什么样

在这里插入图片描述

所以它不是单纯从 x 0 x_0 x0 产生到 x t − 1 x_{t-1} xt1,给你 x 0 x_0 x0 问你 x t − 1 x_{t-1} xt1 的分布,这是你会算的东西,但这个不是这样子的问题,这个问题是给你 x 0 x_0 x0 最后你也观察到产生 x t x_t xt 了,给你 x 0 x_0 x0 经过一连串 diffusion process,diffusion process 中间你没有看到它,你知道 diffusion 完产生 x t x_t xt,问你中间的 x t − 1 x_{t-1} xt1 到底它的分布长什么样子,这就是 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 所代表的含义

但是 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0) q ( x t − 1 ∣ x 0 ) q(x_{t-1}|x_0) q(xt1x0) q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1) 这三项倒是我们会算的东西,所以你的目标就是把 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 − 1 , x t , x 0 ) q ( x t , x 0 ) = q ( x t ∣ x t − 1 ) q ( x t − 1 ∣ x 0 ) q ( x 0 ) q ( x t ∣ x 0 ) q ( x 0 ) = q ( x t ∣ x t − 1 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) \begin{aligned}q(x_{t-1}|x_t,x_0)&=\frac{q(x_{t-1},x_t,x_0)}{q(x_t,x_0)}\\&=\frac{q(x_t|x_{t-1})q(x_{t-1}|x_0)q(x_0)}{q(x_t|x_0)q(x_0)}\\&=\frac{q(x_t|x_{t-1})q(x_{t-1}|x_0)}{q(x_t|x_0)}\end{aligned} q(xt1xt,x0)=q(xt,x0)q(xt1,xt,x0)=q(xtx0)q(x0)q(xtxt1)q(xt1x0)q(x0)=q(xtx0)q(xtxt1)q(xt1x0)
我们知道的是 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0) q ( x t − 1 ∣ x 0 ) q(x_{t-1}|x_0) q(xt1x0) q ( x t ∣ x t − 1 ) q(x_t|x_{t-1}) q(xtxt1) 这三项都是 Gaussian Distribution,这三项的 mean 跟 variance 你也都知道,那后续的整个推导过程就比较繁琐,这边也就直接把 Understanding Diffusion Models: A Unified Perspective 这篇 paper 中的推导拿过来了,大家感兴趣的话可以自己看下

在这里插入图片描述

它推导出来的结果仍然是一个 Gaussian Distribution,这个 Gaussian Distribution 的 mean 和 variance 如下图所示:

在这里插入图片描述

接下来就进一步来看看 K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ P ( x t − 1 ∣ x t ) ) KL\big(q(x_{t-1}|x_t,x_0)||P(x_{t-1}|x_t)\big) KL(q(xt1xt,x0)∣∣P(xt1xt)) 这个 KL Divergence 要怎么算,我们要计算的是两个 Gaussian Distribution 的 KL Divergence,那两个 Gaussian Distribution 的 KL Divergence 是有公式解的,如下所示:

在这里插入图片描述

但是其实你可以用更简单的方法把这个 KL Divergence 计算出来的,或者说你并不需要实际的把 KL Divergence 计算出来,因为我们的目标是要 Minimize 这个 KL Divergence,怎么可以 Minimize 这个 KL Divergence 呢?

我们先来看 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 它是一个 Gaussian Distribution,它的 mean 跟 variance 是固定住的,因为这个 Gaussian Distribution 它跟你的 network 没有半毛钱的关系,它这个 diffusion process 是你人工设定好的,一旦人工设定好以后,这个 distribution 的 mean 跟 variance 是固定住的,所以 mean 是固定住的,variance 也是固定住的

P ( x t − 1 ∣ x t ) P(x_{t-1}|x_t) P(xt1xt) 呢?它是由你的 network 来决定的,由你的 Denoise Model 来决定的,但是它的 variance 也是固定住的,我们根本就不考虑 Denoise Model 的 variance,就假设它 output 的那个 Gaussian Distribution 每个 dimension 的 variance 都是个定值,不讨论它,那其实也有文献试图讨论它,但效果好不了多少,所以不讨论它的 variance 我们只考虑它的 mean,它的 mean 倒是可以动的,因为它的 mean 是取决于我们 Denoise 的那个 Model

那如果我们要让这两个 Gaussian Distribution 的 KL Divergence 越接近越好,也就是让两个分布越接近越好,其中一个分布是完全固定不能动,另外一个分布是可以动它的 mean,但是 variance 的大小不能动,那你唯一让它们越接近越好的方法是不是让它们两个的 mean 越接近越好,也就是让 P ( x t − 1 ∣ x t ) P(x_{t-1}|x_t) P(xt1xt) 的 mean 跟 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 的 mean 越接近越好

在这里插入图片描述

所以实际上的操作就是就是 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 的 mean 我们是知道的等于 α ˉ t − 1 β t x 0 + α t ( 1 − α ˉ t − 1 ) x t 1 − α ˉ t \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_{t}x_{0}+\sqrt{\alpha_{t}}(1-\bar{\alpha}_{t-1})x_{t}}{1-\bar{\alpha}_{t}} 1αˉtαˉt1 βtx0+αt (1αˉt1)xt P ( x t − 1 ∣ x t ) P(x_{t-1}|x_t) P(xt1xt) 的 mean 是从 Denoise 的 Model 跑出来的,把 x t x_t xt 丢进去看看我们会输出什么东西,输出的东西就是 P ( x t − 1 ∣ x t ) P(x_{t-1}|x_t) P(xt1xt) 的 mean,我们要让这两个 mean 越接近越好

前面一个 mean 是固定的,所以实际上我们做的事情就是 train 这个 Denoise 的 Model 让它们越接近越好,那实际上 E q ( x t ∣ x 0 ) [ K L ( q ( x t − 1 ∣ x t , x 0 ) ∣ ∣ P ( x t − 1 ∣ x t ) ) ] \mathbb{E}_{q(x_t|x_0)}[KL\big(q(x_{t-1}|x_t,x_0)||P(x_{t-1}|x_t)\big)\big] Eq(xtx0)[KL(q(xt1xt,x0)∣∣P(xt1xt))] 这一项到底要怎么 Minimize 呢?它的 Minimize 的过程是这样样子的:

在这里插入图片描述

因为前面这边的期望有一项是 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0),所以 x 0 x_0 x0 是先给定的,那你要先从你的 distribution 里面,从你的 dataset 里面先拿一张 x 0 x_0 x0 出来,然后在给定 x 0 x_0 x0 的状态下你要把 x t x_t xt sample 出来,给定 x 0 x_0 x0 的状态下 x t x_t xt 它其实是一个 distribution,你把 x 0 x_0 x0 乘上一个系数加上 ϵ \epsilon ϵ 乘一个系数得到 x t x_t xt,那 x 0 x_0 x0 x t x_t xt 中间有这样子的一个关系: x t = α ˉ t x 0 + 1 − α ˉ t ϵ x_{t}=\sqrt{\bar{\alpha}_{t}}x_{0}+\sqrt{1-\bar{\alpha}_{t}}\epsilon xt=αˉt x0+1αˉt ϵ

在这里插入图片描述

然后接下来你的 Denoise Model 要做的事情就是吃一个 x t x_t xt 吃一个 t t t 它 output 的结果要跟 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1}|x_t,x_0) q(xt1xt,x0) 的 mean 越接近越好,你要做的事情就是用 x t x_t xt 去 predict α ˉ t − 1 β t x 0 + α t ( 1 − α ˉ t − 1 ) x t 1 − α ˉ t \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_{t}x_{0}+\sqrt{\alpha_{t}}(1-\bar{\alpha}_{t-1})x_{t}}{1-\bar{\alpha}_{t}} 1αˉtαˉt1 βtx0+αt (1αˉt1)xt 这一项东西,那这一项东西又是什么呢?这项东西还可以在做个化简,如下所示:

在这里插入图片描述

x 0 x_0 x0 x t x_t xt 的关系我们也是知道的,因此可以将 x 0 x_0 x0 代入进去最终化简得到 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ ) \frac{1}{\sqrt{\alpha_{t}}}\Big(x_{t}-\frac{1-\alpha_{t}}{\sqrt{1-\bar{\alpha}_{t}}}\epsilon\Big) αt 1(xt1αˉt 1αtϵ),所以 Denoise 的 Moel 需要 output 的是什么,需要 output 的是 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ ) \frac{1}{\sqrt{\alpha_{t}}}\Big(x_{t}-\frac{1-\alpha_{t}}{\sqrt{1-\bar{\alpha}_{t}}}\epsilon\Big) αt 1(xt1αˉt 1αtϵ),那在这个它要输出的目标里面其实只有 ϵ \epsilon ϵ 是真正需要去 predict 的,network 真正需要去 predict 的只有 ϵ \epsilon ϵ,为什么呢?因为 α t \alpha_t αt α ˉ t \bar{\alpha}_{t} αˉt 什么的都是些常数,它们是一开始在 train 这个 network 前早就设定好的,你只要把它们算出来就好了, x t x_t xt 没什么好算的,它就是输入你早就知道了,唯一 network 需要预测的,唯一我们不知道需要 network 帮我们跑出来的就只有 ϵ \epsilon ϵ 而已,所以 network 唯一需要预测的就是加到 x t x_t xt 里面的那个 noise 也就是 ϵ \epsilon ϵ

所以你会发现 1 α t ( x t − 1 − α t 1 − α ˉ t ϵ ) \frac{1}{\sqrt{\alpha_{t}}}\Big(x_{t}-\frac{1-\alpha_{t}}{\sqrt{1-\bar{\alpha}_{t}}}\epsilon\Big) αt 1(xt1αˉt 1αtϵ) 这个式子跟演算法中 Sampling 的那个式子是一模一样的,Denoise 的 Model 要 output 的就是这一项

在这里插入图片描述

5. 为什么需要Sample?

但是讲到这里还没有解决的一个问题就是为什么最后还要多加一个 noise 呢?为什么最后还多加了 σ t z \sigma_{t}\mathbf{z} σtz 这一项呢?当然你可能会说我们既然说这个 Denoise 的 Model 它的 output 就是一个 Gaussian Distribution,我们现在 Denoise Model 真正算出来的只是 Gaussian 的 mean,我们在做 sample 的时候当然要加上一个 noise 代表说考虑 Gaussian 的 variance 这一项

在这里插入图片描述

但是这里就想说为什么不直接去 Mean 呢?因为如果直接取 mean 的话代表我们是取这个 Gaussian Distribution 里面 probability density 最大的那个输出,这样不是也很合理吗?为什么不选 probability density 最大的输出呢?为什么一定要做 sample 呢?

以下来自于李宏毅老师的猜测,大家听听就好😂

在这里插入图片描述

这边我们要说另外一件事情,同样的问题你也可以问为什么 Language Model 在产生文字的时候一定要做 sample,为什么我们都是说先产生一个 probability distribution,再从这个 probability distribution sample 出一个文字呢?为什么不取机率最大的就好,让模型每次都回答机率最大的机制这样不是也很好吗?有很多应用其实会希望说你的模型的 output 每次都是固定的,为什么需要有随机性呢?

在这里插入图片描述

那其实这个问题过去就已经有人问过了,有一篇 paper 叫做 The Curious Case of Neural Text Degeneration 就发现说如果你取机率最大的,每次你都取机率最大的词汇,你 output 的结果会是不断重复的句子,机器就会开始不断的调整讲重复的话,虽然你做 sampling 感觉机器比较会说一些奇奇怪怪的话但是跟不断重复比起来,感觉 sampling 的结果是比较好的

这是为什么呢?在论文中有做一个分析,如下所示:

在这里插入图片描述

图中橙色的线代表的是人写的句子,右边是人写的一篇文章,我们来用 Language Model 来计算人写的这篇文章里面每一个字根据我们的 Language Model 根据 GPT-2 所计算出来的机率,你会发现说人写出来的文章他用字遣词并不是选机率最大的那一个词汇,那如果你看机器写的文章,今天让机器选这个机率最大的词汇,那发现说虽然机器产生出来的句子它是机率最大的,但是它就是一个很奇怪的句子,你会发现它不断在讲重复的话

所以当你在做生成的时候机率最大的生成结果未必是最好的结果,那人在写一篇文章的时候也许我们并不会选机率最大的词汇,机率最大的词汇它可能是最经典,最常出现的词汇,但也是最无聊的,而且会反复出现同样的内容,这个是在文字上面的观察

在这里插入图片描述

但其实在语音上也有一样的观察,那今天语音合成的模型都是 End-to-End model 硬做的啦,直接 input 一段文字输出就是声音,用一个 seq2seq model 硬 train 的,那这种 seq2seq model 在语音上的发展其实也蛮早的

Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions 这篇最早用 seq2seq model 做语音合成的 paper 里面有提到在 testing 的时候要加 dropout,这个跟你想象的不一样对不对,我们知道什么时候要加 dropout,training 的时候,overfitting 的时候要加 dropout,照理说 testing、inference 的时候不该加 dropout,但是如果你要得到好的语音合成的结果 testing 的时候要加 dropout

会不会 Diffusion Model 也是同样的道理呢?我们讲过 Diffusion Model 其实是一种 Autoregressive Model,我们说 Autoregressive Model 是一次到位,那这样通常产生出来的结果不够好,这个我们可以把一次到位改成 N 次到位,这个就是 Diffusion Model 的概念

在这里插入图片描述

每一个在做 Denoise 的时候就好像是 Autoregressive 里面的一个 step,那既然在做 AutoRegressive 的时候每个 step 我们应该要加一点 noise 结果才会好,加一点随机性结果才会好,那也许在做 Denoise 的时候我们应该要加一点随机性这样结果才会好

在这里插入图片描述

这边助教有跑一个验证的结果,如果今天你的 σ t \sigma_t σt 设置和 paper 里面的一样你就可以产生上面这样的图,但是如果你把 σ t \sigma_t σt 设置为 0 你是合不出来图的,你合出来的就只是一张颜色单一的图而已,所以看起来加这个 noise 是需要的

在这里插入图片描述

这个就是 diffusion model 里面的玄机了,今天就告诉你说 training 的时候为什么不是一次一次加 noise 而是一步到位,加一次 noise 就直接把它 Denoise 掉呢,那这个我们已经讲过了,然后也顺便讲了一下为什么在做 Sampling 的时候我们是需要加 noise 的

6. Diffusion Model的应用

那这个 Diffusion Model 不是只能用在图像上,那在语音上也可以做 diffusion model,做语音合成也可以做 diffusion model

在这里插入图片描述

那 diffusion model 怎么就用在语音合成上呢?这个没有什么好讲的,跟图像就是一模一样的,本来图像的 input 是 2D 的东西,现在 input 变成 1D 的东西,你从一个完全 Gaussian 的 sample 的噪声然后慢慢一步一步的做 Denoise 把它变成一段声音讯号,那就可以做语音合成

那如果你想要知道 diffusion model 怎么用在语音上的话,那其中一个比较知名的方法就是 WaveGrad,大家感兴趣的可以看看

但是把 diffusion model 应用在文字上就很麻烦了,至少你没办法直接 apply DDPM,为什么没有办法直接 apply DDPM 呢?你想我们今天做 diffusion model 是时候我们就是希望说 input image 或 input 一段声音讯号,你直接加 Gaussian 的 noise,加到最后它就变成只有 Gaussian 的 noise,没有其它的东西,看不出来原来是什么

但文字是 discrete 的东西,你没有办法把一个 discrete 的东西一直加 noise 上去让它变成完全是 Gaussian,看不出原来是什么东西,所以看起来文字上要用 diffusion model 需要其它的解法

那已经有很多其它的解法被提出来了,有什么样的解法呢?我们今天就不讲细节只讲大方向的概念,大方向是不要把 noise 加到文字上,文字是 discrete 的没办法加 noise,怎么办呢?加在 word embedding 上就结束了,把文字对应到 word embedding,在 word embedding 上面加 Gaussian noise 就结束了

那有几篇知名的 paper,一个是 Diffusion-LM 如下所示:

在这里插入图片描述

它是 unconditional 的,直接从 x T \mathbf{x}_{T} xT 生成 x 0 \mathbf{x}_{0} x0 就直接从 Gaussian 的 noise 生出 word embedding,再想办法把 word embedding 解回原来的文字,那就看说生出来的 word embedding 跟那些 word embedding 最像,就把那个文字拿回来就好了

还有一个 DiffuSeq 如下所示:

在这里插入图片描述

它是一个 Seq2Seq Model,概念也是一样,反正就是再 Latent Representation 上面做这个 diffusion

那还有另外的做法,这另外的想法是说假设加 Gaussian 的 noise 是不行的,不能够加在文字这种 discrete 东西上,那能不能够想些其它的办法,其它种类的 noise,其它种类的 diffusion process 加到文字上呢?所以有另外一个系列的 work 他们的走向就是把其它种类的 diffusion process 加到文字上,所以他们这个 noise distribution 就不是 Gaussian

在这里插入图片描述

比如 Structured Denoising Diffusion Models in Discrete State-Spaces 这篇 paper 里面它 noise distribution 全部都是 mask,他们的这个 x T x_T xT 全部都是 mask 的句子,然后再慢慢的把有 mask 的地方填回来

7. Diffusion Model成功的关键

到底为什么这个 diffusion model 会这么成功呢?那前面有一堆很复杂的推导,那些推导可能也没有那么重要,也许它真正成功的关键就是把一次到位换成 N 次到位,把 AutoRegressive model 的优势加到 Non-AutoRegressive 里面来。那为什么会说把 AutoRegressive 的优势加到 Non-AutoRegressive 里面来是一个非常重要的优势呢?

因为过去其实也有其它的方法说你只要把 Non-AutoRegressive model 改成 AutoRegressive 其实你就可以得到很好的结果,那有一个方法叫做 Mask-Predict,那这种方法其实很多地方都有用到,它不一定叫这个名字

在这里插入图片描述

它的概念是这样的,假设我们现在要做的是一个 NLP 的问题,然后你要做一个对话,你的 Encoder 吃的句子是 “请问李宏毅的职业是什么?”,这边有两个答案,可以回答演员,可以回答老师,之前我们有讲过说如果同样的输入可以有不同的答案,那 auto regressive model 它可能会产生非常糟糕的结果

假设你有一个 Decoder 它是 auto regressive 的是一次到位的一个 model,就是输入给它一串 mask 它把这些 mask 统统变成文字,因为它无法决定到底答案应该是演员还是老师,所以第一个字出现演跟老的机率都很大,然后第二个字出现师跟员的几率都很大,最后你做 sample 的时候结果就会不好

在这里插入图片描述

那怎么办呢?有一个方法叫做 Mask-Predict,如果今天第一次出现的结果不够好,那就再做第二次,把 sample 出来机率比较低的部分用 mask 盖住重新再做一次结果的生成,那就可以解决 auto regressive model 举棋不定的问题,所以本来只做一次那 auto regressive model 的结果是差的,但是我们再另外一个方向上做 auto regressive 那就可以解决 auto regressive model 的劣势

在这里插入图片描述

那像这样的方法不仅用在 NLP 上也被用在图像上,在图像上有一个 Masked Visual Token Modeling(MVTM) 的做法,它的做法是先 train 一个 Auto-Encoder 把一张图片变成一堆 Token 然后把这些 Token 还原成原来的图片,那我们到时候操作都是操作在这些 Token 上面

接下来在 MVTM 里面他训练的时候就是把一张图片的 Token 的一些地方盖住,所谓盖住的意思就是把这些像文字一样 discrete 的 token 中的某一些换成 mask 的 token,换成一个特殊的符号,然后你再训练一个 model 要把 mask 的地方还原回来,这是训练的过程,把 mask 的地方还原回来

那在 inference 的时候,在生图的时候怎么做呢?如下所示:

在这里插入图片描述

一开始你的图全部都是 mask,把这个全部都是 mask 的图丢到 Generator 里面,Generator 就产生一张图片,但是他产生出来的结果里面的一些置信度分数比较低的部分把他在盖住,再重新 mask,然后再重新生图,用这个方法 iterating 的做也可以产生很好的结果

在这里插入图片描述

上图是原始 paper 里面展示这个模型生成图的一个过程,一开始全部都是 mask 然后把这个 mask 丢到 Generator 里面产生一个结果,但是可能很多地方 confidence 都很低,所以只有非常少的地方被保留下来,那没关系,再做一个 Generator 更多地方被保留下来,然后就一步一步做,那你产生出来的图片就越来越好

在这里插入图片描述

在这里插入图片描述

那这些模型他们都自称是 Non-AutoRegressive 的,那如果你做 auto regressive model 的话,那你在生图的时候就是一个一个 token 出来,那你要花非常多的时间才会把图产生出来,虽然产生出来的图可能是非常清晰的

那像上面这种把 autoregressive 的特色加入 Non-autoregressive 里面的方法他就可以把 Non-autoregressive 的劣势截长补短,而且他可以只要比较少的 iteration 就可以产生跟 autoregressive 一样好的结果。就他一次不是只产生一个 token,他一次是产生一堆 token,他只要比较少的 iteration 就可以产生跟这个autoregressive 的 model 一样好的结果

所以看起来有没有用 diffusion model 可能也没有那么重要,重点是把 Non-autoregressive model 加入 autoregressive 的优势,这可能是 diffusion model 成功的关键

总结

这里我们学习了 Diffusion Model 背后的数学原理,首先我们讲了图像生成模型的共同目标就是 Maximum Likelihood Estimate 或者 Minimize 某一种 Divergence,接着我们讲了 VAE 模型是去 Maximum l o g P θ ( x ) logP_{\theta}(x) logPθ(x) 的 Lower bound,由 VAE 出发详细分析了 DDPM 中 Maximize 的 Lower bound 是 E q ( x 1 : x T ∣ x 0 ) [ l o g ( P ( x 0 ; x T ) q ( x 1 : x T ∣ x 0 ) ) ] \mathrm{E}_{q(x_{1}:x_{T}|x_{0})}[log\left(\frac{P(x_{0};x_{T})}{q(x_{1}:x_{T}|x_{0})}\right)] Eq(x1:xTx0)[log(q(x1:xTx0)P(x0;xT))],接着就是一堆复杂的数学推导。

随后我们分析了 DDPM Sampling 的演算法中 σ t z \sigma_{t}\mathbf{z} σtz 这一项 noise 的添加,并讲了一些 Diffusion Model 的应用,它不只是用在图像生成上,还可以用在语音合成以及文本上,最后我们简单分析了 Diffusion Model 成功的关键可能是在 Non-autoregressive model 中加入 autoregressive 的优势

OK,以上就是 Diffusion Model 原理剖析的全部内容了😄

参考

  • 图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)
  • 机器学习2023(生成式AI)
  • https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.php
  • DDPM
  • Understanding Diffusion Models: A Unified Perspective
  • The Curious Case of Neural Text Degeneration
  • Natural TTS Synthesis by Conditioning WaveNet on Mel Spectrogram Predictions
  • WaveGrad
  • Diffusion-LM
  • DiffuSeq
  • Structured Denoising Diffusion Models in Discrete State-Spaces
  • Mask-Predict
  • Masked Visual Token Modeling
  • KL散度
  • 马尔可夫链
  • 似然函数
  • 最大似然估计
  • 贝叶斯定理
  • 大数定律

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

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

相关文章

Three.js入门学习笔记

学习资料: 【Three.js】Three.js快速上手教程_three.module.js-CSDN博客 2024年了,是该学学Three.js了_three.js 2024-CSDN博客 一、three.js简介 three.js是JavaScript编写的WebGL第三方库。 three.js,webGL,openGL三者的关…

【Linux高性能服务器编程】两种高性能并发模式剖析——领导者/追随者模式

hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之两种高性能并发模式介绍,在这篇文章中,你将会学习到高效的创建自己的高性能服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解…

SpringBoot自动配置底层源码分析

文章目录 1. 什么是SpringBoot的自动装配?2. SpringBoot自动装配的底层原理 1. 什么是SpringBoot的自动装配? Spring Boot的自动配置是一种机制,它使得开发者能够快速地开始构建Spring应用,而不需要手动编写大量的样板代码。Spri…

FRPC+PHP+MYSQL+APACHE2=个人网站

应用背景有公网需求,但是又不想去买又贵又低配置的服务器,然后方案就应运而生 frp/README_zh.md at dev fatedier/frp (github.com) 在这里, FRPC作为内网穿透服务, PHPMYSQLAPACHE2,作为网站搭建,具体细节不细讲, 但是在我的/var/www/html下面 linaroHinlink:/var/www/h…

CSS3新增特性(二)

四、2D 转换 • 属性名:transform (可用于制作2D转换,也可用于制作3D转转换;2D转换是平面上的转换,3D转换是在三维立体空间的转换) • 作用:对元素进行水平或垂直方向的移动、缩放、旋转、拉长…

二. 搭建Nginx 直播流程服务器

目录 1. 前言 2. 安装 Nginx 依赖 3.下载源码 4. 编译安装 5.配置 rtmp 服务 6.验证配置 1. 前言 服务器由 NGINX+RTMP 构成。 NGINX 是 HTTP 服务器, RTMP 是附加模块。 其中 NGINX 我选择的是用 源码编译方式 进行安装,因为这种方式可以自定义安装指定的…

DevOps(八)Jenkins的Maven和Git插件

一、Maven简介 Maven是一个构建生命周期管理和理解工具,用于Java项目。它提供了标准化的构建流程,并简化了从项目编译到文档生成等各种构建方面的管理。 Maven是由Apache软件基金会开发和维护的一个流行的项目管理工具。它的设计目的是简化Java项目的构…

Linux驱动开发:深入理解I2C时序

目录标题 I2C简介I2C时序关键点Linux内核中的I2C时序处理I2C适配器I2C算法I2C核心 代码示例:I2C设备访问调试I2C时序问题 在Linux驱动开发中,理解和正确处理I2C时序对于确保I2C设备正常工作至关重要。本文将详细介绍I2C通信协议的时序特征,并…

应用在防蓝光显示器中的LED防蓝光灯珠

相比抗蓝光眼镜、防蓝光覆膜、软体降低蓝光强度这些“软”净蓝手段,通过对LED的发光磷粉进行LED背光进行技术革新,可实现硬件“净蓝”。其能够将90%以上的有害蓝光转换为450nm以上的长波低能光线,从硬件的角度解决了蓝光危害眼睛的问题&#…

❤️新版Linux零基础快速入门到精通——第一部分❤️

❤️新版Linux零基础快速入门到精通——第一部分❤️ 非科班的我!Ta!还是来了~~~1. 来认识一下Linux吧!1.1 操作系统概述1.1.1 操作系统概述1.1.2 操作系统的发展史1.1.2.1 Unix1.1.2.2 Minix1.1.2.3 Linux 1.1.3 操作系统的发展 1.2 Linux初识1.2.1 Lin…

【MySQL】数据库操作指南:数据类型篇

🌱博客主页:青竹雾色间 🌱系列专栏:MySQL探险日记 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 ✨人生如寄,多忧何为 ✨ 文章目录 1. 数值类型1.1 tinyint 类型1.2 bit 类型1.3 小数类型1.3.1 f…

nacos配置mysql(windows)

nacos默认是使用的内置数据库derby ,可通过配置修改成mysql,修改成mysql之后,之前配置在derby的数据会丢失 本文使用mysql版本为8.0.22 nacos版本为2.3.1 在mysql里面先创建一个数据库test(名称自定义,和后面配置文件里面的一样就好了) 在上面创建的数据…

Milvus 在哈啰的应用与落地

向量数据库还有哪些可能性? 本期的【User Tech】直播告诉你答案!明晚的直播,我们邀请了来自哈啰的资深研发工程师王永辉,他将为我们详细讲解 Milvus 在本地出行及生活服务平台的应用及未来发展的诸多可能性,敬请期待&a…

如何在Windows服务做性能测试(CPU、磁盘、内存)

目录 前言1. 基本知识2. 参数说明 前言 由于需要做一些接口测试,测试是否有真的优化 1. 基本知识 该基本知识主要用来用到Performance Monitor,以下着重介绍下这方面的知识 性能监视器(Performance Monitor):Windo…

C++ 核心编程 - 内存分区模型

文章目录 1.1 程序运行前1.2 程序运行后1.3 new 操作符 C 程序在执行时,将内存大致划分为 4个区域: 代码区:存放函数体的二进制代码,由操作系统进行管理;全局区:存放全局变量和静态变量以及常量&#xff1…

MT2041 三角形的个数

思路:找规律,推公式 4等分: 头朝上的三角形: 边长为1:1234s1; 边长为2:123s2; 边长为3:12s3; 边长为4:1s4; 即si12...n-i1(n-i2)*(n-i…

基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2013B 3.部分核心程序 .............................................................................. %我们这里…

根据当年节假日和非工作时间计算请假时间-获取每个月的节假日,计算每个月的工作日时间进度,节假日每年更新

根据需求请假时间要排除法定节假日和非工作时间 1.获取当年的节假日 节假日是每年更新的,没有固定接口,需要手动录入 个人根据官方的节假日整理了当年的所有节假日,可以根据个人需求进行修改 // 获取每个月的节假日,如果当月没…

Java | 冒泡排序算法实现

大家可以关注一下专栏,方便大家需要的时候直接查找,专栏将持续更新~ 题目描述 编写一个Java程序,实现冒泡排序算法。程序需要能够接收一个整型数组作为输入,并输出排序后的数组。 冒泡排序是一种简单的排序算法,它…

Laravel 6 - 第十五章 验证器

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …