我正在参加「启航方案」


模型来源

2015年的时分,有几位大佬依据非平衡热力学提出了一个纯数学的生成模型 (Sohl-Dickstein et al., 2015)。不过那个时分他们没有用代码实现,所以这篇作业并没有火起来。

直到后来斯坦福大学(Song et al., 2019) 和谷歌大脑 (Ho et al., 2020) 有两篇作业延续了15年的作业。再到后来2020年谷歌大脑的几位大佬又把这个模型实现了出来(Ho et al., 2020),因为这个模型一些极端优异的特性,所以它现在火了起来。

分散模型能够做什么?呢它能够做一些。条件生成和非条件生成。在图画、语音、文本三个方向都已经有了一些应用,并且作用比较突出。

比较出圈的作业有我刚介绍的text to image的生成作业比方

  • OpenAI的GLIDE和 DALL-E 2

  • 谷大脑的 ImageGen

  • 德国海德堡大学的Latent Diffusion

什么是分散模型?

Diffusion model 和 Normalizing Flows, GANs or VAEs 相同,都是将噪声从一些简单的散布转换为一个数据样本,也是神经网络学习从纯噪声开端逐渐去噪数据的进程。 包括两个步骤:

  • 一个咱们选择的固定的(或者说预界说好的)前向分散进程 qq ,便是逐渐给图片增加高斯噪声,直到终究取得纯噪声。
  • 一个需求学习的反向的去噪进程 pp_\theta,练习一个神经网做图画去噪,从纯噪声开端,直到取得终究图画。

突然火起来的diffusion model是什么?

前向和反向进程都要经过时刻步tt,总步长是TT(DDPM中T=1000T=1000)。

你从t=0t=0开端,从数据集散布中采样一个实在图片x0x_0。比方你用cifar-10,用cifar-100,用ImageNet,总之便是从你数据集里随机采样一张图片作为x0x_0

前向进程便是在每一个时刻步tt中都从一个高斯散布中采样一个噪声,将其增加到上一时刻步的图画上。给出一个足够大的TT,和每一时刻步中增加噪声的表格,终究在TT时刻步你会取得一个isotropic Gaussian distribution。

我要开端上公式了!

咱们令q(x0)q(x_0)是实在散布,也便是实在的图画的散布。

咱们能够从中采样一个图片,也便是x0∼q(x0)x_0 \sim q(x_0)

咱们设定前向分散进程q(xt∣xt−1)q(x_t|x_{t-1})是给每个时刻步tt增加高斯噪声,这个高斯噪声不是随机选择的,是依据咱们预选设定好的方差表(0<1<2<…<T<10 < \beta_1 < \beta_2 < … < \beta_T < 1)的高斯散布中获取的。

然后咱们就能够得到前向进程的公式为:

q(xt∣xt−1)=N(xt;1−txt−1,tI).q({x}_t | {x}_{t-1}) = \mathcal{N}({x}_t; \sqrt{1 – \beta_t} {x}_{t-1}, \beta_t \mathbf{I}).
N(xt;1−txt−1,tI)便是xt∼N(1−txt−1,tI).\mathcal{N}({x}_t; \sqrt{1 – \beta_t} {x}_{t-1}, \beta_t \mathbf{I}) 便是{x}_t \sim \mathcal{N}( \sqrt{1 – \beta_t} {x}_{t-1}, \beta_t \mathbf{I}).

回想一下哦。一个高斯散布(也叫正态散布)是由两个参数决定的,均值\mu和方差2≥0\sigma^2 \geq 0

然后咱们就能够以为每个时刻步tt的图画是从一均值为t=1−txt−1{\mu}_t = \sqrt{1 – \beta_t} {x}_{t-1}、方差为t2=t\sigma^2_t = \beta_t的条件高斯散布中画出来的。凭借参数重整化(reparameterization trick)能够写成

xt=1−txt−1+t{x}_t = \sqrt{1 – \beta_t}{x}_{t-1} + \sqrt{\beta_t} \mathbf{\epsilon}

其间∼N(0,I)\mathbf{\epsilon} \sim \mathcal{N}(\mathbf{0}, \mathbf{I}),是从规范高斯散布中采样的噪声。

t\beta_t在不必的时刻步tt中不是固定的,因而咱们给\beta加了下标。关于t\beta_t的选择咱们能够设置为线性的、二次的、余弦的等(有点像学习率方案)。

比方在DDPM中1=10−4\beta_1 = 10^{-4},T=0.02\beta_T = 0.02,在中间是做了一个线性插值。而在Improved DDPM中是运用余弦函数。

x0x_0开端,咱们经过x1,…,xt,…,xT\mathbf{x}_1, …, \mathbf{x}_t, …, \mathbf{x}_T,终究取得xT{x}_T ,假如咱们的高斯噪声表设置的合理,那终究咱们取得的应该是一个纯高斯噪声。

现在,假如咱们能知道条件散布p(xt−1∣xt)p({x}_{t-1} | {x}_t),那咱们就能够将这个进程倒过来:采样一个随机高斯噪声xtx_t,咱们能够对其逐步去噪,终究得到一个实在散布的图片x0x_0

