返回列表
扩散模型 2024年10月21日 · 86 分钟

【DDPM】一文看懂去噪扩散概率模型,公式讲解、代码实现与最全详解(一)

从加噪到去噪,系统讲解 DDPM 的数学原理、公式推导与网络结构

本节关于DDPM的图片和讲解来自视频:大白话AI | 图像生成模型DDPM | 扩散模型 | 生成模型 | 概率扩散去噪生成模型 DDPM原理分析:一个视频看懂扩散模型DDPM原理推导|AI绘画底层模型 关于卷积的讲解:那么……什么是卷积? DDPM代码讲解:Denoising Diffusion Probabilistic Models | DDPM Explained DDPM代码:This repo implements Denoising Diffusion Probabilistic Models (DDPM) in Pytorch DDPM论文:https://arxiv.org/pdf/2006.11239

前言

AI绘画呢,现在已经是图像领域比较热门的一个应用,这个AI绘画底层用的模型一般是生成模型,生成模型有很多,比如说GAN啊VAE,但是现在一些比较火的应用,比如说stable diffusion,比如MID journey这些应用,它们的底层模型都是扩散模型,扩散模型这个概念,在2015年就有人提出来了,但是呢一直到这个2020年这篇denoising diffusion probabilistic model(DDPM),这篇文章发表之后才得到了很很大的重视。

网上有很多关于DDPM这篇论文的一个讲解,但是由于这篇论文本身比较偏数学,因此不太容易读懂,所以在这里我希望通过这个文章能够对大家理解这个模型有一定的帮助。

在仔细理解上述列出的视频讲解后,才整理出这篇文章,同时也是作为自己的学习笔记

2024-10-20 写的第一版:主要内容是简单的介绍了正态分布,卷积的概念,还有详细的扩散模型的公式推导以及代码实现 2024-10-23更新第二版:添加了DDPM的定义,前向过程推导,重参数化目标函数,伪代码分析等一系列问题的解释

定义扩散模型主要做的事情

这里简单说一下我们要做的事情,对DDPM有一个大致的概念,然后带着问题看下面的讲解会有益于理解 在这里插入图片描述

  • 首先我们有一张输入图片,也就是这个里面的这个x0x_0,然后在扩散模型中我们希望通过不断地加随机噪音,像图里画的这样,然后经过tt之后呢我们会得到一个xTx_T,我们希望它是服从标准正态分布的,这样我们在推理过程中,就可以从这个正态分布里随机取出来一个xTx_T'
  • 如果我们要是说能够去学得降噪的这个过程,即xt1x_{t-1}xtx_{t}之间的关系,能够达到一个降噪的方法,然后我们就可以通过不断的降噪,最后得到这个x0x_0',这个就是一张全新的图片了
  • x0x_0xTx_T的这个加噪的过程,我们叫做前向过程
  • xTx_Tx0x_0就是降噪过程,我们叫做逆向过程

注意:一般化的理解

  • 假设我们有一个xtx_t,这xtx_t是什么意思呢?就是x0x_0经过tt次噪音后,得到这个图像,那么也就是说如果我们能够通过xtx_t,推出xt1x_{t-1}的分布,注意这里面说的不是通过xtx_t推出xt1x_{t-1},而是通过xtx_t推出xt1x_{t-1}的分布,也就是上图中的这个东西,我们要去去预估它的分布,而不是预估确切的xt1x_{t-1}大小 xtP(xt1xt)x_t → P(x_{t-1} | x_t)

  • 原因就是如果有了这个分布,就可以从这个里面随机去取一个xt1x_{t-1},这个xt1x_{t-1}可能和上张图里的xt1x_{t-1}不是一个xt1x_{t-1}了,也就我们可以给它标记成XT减一撇xt1x_{t-1}',这样的话我们能够使得这个模型更加的具有随机性。

  • 对于生成模型来说,随机性是一个非常好的这么一个性质,我们当然希望我们每次生成的东西是具有一定随机性的,不希望像分割任务一样,输入一张图片对应的就是确切的这么一个输出,所以这就是扩散模型比GAN模型要好的地方,很多论文中都提到了GAN模型其实多样性并不如扩散模型这么好

  • 如果我们要是能够推出这个分布,我们就可以得到一个全新的xt1x_{t-1},得到xt1x_{t-1}之后,我们就能够推出P(xt2xt1)P(x_{t-2} | x_{t-1}),我们就可以从这个里面再抽样得到一个xt2x_{t-2},这么一步一步下去,我们一定可以从xTx_T推到x0x_0,而且每一步都会有一定的多样性和随机性,就是因为学到的是分布,而并非是这个确切某一张带噪音的图 ·

  • ==这一点是必须要明确的,就是我们要去学的东西,实际上是这个分布,是这个条件分布,而并不是那张图,模型所学到的噪音并不是说是xtx_{t}xt1x_{t-1}之间的这个噪音==

  • ==那么为什么最后UNet的输出是噪音?它是其实是重参数化的这么一个结果==

一、正态分布

