Diffusion Model的底层数学原理

这篇文章的内容主要以了解概念,并试图用更加通俗的语言来帮助理解为主,并不会做严谨、复杂的数学分析。

为了不浪费您的时间,请酌情阅读

引言

2023年,AI科技像是打了加强针一样,大量商用人工智能产品如雨后春笋一样爆发。

以ChatGPT为爆点的生成式AI开始,Midjourney,Stable Diffusion,Dalle·2… 包括最近出圈的Pika,也都备受世人关注。

当然,AI并不是一夜之间凭空出现的:两代前的iOS就开始支持图片文字识别;疫情期间一个30元人民币的摄像头就可以玩一玩的人脸识别;2018年在5v5的Dota2对战中,OpenAI训练的AI战胜了TI8冠军OG;更早期还有,Deepmind在围棋领域称霸,Google翻译使用文本模型增强其翻译准确度(虽如今被ChatGPT完爆)。这些过往AI走过的足迹,揭示了人工智能是如何一步一步走到了今天,最终量变产生质变,奇点在今年这个时刻爆发了。

AI正在逐渐改变我们的生活,旧科技正在这个崭新的未来进程中逐渐淡出我们的视野。不过,在准备登上前往新世纪的渡轮前,让我们把心思收回,看向这篇文章的标题。

扩散模型(Diffusion Model)

很多产品都使用了扩散模型,包括 Midjourney,Stable Diffusion,Dalle·2,由于我并不了解其他模型,所以我也不在此妄议。

扩散模型(Diffusion Model),本质是通过一个连续地加噪过程,来污染一组完整有意义的数据集,使数据集变成纯噪音。然后,训练模型学习去除噪声,直到其能大致拟合原有数据。在训练完成后,扩散模型可以用学习到的去噪过程来生成数据。这一连续地加噪过程,被称为前向过程(Forward Process); 与之相反,则被称为逆向去噪过程(Reverse Denoised Process)。对模型的训练,就在逆向去噪的过程中完成。

扩散模型不光能应用于图像相关的领域(虽然目前大部分都是该领域),音频、文字、视频等领域也有广泛的应用。

前向过程(Forward Process)

如上图所示,我们在左侧给出一组数据集,它在0时刻是清晰、有意义的,称作 随后,在上,加入一个服从于 的正态变量(也称为噪音),得到在1时刻数据集 * 在Stable Diffusion里,经常使用“迭代步数”来描述与此过程相反,名为Reverse Denoised Process的过程

数据集从到变化后,我们可以清楚地感知到,在一定程度上,原始数据集被噪音污染了。

接着,我们重复操作 …, 直到 ,这就是一个扩散模型的前向过程(Forward Process)。若给定一个,要获得,那么总共需要经过t个步骤。直到重复至第n步后,原始数据集中已经完全被噪声污染,几乎很难提取出有用的信息

注意,虽然 都是正态变量,但它们之间的均值µ 和标准差σ 却并不相同。从上面的迭代图中,我们也可以观察到此现象:第一步(即 )的迭代后, 增加噪点的数量,远小于最后一步(即 )中 所增加的噪点数。这也就是说,增加的在每一步中都服从一个不同的。但是我们也可以很明显地感知到,每一步独立的加噪幅度,都大致收敛至一个定值(这是一个经验值,不同的模型可能取值完全不同)

我们设置一个与步数相关的函数 , 是一个标准正态变量, ,那么 ; 由于随着步数的增加,逐渐变大,而,那么也就意味着 越来越大。 与之相反的是,由于数据集 的数据总量是恒定的,所以 的上一步 所占数量是逐渐减少的: 设, 那么 在 所占的数量就是 , 越来越小

到了这一步,我们只需要搞清楚 和 是什么,就可以写出一个完整的正向过程通用表达式了

显然, 与 存在着某种关系,在Diffusion Model 相关的论文中,取:

由此我们得出 和 的关系,那么知道这两者关系后,我们就可以挨个求出 , , ··· , 如:

正如之前在正态分布一文中提到的,Diffusion Model的前向过程,是完美符合热力学第二定律的:一滴墨水滴入一杯清水中,会逐渐扩散开;可能一开始墨汁和水还有明显的界限,但是随着时间(步数)的增加,两种液体最终会混在一起。

随着步数的增加,我们已知的,最终会变成,如果这个过程如果满足熵增定律的话,我们完全可以通过数学的方法,省略掉中间 的过程

将 (1 - 2) 代入至 (1 - 1), 得:

其中 是一个重采样的操作