可是咱们实际上没办法知道p(xt−1∣xt)p({x}_{t-1} | {x}_t)。因为它需求知道一切或许图画的散布来核算这个条件概率。因而,咱们需求凭借神经网络来近似(学习)这个条件概率散布。 也便是p(xt−1∣xt)p_\theta ({x}_{t-1} | {x}_t),其间, \theta是神经网络的参数,需求运用梯度下降更新。

所以现在咱们需求一个神经网络来表明逆向进程的(条件)概率散布。假如咱们假设这个反向进程也是高斯散布,那么回想一下,任何高斯散布都是由两个参数界说的:

  • 一个均值\mu_\theta;
  • 一个方差\Sigma_\theta

所以咱们能够把这个进程参数化为

p(xt−1∣xt)=N(xt−1;(xt,t),(xt,t))p_\theta (\mathbf{x}_{t-1} | \mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1}; \mu_\theta(\mathbf{x}_{t},t), \Sigma_\theta (\mathbf{x}_{t},t))

其间均值和方差也取决于噪声水平tt

从上边咱们能够知道,逆向进程咱们需求一个神经网络来学习(表明)高斯散布的均值和方差。

带DDPM中作者固定方差,只让神经网络学习条件概率散布的均值。

First, we set (xt,t)=t2I\Sigma_\theta ( \mathbf{x}_t, t) = \sigma^2_t \mathbf{I} to untrained time dependent constants. Experimentally, both t2=t\sigma^2_t = \beta_t and t2=~t\sigma^2_t = \tilde{\beta}_t (see paper) had similar results.

之后再Improved diffusion models这篇文章中进行了改进,神经网络既需求学习均值也要学习方差。

经过重新参数化平均值界说方针函数

为了推导出一个方针函数来学习逆向进程的均值,作者观察到qqpp_\theta能够看做是一个VAE模型 (Kingma et al., 2013).

因而,变分下界(ELBO)能够用来最小化关于ground truthx0x_0的负对数似然。

这个进程的ELBO是每个时刻步tt的损失总,L=L0+L1+…+LL=L_0+L_1+…+L_

经过构建正向进程和反向进程,损失的每一项(除了L0L_0)是两个高斯散布之间的KL散度,能够明确地写为关于平均值的L2L_2损失!

因为高斯散布的特性,咱们不需求在正向qq进程中迭代tt步就能够取得xtx_t的结果:

q(xt∣x0)=N(xt;tx0,(1−t)I)q({x}_t | {x}_0) = \cal{N}({x}_t; \sqrt{\bar{\alpha}_t} {x}_0, (1- \bar{\alpha}_t) \mathbf{I})

其间t:=1−t\alpha_t := 1 – \beta_t and t:=s=1ts\bar{\alpha}_t := \Pi_{s=1}^{t} \alpha_s

这是一个很优异的特点。这意味着咱们能够对高斯噪声进行采样并恰当缩放直接将其增加到x0x_0中就能够得到xtx_t。请注意,t\bar{\alpha}_t是方差表t\beta_t的函数,因而也是已知的,咱们能够对其预先核算。这样能够让咱们在练习期间优化损失函数LL的随机项(换句话说,在练习期间随机采样tt就能够优化LtL_t)。

这个特点的另一个美丽之处this excellent blog post) 在于对均值进行参数重整化,使神经网络学习(猜测)增加的噪声(经过网络(xt,t)\epsilon_\theta(x_t,t)),在KL项中构成损失的噪声等级tt。这意味着咱们的神经网络变成了噪声猜测器,而不是直接去猜测均值了。均值的核算方法如下:

(xt,t)=1t(xt−t1−t(xt,t)) {\mu}_\theta({x}_t, t) = \frac{1}{\sqrt{\alpha_t}} \left( {x}_t – \frac{\beta_t}{\sqrt{1- \bar{\alpha}_t}} {\epsilon}_\theta({x}_t, t) \right)

终究的方针函数LtL_t 长这样,给定随机的时刻步 tt 使∼N(0,I){\epsilon} \sim \mathcal{N}({0}, {I}) ):

∥−(xt,t)∥2=∥−(tx0+(1−t),t)∥2. \| {\epsilon} – {\epsilon}_\theta({x}_t, t) \|^2 = \| {\epsilon} – {\epsilon}_\theta( \sqrt{\bar{\alpha}_t} {x}_0 + \sqrt{(1- \bar{\alpha}_t) } {\epsilon}, t) \|^2.

其间x0x_0是初始图画,咱们看到噪声tt样本由固定的前向进程给出。\epsilon是在时刻步长tt采样的纯噪声,(xt,t)\epsilon_\theta(x_t,t)是咱们的神经网络。神经网络的优化运用一个简单的均方差错(MSE)之间的实在和猜测高斯噪声。 练习算法如下

突然火起来的diffusion model是什么?

  1. 从位置且杂乱的实在数据散布q(x0)q(x_0)中随机采样x0x_0
  2. 咱们在1和TT之间均匀采不同时刻步的噪声,
  3. 咱们从高斯散布采样一些噪声,并在时刻步上运用前边界说的优良特点来损坏输入散布,
  4. 神经网络依据损坏的图画xtx_t进行练习,目的是猜测施加在图片上的噪声,也便是依据已知方差表t\beta_t作用在x0x_0上的噪声

一切这些都是在批量数据上完成的,和运用随机梯度下降法来优化神经网络相同。