1. 掷骰子

在这里插入图片描述

首先,假如我们有一个骰子,不断的重复掷这个骰子,并将得到的点数记录再直方图上,每掷一次骰子的过程称为一次采样,直方图记录各点数出现的概率。 在这里插入图片描述

随着采样次数的增多,直方图顶点的连线成一条直线,所以这是一种等可能的概率在这里插入图片描述

接着我们增加一颗骰子,重复这个实验,用直方图记录每次采样得到的所有骰子点数之和,采样了几万次之后,直方图顶点的连线变成了一条折线,其中7点出现的次数最多,然后向两边递减 在这里插入图片描述

接下来用3颗骰子重复这个实验,再采样了数万次后最终得到的是这样一条折线段 在这里插入图片描述

随着骰子数量的增多,我们会发现,折线段越来越接近这样的一条曲线 在这里插入图片描述 从外形上看,这个曲线像一口大钟,所以它是一条钟形曲线在这里插入图片描述

2. 概率密度曲线

如果把x轴上的点看成随机变量,那么这条曲线就是概率密度曲线,,如果某个随机变量受很多种因素影响,但在这些因素中没有任何一个能够起决定性作用,那么该随机变量的概率密度曲线形状一般都会接近钟形,这样的概率分布成为Normal Distribution(Normal 表示普通,常见的意思)即正态分布,这样的钟形曲线就是正态分布的概率密度曲线

正态分布的概率密度曲线的数学表达式为:

N(x;μ,σ2)=12πσ2exp((xμ)22σ2)\mathcal{N}(x; \mu, \sigma^2) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right) f(x)=12πσ2exp((xμ)22σ2)f(x) = \frac{1}{\sqrt{2\pi \sigma^2}} \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right)

在这里插入图片描述

公式讲解:

  • 首先,函数的输入值是x轴上的点,也就是随机变量的值,输出的是该点在y轴的位置,也就是该随机变量的概率密度

  • 正态分布概率密度函数中的ππ是圆周率, e是自然常数,这两个都是恒量

  • μμσσ的取值确定了钟形曲线的形状和位置,钟形曲线的对称轴是位于x=μx=μ的直线,表示分布的中心趋势,即数学期望,μμ表示随机变量的平均值,σσ表示随机变量的标准差,μμσσ的值可以表示数据集中集中趋势和离散程度,曲线和x轴之间合围区域的面积表示概率

  • 所有合围区域的总面积是1,随机变量所有取值概率的总和为100%,围绕对称轴即x=μx=μ处±一个标准差的区间范围的面积为0.68,即随机变量取值落在这个范围内的概率为68%,围绕对称轴±两个标准差的区间范围内的面积为0.95,即随机变量取值落在这个范围内的概率为95%,这些区间称为正态分布的“标准差界限” 在这里插入图片描述在这里插入图片描述

  • 标准差σσ越小,曲线越陡峭,标准差σσ越大,曲线越平缓

  • μμσσ均值和标准差的取值确定后,概率密度曲线的形状也确定了 在这里插入图片描述

  • 为了简化,也常写为N(μ,σ2)\mathcal{N}(\mu, \sigma^2),如果均值μμ为0,标准差σσ为1,这样的正态分布称为标准正态分布,正态分布的概率密度函数也可以称为高斯函数,所以正态分布也叫做高斯分布

  • 从一个均值为0,标准差为1的标准正态分布中随机抽取样本生成一组符合该分布的的随机变量值,这组变量就称为“标准正态分布随机变量”

  • 比如这组随机数,仔细观察可以发现它们大部分都接近均值0,只有小部分超出了±一个标准差的范围,这样的随机变量将在等下的模型中作为“高斯噪声“ 在这里插入图片描述

二、卷积

1. 列表法

在掷骰子的实验中:

  • 先掷了一次骰子,然后又掷了一次骰子,将两次得到的点数相加,而如果同时掷两个骰子,只需要掷一次就能得到等同的结果
  • 同时掷两个骰子所得点数的概率分布等同于单独掷一颗骰子两次后叠加的概率分布,那么需要叠加后的概率分布,就只需要采样一次即可
  • 所以我们先研究下两颗骰子叠加后的概率分布,将两个骰子同时掷出,得到的点数的所有可能性是由两颗骰子分别掷出的点数之和所组成的所有可能性的总和,我们可以用一个表格将所有可能性列举出来 在这里插入图片描述
  • 假设每颗骰子各点数出现的概率相等,也就是1/6,那么表格中每种组合出现的概率就是1/36,然后将相同点数的概率相加,即是两颗骰子投掷得到的该该点数的概率,表格中对角线上的组合,两颗骰子的点数之和都是相同的,它们刚好是相应点数的组合 在这里插入图片描述

