快速学会Diffusion模型(不含公式推导)February 19, 2023

前些天看到 AudioLDM 的语音效果非常棒,忽然想起来之前想要写一篇简单易懂的 Diffusion 教程,但一直没想起来写,趁着休息日赶紧写一下 w。按照惯例,这篇文章的标题应该叫《三岁小可爱也能学会 Diffusion 模型》。

之前很流行的图片生成模型 DALL-E-2,以及今天看到的音频生成模型 AudioLDM 的背后都是 Diffusion 模型。在这之前,GAN 模型几乎统治了生成模型,但由于 GAN 模型不易训练,模型复现困难等原因大家纷纷感到扩散模型真香(其实是 GAN 模型卷不动了,但是用扩散模型能把 GAN 做过的事情重新水水论文)。

如果无法想象什么是扩散的话,可以想想在一杯水里滴入一滴墨水,墨水一点点的给整杯水染上色,这个过程可以简单的理解为:墨水的扩散过程(虽然可能不是这么形容的) 扩散模型与墨水扩散很像,但有些差别,扩散模型是在图像中不断加入噪声,加到最后一步时,整个图像都会被噪声覆盖。

img

不要将噪声当作环境中的让人感到不愉快的声音,可以简单的理解为在图像中用随机颜色画了个点。假设上面猫猫头图片的横纵都为 3 厘米,然后用间隔一厘米的方式划分成一个网格,取网格中的 1x1 小块,然后给这个小块染上一个不同的颜色,这里的小块上的不同颜色就是噪声。

所以简单理解扩散就是:在最开始是一张正常的猫猫头,然后不断的给小块染色,最后会得到一个五颜六色的图像。

扩散模型分为前向和后向,前向是给猫猫头染色的过程,后向就是将这个过程逆过来做一遍: 不断的移除五颜六色的图片上的噪声,最后得到一个猫猫头。

以上是理论部分,下面我们来看看具体是怎么做的。 首先看一下几个符号的读音(以防有小伙伴不知道怎么读):

img

读作阿尔法,写作 Alpha

img

读作贝塔,写作 Beta

img

上面的横杠是 bar,在中文环境被人习惯的读作拔,所以这个读作阿尔法拔(怪怪的) Bar 代表累乘,Alpha bar 就是 Alpha 的累乘。

在 DDPM 论文中,beta 是一个从 0.0001 到 0.002 的线性值[0.0001, 0.002]

img

alpha 等于 1- beta T 代表某一时刻,已知 t0 时,beta 为 0.0001, 所以 t0 时 alpha 为 1-0.0001

下面是论文中前向的最终公式:

img

在 T 时刻,图像加噪声的 Xt 就长这样

Beta 越来越大,alpha 越来越小,所以图像受 alpha 的影响越来越小,受到噪声的影响越来越大

逆向时,Xt-1 长这样:

img

已知 Xt 就可以逐渐求到 X0

前向和后向公式后面都跟着一个噪声,噪声是没办法直接知道的,所以就需要借助模型的帮忙。

所以扩散模型的训练可以简单的描述为: 训练一个模型,让它能够根据图片预测出噪声 (学习 Xt 与噪声的关系)

知道噪声后就可以逐渐预测出 X0 的图片,预测过程是这样的: 输入 Xt,预测噪声,根据噪声计算 Xt-1 计算 Xt-2 计算 Xt-3 ….. 得出 X0

我们能看到训练过程是比较简单的,不需要像训练 GAN 模型一样训练生成器和判别器,同时也很容易理解。

我们可以融入一些其他的特征,比如文字,将之融入到模型中,这样就可以根据文字输出相关的图片。DALL-E-2 大概就是这样做的。

由于视频有一堆图像构成,音频也有频谱图,所以用扩散模型生成图片,音频,视频都是非常适合的。

当然在实际应用中不会直接用这样原始的模型,因为计算从 Xt 到 X0 的时间还是蛮长的,所以要缩减计算步数(比如 DDIM)。