点击查看正态变量的运算

化简得:

上述步骤中得出了 与 的关系; 重复步骤,最终可得:

得出 与 的关系,其中 是初始数据集,则任意时刻 可求

逆向去噪过程(Reverse Denoise Process)

在前向过程中,通过向原始数据集中持续添加噪音,最终得到无意义的数据集;而与之相反的则是,对无意义数据集进行一连串的去噪过程,直到得到拟合的原始数据集,这就是 Diffusion Model 中的逆向去噪过程。

> 一个聪明绝顶的做法? 前向过程中,我们已知:

那么:

你看,用任意时刻不是把原始数据求出来了吗? > 一个误区 使用式子 (2-1) 的确能得到一个值,但这个值却不能作为一个可用的输出值。以下解释是我从热力学中受到的启发,不一定正确,仅供参考:

前面的文章已经提到,墨水滴入水中后,逐渐溶解扩散的过程,是一个熵增的过程,这个过程符合热力学的描述:(单一系统中)能量总是由高流动至低,秩序总由整齐到凌乱。如果需要逆熵,则需要向系统中输入能量。所以由一个有秩序有意义的数据集,到一个无秩序无意义的,其过程是一个不消耗能量的自发过程。而其的推导过程也是符合逻辑有意义的,先由 找出与 之间的关系,再由 找出与 之间的关系,以此类推… 直到最终得出 与 之间的关系。

在式(2-1)中,等式左侧却并不能简单的看作有意义上的最终结果,而应该看作是对于时刻时,对于的预判,这个预判随着每一次的迭代而更新。这种理念和后验概率的理念很相似:每次迭代后产生的新数据集,又进一步影响原始原因的判断。当步差(delta of and )足够小时,式(2-1)中的 对于 和 有着近似的正确性,但对于超过这个范围的数据集,如:, 等,不具有近似的正确性。这也是为什么不能由一个无意义的(或 ),直接数学推导出有意义的,因为它们之间的步差(delta)过大,近似的前提不成立。

正如前向过程中,我们先研究了和之间的关系。在后向过程中,我们也先从 和 的关系开始入手:

前面已经说过, 和 之间差一个正态变量 ,这个 服从于一个标准正态分布;我们将噪音 上的点,落在 形成 ,看作一个概率事件,记做 ;通过所有路径生成的 的全路径记做 ;通过所有路径生成的 的全路径记做 ;那么:

1)通过 到达 后,最终到达 的路径,它的概率是: 2)根据贝叶斯公式,可逆推导出由 推导到达 后(此时 已是既定发生的事实 ),由 作为上级原因,所引发此事件的概率为:


值得注意的是:这里的(原始输入) 对于逆向过程而言,是未知的。前文提到,我们通过前向过程推导而来的式(2-1)中,由于步数过大,近似前提不成立,所以并不能真实拟合。但在这一步中,我们的主要目的是找出 和 的关系, 在此处不关键。而且,随着每一次的逆向迭代, 也会随之变化,从而越来越逼近真实情况。

根据正变量的运算,可得:

已知正态分布的概率密度函数为:

那么,
指数运算复习:

带幂次的自然常数e:

又因为:

所以:

由于 是一个已知的经验值,故标准差(或方差) 是一个常数。 注:在原始的 Diffusion Model 论文中,方差是一个固定值,机器不通过迭代优化其值;但在其衍生的分支模型上,也有很多将方差看作一个可迭代的变量。

观察,可知 是一个与 和 相关的变量,即:

所以,
为什么这里可以直接用式子(2-1),也就是变量 ?

  • 逆向过程中,由于 未知,这时 才是一个已知数。而且由于这里求的是 到 的过程,其步数(Delta)足够小,因此近似的前提成立。故而直接使用式子(2-1)迭代能得出相似结果。

模型训练和损失

通过逆向过程,我们找到了均值 和 正态变量 的关系,可以说,求出 就能使一组无意义的数据 恢复为有意义的原始数据组 。

但是,正如我们反复提及的熵增定律,一个逐渐倾向于混乱的系统,是不会自发还原到原来的秩序的。这也就是我们无法通过计算来精确的还原原始数据。但好在我们有计算机,来帮助我们完成近似的工作。

首先,在前向过程中,计算机会拿到每一步的 ,随后的逆向过程中,它会预测到每一步 ,并将其二者相减去:

当 处于一个合理(可用)的范围时,这个模型就训练成功了。

在 Diffusion Model 真正投入使用时,我们只会用到它的逆向过程。