2. 卷积法

  • 首先我们可以把两颗骰子所有 的概率分布对齐,然后将一颗骰子反折过来,移动一格
  • 在这里插入图片描述
  • 此时上面的一点和下面的一点对齐,和为2,其中每颗骰子一点出现的概率都是1/6,那么总点数是2的概率是1/36 在这里插入图片描述
  • 然后再向右移动一格,这次上面的一点对齐了下面的两点,上面的两点对齐了下面的一点,和为3,这两种情况分别出现的概率是1/36,那么总点数是3的概率即这两种组合的概率和,也就是2/36 在这里插入图片描述
  • 依次方法不断平移对齐,然后分别计算出上下点数各组合的概率,求和就得到了相应总点数的概率,这种方法称为卷积,对两个概率分布进行卷积操作,实质上是计算这两个分布的所有可能的组合情况,并得到这些组合情况得到概率分布,也就是叠加后的概率分布。
  • 同样的,对于两个正态分布卷积后得到的是叠加后的概率分布,在下图中,蓝色曲线表示某个正态分布的概率密度函数,黄色曲线表示另一个正态分布概率密度曲线翻转后的曲线,红色曲线表示两个正态分布再当前位置的概率密度的乘积,绿色曲线表示两个正太分布叠加后的总的概率密度函数,它是红色填充曲线面积的累加。动画 在这里插入图片描述
  • 卷积后的概率密度函数仍符合正态分布
  • 一个均值为μ1\mu_1,方差为σ12\sigma_1^2的正态分布,叠加另一个均值为μ2\mu_2,方差为σ22\sigma_2^2的正态分布,它们的卷积是一个新的正态分布,它的均值和方差分别为这两个正态分布均值和方差的和
N(μ1,σ12)+N(μ2,σ22)=N(μ1+μ2,σ12+σ22)\mathcal{N}(\mu_1, \sigma_1^2) + \mathcal{N}(\mu_2, \sigma_2^2) = \mathcal{N}(\mu_1 + \mu_2, \sigma_1^2 + \sigma_2^2)

关于更多关于卷积的讲解请看:那么……什么是卷积?

三、扩散模型

在这里插入图片描述 扩散现象是指物质粒子从高浓度区域向低浓度区域移动的过程,例如,向一杯水中加入一颗糖或一颗墨水后,可以观察到这种现象

在这里插入图片描述 扩散模型受其启发,通过逐步向图片中加入高斯噪声,来模拟这种现象,并通过逆向过程从(随机)噪声中生成图片

1. 前向加噪:

对于一张彩色图片,以常见的RGB24格式为例, 每个像素使用R,G,B三个通道表示,每个通道的取值范围在[0,255]之间,分别代表红绿蓝三原色的比重 在这里插入图片描述

  • 我们首先将图片各通道数值通过归一化映射到[-1.0, +1.0]之间,然后随机采样生成一张同样大小的噪声图片,噪声图片中所有像素通道数值遵从标准正态分布, 在这里插入图片描述

  • 再将高斯噪声图片与同尺寸需要假造的图片进行混合,对于两张图片相同位置像素的各原色通道使用下面的公式计算混合的图片像素通道值 在这里插入图片描述

  • 在这个公式中,E\mathcal{E}是高斯噪声,xx是输入的图片,β\beta是一个介于[0.0, 1.0]区间的数字 ,用于产生E\mathcal{E}xx的系数

  • β\sqrt{\beta}1β\sqrt{1 - \beta}的平方和恒等于1,满足勾股定理,他们可以看成直径为1的半圆中,内接直角三角形的两条直角边的长度,而β\beta1β1 - \beta是两条直角边相邻正方形的面积,这样可以直观的感受到,噪声与原图在混合中所占的比例此消彼长(可以通过这里在线使用),随着β\beta的增加xx的系数逐渐减少,有了此公式后,就能通过对图片加噪来模拟扩散过程 在这里插入图片描述 β×E+1β×x\sqrt{\beta} × \mathcal{E} + \sqrt{1 - \beta} × x

  • 首先有一张原图,套用此公式后使用它作为输入就得到了x1x_{1},然后将得到的x1x_{1}图片继续带入此公式得到2_{2},再将x2x_{2}代入公式得到x3x_{3},依次类推,对于任意的xt1x_{t-1},代入公式后,得到了xtx_{t}的图像,使用此公式不断迭代知道xTxT 在这里插入图片描述

  • 用一个公式来表达前一时刻与后一时刻的关系,在这个式子中需要注意的是,每一步中加噪用到得到E\mathcal{E}都是基于标准正态分布重新采样的随机数,而且每一步中的β\beta并不相同,β\beta从最开始最接近0的数字逐步递增,到最后接近1,因为扩散速度是越来越快的

最开始β\beta一定要小,并且接近于零,只有当我们加的噪音的方差很小,也就是说,噪音扰动不是很大的时候,前项和后项的概率分布才是正态分布

xt=βt×Et+1βt×xt1x_t = \sqrt{\beta_t} × \mathcal{E}_t + \sqrt{1 - \beta_t} × x_{t-1} EtN(μ,σ2) \mathcal{E}_t - \mathcal{N}(\mu, \sigma^2) 0<β1<β2<β3<βt1<βt<10<\beta_1<\beta_2<\beta_3<\beta_{t-1}<\beta_t<1

  • 为了简化后续的推导,我们需要引入一个新的变量at=1βta_t = 1-\beta_t,所以这个公式可以写成这样的形式,使用这个公式x0x_0从开始,迭代tt此后就可以得到xtx_t的图像 xt=1at×Et+at×xt1x_t = \sqrt{ 1-a_t} × \mathcal{E}_t + \sqrt{a_t} × x_{t-1} 在这里插入图片描述

  • 现在思考一个问题:能否从x0x_0得出xtx_t的图像而避免多次迭代? 在这里插入图片描述

  • 首先思考xt2x_{t-2}xtx_t的关系,xt1x_{t-1}xtx_t满足上面的关系,所以 xt2x_{t-2}xt1x_{t-1}同样满足这个关系 在这里插入图片描述 xt=1at×Et+at×xt1           (1)x_t = \sqrt{ 1-a_t} × \mathcal{E}_t + \sqrt{a_t} × x_{t-1}~~~~~~~~~~~(1) xt1=1at1×Et1+at1×xt2           (2)x_{t-1} = \sqrt{ 1-a_{t-1}} × \mathcal{E}_{t-1}+ \sqrt{a_{t-1}} × x_{t-2}~~~~~~~~~~~(2)

  • 如果用下面的式子替换掉上面式子中的xt1x_{t-1}就得到了从xt2x_{t-2}xtx_{t}的关系(3) xt=1at×Et+at×(1at1×Et1+at1×xt2)           (3)x_t = \sqrt{ 1-a_t} × \mathcal{E}_t + \sqrt{a_t} × (\sqrt{ 1-a_{t-1}} × \mathcal{E}_{t-1}+ \sqrt{a_{t-1}} × x_{t-2})~~~~~~~~~~~(3)

  • 化简完之后得到这样的一个式子,它描述了 xt2x_{t-2}xtx_{t}的关系,==其中Et\mathcal{E}_tEt1\mathcal{E}_{t-1}表示两个独立的随机变量== xt=at(1at1)×Et1+1at×Et+atat1×xt2           (3)x_t = \sqrt{ a_t(1-a_{t-1})} × \mathcal{E}_{t-1} + \sqrt{ 1-a_t} × \mathcal{E}_t + \sqrt{a_t a_{t-1}} ×x_{t-2}~~~~~~~~~~~(3)

2. 多次采样的概率叠加

  • 这就好比掷骰子,先掷了一次骰子,然后又掷了一次骰子,将两次得到的点数相加,而如果同时掷两个骰子,只需要掷一次就能得到等同的结果 在这里插入图片描述
  • 也就是说同时掷两个骰子所得点数的概率分布等同于单独掷一颗骰子两次后叠加的概率分布,那么需要叠加后的概率分布,就只需要采样一次即可,即只需要用叠加后的概率分布采样即可

在这里插入图片描述

xt=at(1at1)×Et1+1at×Et+atat1×xt2x_t = \sqrt{ a_t(1-a_{t-1})} × \mathcal{E}_{t-1} + \sqrt{ 1-a_t} × \mathcal{E}_t + \sqrt{a_t a_{t-1}} ×x_{t-2}

  • 先观察Et1\mathcal{E}_{t-1},它是一个服从标准正态分布的随机数,然后Et1\mathcal{E}_{t-1} 乘以一个常数作为系数,仍然服从正态分布,也就是说在乘以一个常数c后,均值和标准差都变为了之前的c倍,而Et1\mathcal{E}_{t-1}是服从标准正态分布的随机数,它的均值μ\mu为0,标准差σ\sigma为1,所以这个分布变成了 N(0,atatat1)\mathcal{N}(0, a_t - a_t a_{t-1})
  • 对于Et\mathcal{E}_{t}也是如此,在乘以一个常数系数后它服从这样的一个正态分布 N(0,1at)\mathcal{N}(0, 1- a_t)

N(μ1,σ12)+N(μ2,σ22)=N(μ1+μ2,σ12+σ22)\mathcal{N}(\mu_1, \sigma_1^2) + \mathcal{N}(\mu_2, \sigma_2^2) = \mathcal{N}(\mu_1 + \mu_2, \sigma_1^2 + \sigma_2^2) 根据公式可知:

N(0,atatat1)+N(0,1at)=N(0,1atat1)\mathcal{N}(0, a_t - a_t a_{t-1}) + \mathcal{N}(0, 1 - a_t) = \mathcal{N}(0,1 - a_t a_{t-1})
  • 这两个分布叠加后的分布成了一个均值为0,方差为1atat11 - a_t a_{t-1}的正态分布 ,从这个分布中采样得到的随机数就等于从之前两个分布采样随机数的和,所以我们将这个式子改写一些,只用到一个服从标准正态分布的随机数,仍然服从相同的分布,这种改写方式称为“重参数化技巧”

xt=1atat1×E+atat1×xt2           (4)x_t =\sqrt{1 - a_t a_{t-1}} × \mathcal{E} + \sqrt{a_t a_{t-1}} ×x_{t-2}~~~~~~~~~~~(4)

3. 前向过程继续推导

  • 接下来再思考xt3x_{t-3}xtx_t的关系,从xt3x_{t-3}xt2x_{t-2}仍然满足公式(1) xt2=1at2×Et2+at2×xt3           (5)x_{t-2} = \sqrt{ 1-a_{t-2}} × \mathcal{E}_{t-2} + \sqrt{a_{t-2}} × x_{t-3}~~~~~~~~~~~(5)
  • 将式子(4)(5)合并,得到xt3x_{t-3}xtx_t的关系 xt=1atat1×E+atat1(1at2×Et2+at2×xt3)x_t =\sqrt{1 - a_t a_{t-1}} × \mathcal{E} + \sqrt{a_t a_{t-1}} ( \sqrt{ 1-a_{t-2}} × \mathcal{E}_{t-2} + \sqrt{a_{t-2}} × x_{t-3})
  • 化简得如下,又得到了两个独立的服从正态分布的随机数 xt=1atat1E+atat1atat1at2×Et2+atat1at2×xt3x_t =\sqrt{1 - a_t a_{t-1}} \mathcal{E} + \sqrt{ a_t a_{t-1} - a_t a_{t-1}a_{t-2}} × \mathcal{E}_{t-2} + \sqrt{a_t a_{t-1}a_{t-2}} × x_{t-3}
  • 再次使用“重参数化技巧”将这个式子改写
N(0,1atat1)+N(0,atat1atat1at2)=N(0,1atat1at2)\mathcal{N}(0, 1 - a_t a_{t-1}) + \mathcal{N}(0, a_t a_{t-1} - a_t a_{t-1}a_{t-2}) = \mathcal{N}(0,1 - a_t a_{t-1}a_{t-2})

xt=1atat1at2×E+atat1at2×xt3           (6)x_t =\sqrt{1 - a_t a_{t-1}a_{t-2}} × \mathcal{E} + \sqrt{a_t a_{t-1}a_{t-2}} ×x_{t-3}~~~~~~~~~~~(6)

  • 至此我们有了xt3x_{t-3}xtx_t的关系,结合之前xt2x_{t-2}xtx_t的关系,使用数学归纳法,将这两个关系式归纳后,可以猜想得出这样一个关系式 xt=1atat1at2at(k2)at(k1)×E+atat1at2at(k2)at(k1)xtk           (7)x_t =\sqrt{1 - a_t a_{t-1}a_{t-2} ···a_{t-(k-2)}a_{t-(k-1)}} × \mathcal{E} + \sqrt{a_t a_{t-1}a_{t-2} ···a_{t-(k-2)}a_{t-(k-1)}}x_{t-k}~~~~~~~~~~~(7)

  • 我们的目标是从x0x_0直接得到xtx_t的关系,那么将猜想式中的k设为t,即为x0x_0xtx_t的关系 xt=1atat1at2a2a1×E+atat1at2a2a1xtk           (8)x_t =\sqrt{1 - a_t a_{t-1}a_{t-2} ···a_{2}a_{1}} × \mathcal{E} + \sqrt{a_t a_{t-1}a_{t-2} ···a_{2}a_{1}}x_{t-k}~~~~~~~~~~~(8)

  • 其中atat1at2a2a1a_t a_{t-1}a_{t-2} ···a_{2}a_{1}很长, 为了表达方便,可以用at\overline{a}_t表示

xt=1at×E+atx0           (9)x_t =\sqrt{1 - \overline{a}_t} × \mathcal{E} + \sqrt{\overline{a}_t}x_{0}~~~~~~~~~~~(9)

at=atat1at2a2a1\overline{a}_t = a_t a_{t-1}a_{t-2} ···a_{2}a_{1}

4. 反向过程

  • 在前向过程中,我们首先定义了后一时刻与前一时刻的关系,从x0x_0原图在加噪后到任意xtx_t时刻图像的关系 xt=1at×Et+at×xt1x_t = \sqrt{ 1-a_t} × \mathcal{E}_t + \sqrt{a_t} × x_{t-1}

xt=1at×E+atx0x_t =\sqrt{1 - \overline{a}_t} × \mathcal{E} + \sqrt{\overline{a}_t}x_{0}

  • ==在反向过程中,目标是从最后的xTx_T时刻的噪声图片中恢复得到x0x_0时刻的原图== 在这里插入图片描述
  • 我们需要先思考如何从后一时刻得到前一时刻的图像,只要知晓了从任意xtx_{t}时刻到其前一时刻xt1x_{t-1}的关系,我们就能利用此关系,从最后的xTx_T时刻逐步向前推理得到x0x_0时刻的原图 在这里插入图片描述

5. 贝叶斯定理

这里有一个问题,小明回家要么坐地铁,要么坐公交,,根据以往的经验,80%的情况都是坐地铁,20%的情况坐公交;如果坐地铁,小明会在经过的地下商城玩一次抓娃娃机,有30%的概率抓到娃娃;如果坐公交,小明会在公交站旁的抓娃娃机上玩一次,有80%的概率抓到娃娃。今天回家时小明带了一个娃娃,那小明今天坐地铁和坐公交回家的概率各是多少? 在这里插入图片描述

  • 对于这个问题,我们先画一个边长为1的正方形,它的面积表示小明回家方式的所有可能,即100%
  • 然后用P(X)P(X)表示坐公交的概率20%
  • P(Y)P(Y)表示坐地铁的概率80%
  • 此时正方形被分成了两块面积分别为0.2和0.8的矩形,矩形的窄边长分别为0.2和0.8 在这里插入图片描述
  • P(WX)P(W|X)表示小明坐公交回家途中抓到娃娃的概率80% ,也就是将黄色的矩形面积再次分割成一个小矩形,该矩形的宽边长为0.8
  • P(WY)P(W|Y)表示小明坐地铁回家途中抓到娃娃的概率30% ,也就是将绿色的矩形面积再次分割成一个小矩形,该矩形的窄边长为0.3 在这里插入图片描述
  • 那么抓到娃娃的概率P(W)P(W)就是两块小矩形的面积和 P(W)=P(X)P(WX)+P(Y)P(WY)=0.4P(W) = P(X)P(W|X) + P(Y)P(W|Y) = 0.4
  • 在公交车站旁抓到娃娃的概率P(X|W)就等于黄色小矩形的面积除以两块小矩形面积的和 P(XW)=P(X)P(WX)/P(W)=0.4P(X|W) = P(X)P(W|X) / P(W) = 0.4
  • 在地铁站抓到娃娃的概率P(Y|W)就等于绿色小矩形的面积除以两块小矩形面积的和 P(YW)=P(Y)P(WY)/P(W)=0.6P(Y|W) = P(Y)P(W|Y) / P(W) = 0.6

这个公式即贝叶斯定理: P(AB)=P(BA)P(A)/P(B)P(A|B) = P(B|A) P(A) / P(B)

  • 这个式子中P(A)P(A)P(B)P(B)分别表示这两个随机事件发生的概率,P(BA)P(B|A)表示A事件发生的情况下B事件发生的概率,同理,P(A|B)表示B事件发生的情况下A事件发生的概率

  • 在刚才的例子中,P(A)P(A)表示小明坐公交或地铁的概率,这是基于之前的经验,所以称为“先验概率(prior)”

  • P(AB)P(A|B)同样表示小明坐公交或者地铁的概率,但是是在B事件发生后对先验概率P(A)的修正,所有称为“后验概率(posterior)”,这种修正的基础是因为看到B事件的发生,所以B事件称为“证据(evidence)”

  • P(BA)P(B|A)表示在A事件发生前提下,B事件“似乎”很有可能发生,所以称为“似然(likelihood)”,它的值可以看作为B事件对A事件的归因力度

  • P(BA)P(B|A)的值更大时,B事件就提供更强的证据支持A事件,所以P(BA)P(B|A)也可以理解为B事件对A事件的证据强度 在这里插入图片描述

6. 反向过程生成图片

xt=1at×Et+at×xt1        (10)x_t = \sqrt{ 1-a_t} × \mathcal{E}_t + \sqrt{a_t} × x_{t-1}~~~~~~~~(10)

xt=1at×E+atx0        (11)x_t =\sqrt{1 - \overline{a}_t} × \mathcal{E} + \sqrt{\overline{a}_t}x_{0}~~~~~~~~(11)

P(AB)=P(BA)P(A)/P(B)        (12)P(A|B) = P(B|A) P(A) / P(B)~~~~~~~~(12) 在这里插入图片描述

  • 现在我们可以利用这个公式:从前一时刻到后一时刻加入的时随机噪声Et\mathcal{E}_t,也就是说从xt1x_{t-1}时刻到xtx_{t}时刻是一个随机过程,所以从xtx_{t}xt1x_{t-1}也应该是一个随机过程
  • 我们的目标是在已知xtx_{t}的情况下,求出前一时刻xt1x_{t-1}的图像,既然后一时刻xtx_{t}到前一时刻xt1x_{t-1}是一个随机过程,我们可以用P(xt1xt)P(x_{t-1} | x_{t})表示在给定xtx_{t}的情况下,前一时刻xt1x_{t-1}的概率,套用贝叶斯定理,将这个问题转化为 P(xt1xt)=P(xtxt1)P(xt1)/P(xt)        (13)P(x_{t-1} | x_{t}) = P(x_{t} | x_{t-1}) P(x_{t-1}) / P(x_{t})~~~~~~~~(13)
  • P(xt)P(x_{t})P(xt1)P(x_{t-1})分别表示xtx_{t}xt1x_{t-1}时刻的概率,也就是从x0x_{0}原图得到它们的概率,用P(xtx0)P(x_{t} | x_{0})P(xt1x0)P(x_{t-1} | x_{0})表示
  • 同时给P(xt1xt)P(x_{t-1} | x_{t})P(xtxt1)P(x_{t} | x_{t-1})也加上x0x_{0}的条件即P(xt1xt,x0)P(x_{t-1} | x_{t},x_{0})P(xtxt1,x0)P(x_{t} | x_{t-1},x_{0}),表示在相同x0x_{0}的条件下,实际上可以忽略它们 P(xt1xt,x0)=P(xtxt1,x0)P(xt1x0)/P(xtx0)        (14)P(x_{t-1} | x_{t},x_{0}) = P(x_{t} | x_{t-1},x_{0}) P(x_{t-1} | x_{0}) / P(x_{t} | x_{0})~~~~~~~~(14)
  • 至此只需要求解等式右边的式子就能得到对于给定的xtx_{t}其前一时刻xt1x_{t-1}的概率
  • P(xtxt1)P(x_{t} | x_{t-1})表示给定xt1x_{t-1}xtx_{t}的概率,而从xt1x_{t-1}xtx_{t}关系式中的Et\mathcal{E}_t是服从标准正态分布的随机数,再乘以1at\sqrt{ 1-a_t}这个常数后,方差就变成了该常数的的平方即
    N(0,1at)\mathcal{N}(0, 1- a_t)
  • 然后再加上at×xt1\sqrt{a_t} × x_{t-1},也就是分布的均值,这就是给定xt1x_{t-1}时刻,对应的xtx_{t}时刻的概率分布,它是一个正态分布 N(at×xt1,1at)——P(xtxt1,x0)      (15)\mathcal{N}(\sqrt{a_t} × x_{t-1}, 1- a_t) —— P(x_{t} | x_{t-1},x_{0})~~~~~~(15)
  • P(xtx0)P(x_{t} | x_{0})表示给定x0x_{0}的情况下xtx_{t}的概率,在式子(11)中,E\mathcal{E}也是一个服从标准正态分布的随机数,随后乘以了一个常数, 方差变成了该常数的平方,然后再加上atx0\sqrt{\overline{a}_t}x_{0},也就是正态分布的均值 N(atx0,1at)——P(xtx0)      (16)\mathcal{N}(\sqrt{\overline{a}_t}x_{0}, 1 - \overline{a}_t) —— P(x_{t} | x_{0})~~~~~~(16)
  • 对于P(xt1x0)P(x_{t-1} | x_{0})也是如此 N(at1x0,1at1)——P(xt1x0)      (17)\mathcal{N}(\sqrt{\overline{a}_{t-1}}x_{0}, 1 - \overline{a}_{t-1}) —— P(x_{t-1} | x_{0})~~~~~~(17)
  • 当正态分布的均值和方差确定后, 就可以把它们(15,16,17)写成正态分布的概率密度函数形式 P(xtxt1,x0)=12π(1at)exp((xtatxt1)22(1at))P(x_t | x_{t-1}, x_0) = \frac{1}{\sqrt{2 \pi (1 - a_t)}} \exp\left(-\frac{(x_t - \sqrt{a_t} \cdot x_{t-1})^2}{2(1 - a_t)}\right)

P(xtx0)=12π(1at)exp((xtatx0)22(1at))P(x_t | x_0) = \frac{1}{\sqrt{2 \pi (1 - \overline{a}_t)}} \exp\left(-\frac{(x_t - \sqrt{\overline{a}_t} \cdot x_0)^2}{2(1 - \overline{a}_t)}\right)

P(xt1x0)=12π(1at1)exp((xt1at1x0)22(1at1))P(x_{t-1} | x_0) = \frac{1}{\sqrt{2 \pi (1 - \overline{a}_{t-1})}} \exp\left(-\frac{(x_{t-1} - \sqrt{\overline{a}_{t-1}} \cdot x_0)^2}{2(1 - \overline{a}_{t-1})}\right)

  • 在将这三个概率密度函数带入到贝叶斯公式中,我们的目标是求解给定xtx_{t}条件下xt1x_{t-1}的概率,实际上他也是正态分布,所以接下来要做的就是将下面的式子变换成xt1x_{t-1}的概率密度函数形式 P(xt1xt,x0)=12π(1at)exp((xtatxt1)22(1at))12π(1at1)exp((xt1at1x0)22(1at1))12π(1at)exp((xtatx0)22(1at))P(x_{t-1} | x_t, x_0) = \frac{\frac{1}{\sqrt{2 \pi (1 - a_t)}} \exp\left(-\frac{(x_t - \sqrt{a_t} \cdot x_{t-1})^2}{2(1 - a_t)}\right) \cdot \frac{1}{\sqrt{2 \pi (1 - \overline{a}_{t-1})}} \exp\left(-\frac{(x_{t-1} - \sqrt{\overline{a}_{t-1}} \cdot x_0)^2}{2(1 - \overline{a}_{t-1})}\right)}{\frac{1}{\sqrt{2 \pi (1 - \overline{a}_t)}} \exp\left(-\frac{(x_t - \sqrt{\overline{a}_t} \cdot x_0)^2}{2(1 - \overline{a}_t)}\right)}

  • 变换后的式子为,至此,我们就确定了给定xtx_{t}条件下,xt1x_{t-1}的概率分布 P(xt1xt,x0)=12π(1at1at11at)exp((xt1(at(1at1)xt1at+at1(1at)x01at))22(1at1at11at)2)P(x_{t-1} | x_t, x_0) = \frac{1} {\sqrt{2 \pi }(\frac{{\sqrt{1 - {a}_t}{\sqrt {1 - \overline{a}_{t-1}}}}}{\sqrt {1 - \overline{a}_t}})} \exp\left(-\frac{(x_{t-1} -(\frac{\sqrt{a_t}(1 - \overline{a}_{t-1}) · x_t} {1 - \overline{a}_t} + \frac{\sqrt{\overline{a}_{t-1}}(1 - a_t) · x_0 } {1 - \overline{a}_t}) )^2} {2(\frac{{\sqrt{1 - {a}_t}{\sqrt {1 - \overline{a}_{t-1}}}}}{\sqrt {1 - \overline{a}_t}})^2}\right)

  • 我们的最终目标是利用xtx_{t}到前一时刻xt1x_{t-1}的关系,从xTx_{T}开始不断使用这个关系,迭代直到x0x_{0}x0x_{0}是需要求得的结果,但x0x_{0}是我们要求的结果,别急,我们之间已经求得了从x0x_{0}xtx_{t}的关系式(11),将这个式子变换,可以得到x0x_{0}的等式,再用它替换掉上面式子中的x0x_{0}

x0=xt1at×Eatx_0 = \frac{x_t - \sqrt{1-\overline{a}_t} × \mathcal{E}}{\sqrt{\overline{a}_t}}

  • 就有了这个不含x0x_{0}的式子,它表示的就是,对于任意的xtx_{t}时刻的图像,都可以认为式从某个x0x_{0}原图直接加噪得到的,而只要知晓了从x0x_{0}xtx_{t}加入的噪声E\mathcal{E},就能够得到它前一时刻xt1x_{t-1}的概率分布 P(xt1xt,x0)N(at(1at1)xt1at+at1(1at)(xt1at×Eat)1at,(1at1at11at)2)P(x_{t-1} | x_t, x_0) — \mathcal{N}(\frac{\sqrt{a_t}(1 - \overline{a}_{t-1}) · x_t} {1 - \overline{a}_t} + \frac{\sqrt{\overline{a}_{t-1}}(1 - a_t)(\frac{x_t - \sqrt{1-\overline{a}_t} × \mathcal{E}}{\sqrt{\overline{a}_t}}) } {1 - \overline{a}_t} , (\frac{{\sqrt{1 - {a}_t}{\sqrt {1 - \overline{a}_{t-1}}}}}{\sqrt {1 - \overline{a}_t}})^2)

  • 这里我们可以训练一个神经网络模型,输入xtx_{t}时刻的图像,来预测此图像相对于某个x0x_{0}原图加入的噪声,也就是说神经网络模型输出的式噪声E\mathcal{E},然后根据此噪声就能够得到前一时刻图像的概率分布,然后用此概率分布进行随机采样,就能得到一张前一时刻的图像,然后再将前一时刻图像继续输入神经网络模型预测它的噪声E\mathcal{E},不断重复此过程直到得到x0x_{0}在这里插入图片描述

所以UNet最开始输入的是xtx_{t},最后预测的是一个噪音,而这个噪音是什么噪音?是ttt1t-1时刻之间的噪音吗,其实并不是,其实是xtx_{t}x0x_{0}之间的噪音 为什么要预测E\mathcal{E}呢?,其实我们是要还原x0x_{0},那为什么不能一步直接生成图像?因为前向过程是通过马尔科夫性质一步一步推出来的,如果跳步了就不符合马尔科夫性质了

  • 那么这个过程中最开始的时候如何得到xTx_{T}的图像?
  • x0x_{0}xtx_{t}的关系式中可以看到,对于大T时刻,at\overline{a}_t值接近0,所以xTx_{T}约等于E\mathcal{E},也就是说xTx_{T}的图像近似于标准正态分布,因此可以认为任何一张标准正态分布的噪声图片都是某张x0x_{0}的原图加噪后得到的,只需要用标准正态分布随机采样,就能生成xTx_{T}时刻的图片 在这里插入图片描述
  • 我们可以将神经网络看成一个黑盒,现在我们只关注它的输入和输出,该神经网络接收xtx_{t}时刻的图像作为输入来预测该图像加入的噪声E\mathcal{E},除了xtx_{t}时刻的图像外,神经网络还同时接收 t 作为另一个参数,这是为了更好的学习到该图像再整个加噪过程中的位置,
  • 从T时刻向0时刻递减的过程中可以看到,前一时刻t1t-1的图像的正态分布标准差越来越小逐渐接近0,也就是说前一时刻的图像越来越接近均值,越来越确定,这就是DDPM模型反向过程生成图片的原理