版本对应:

本网页讨论的机器学习内容,为特定的机器学习内容(并未与CFD结合)。在《无痛苦NS方程笔记》中, 特定的将CFD与机器学习互相结合起来,无普适性机器学习内容。

ML: 扩散模型

在阅读本文之前,请阅读《无痛苦NS方程笔记》中的监督学习的数学算法一节。

去噪概率扩散模型(DDPM)、生成对抗网络(GAN)在CFD领域主要用于流场重组。相应的研究并不算多,Shu等在2023年发表在JCP的文章应该是第一篇使用DDPM来对流场进行重组的第一篇文章[SLF23]。后续也有几篇工作发表在2024年。可见扩散模型在流场重组领域属于非常新且目前来看比较小众的研究方向。本文简述去噪概率扩散模型背后的理论背景。

去噪概率扩散模型最开始主要用于生成图像。比如输入机器一段文字“给我来一张猫”,机器就会给你输出一个猫的图。这里面还涉及到另外一个技术是文字转码。如果不讨论文字部分,仅仅关注去噪概率扩散模型的话。一个训练好的去噪概率扩散模型,输入一个全是噪音的图片,可以生成特定的图案。这个链接很好的演示了去噪概率扩散模型形成人脸照片的过程。网页每次自动输入一个噪音图片,其会生成各种人脸。其使用的就是去噪概率扩散模型。

前向过程/扩散过程

在去噪概率扩散模型中,如果需要进行人脸生成,那么需要准备上千张或者上万张人脸照片。单独拎出来一个人脸照片,认为其是\(x_0\),注意\(x_0\)是原始的没有噪音的图片。在去噪概率扩散模型中需要设定若干个时间步\(t=1,2,3,...\),每个时间步上可以进行下述运算:

(1)\[ x_1=\sqrt{1-\alpha_1}\epsilon_1+\sqrt{\alpha_1}x_{0} \]
(2)\[ x_2=\sqrt{1-\alpha_2}\epsilon_2+\sqrt{\alpha_2}x_{1} \]
(3)\[ x_3=\sqrt{1-\alpha_3}\epsilon_3+\sqrt{\alpha_3}x_{2} \]
(4)\[ ... \]
(5)\[ x_t=\sqrt{1-\alpha_t}\epsilon_t+\sqrt{\alpha_t}x_{t-1} \]

其中\(x_t\)表示当前时间步\(t\)的合成数据,\(\alpha_t\)为一个定义在\(t\)下超参数(每个\(t\)具有一个\(\alpha\)),\(\epsilon_t\)表示当前时间步\(t\)的随机噪声(基于标准正态分布)。很明显,在给定超参数\(\alpha_t\)的情况下,每一个时间步都会在原始数据\(x_0\)上面附加一个噪声,因此在相当长的时间步下,\(x_t\)会变成一个完全噪声的毫无意义的图像。下面这个图片取自相关链接。其倾向的展示了进行了300次噪声添加后的\(x\)的变化。

注意,\(\alpha_t\)并不一定是一个固定的值。在英文里将其定义为variance schedule。一般情况下,越靠后的时间步,可添加的噪声越大。在链接中作者认为:前期如果加的噪声太多,会使得数据扩展的太快(比如突变),使得逆向还原变得困难; 同样因为后期数据本身已经接近随机噪声数据了,后期如果加的噪声不够多,相当于变化幅度小,扩散的太慢,这会使得链路变长需要的事件变多。 我们希望扩散的前期慢一点,后期快一点,因此\(\alpha_t\)最好是逐渐变小的。

\(\epsilon\)一直都表示一个标准正态分布,参考链接\(\epsilon\)可以表示为

(6)\[ \epsilon=\mathcal{N}(0,1) \]

其中\(\mathcal{N}(0,1)\)中的0表示均值,1表示方差。基于这个表示,\(\sqrt{1-\alpha_t}\epsilon\)可以表示为方差有所改变的正态分布:

(7)\[ \sqrt{1-\alpha_t}\epsilon=\mathcal{N}(0,1-\alpha_t) \]
_images/mengnalisha.JPG

这个过程也被称之为前向过程或扩散过程。可以看出的是,前向过程是一个明确具有数学含义的公式,并不需要神经网络。

下面讨论重参数。按照方程(5)的形式来看,如果要推进100次时间步,需要进行100次计算。仔细来看,针对\(x_2\),其实其可以从\(x_0\)直接获得:

(8)\[\begin{split} x_2=\sqrt{1-\alpha_2}\epsilon_2+\sqrt{\alpha_2}x_{1} =\sqrt{1-\alpha_2}\epsilon_2+\sqrt{\alpha_2} \left( \sqrt{1-\alpha_1}\epsilon_1+\sqrt{\alpha_1}x_{0} \right) \\\\ =\sqrt{1-\alpha_2}\epsilon_2 +\sqrt{\alpha_2 (1-\alpha_1)} \epsilon_1 +\sqrt{\alpha_2\alpha_1}x_{0} \end{split}\]

方程(5)右侧能否写成更简单的形式呢?答案是是的。这里面涉及到复杂的数学过程(可参考链接)。简单来理解,\(\sqrt{1-\alpha_2}\epsilon_2\)表示\(\mathcal{N}(0,1-\alpha_2)\)正态分布,\(\sqrt{\alpha_2 (1-\alpha_1)} \epsilon_1\)表示\(\mathcal{N}(0,\alpha_2 (1-\alpha_1))\)正态分布。\(\sqrt{1-\alpha_2}\epsilon_2+\sqrt{\alpha_2 (1-\alpha_1)} \epsilon_1\)表示两个不一样方差的正态分布的叠加:

(9)\[ \sqrt{1-\alpha_2}\epsilon_2+\sqrt{\alpha_2 (1-\alpha_1)} \epsilon_1 =\mathcal{N}(0,1-\alpha_2) + \mathcal{N}(0,\alpha_2 (1-\alpha_1)) \]

依据正态分布的特性,方程(9)的正态分布叠加后,还是一个正态分布:

(10)\[ \mathcal{N}(0,1-\alpha_2) + \mathcal{N}(0,\alpha_2 (1-\alpha_1)) =\mathcal{N}(0,1-\alpha_2+\alpha_2 (1-\alpha_1)) = \mathcal{N}(0,1-\alpha_2\alpha_1) \]

同时有:

(11)\[ \mathcal{N}(0,1-\alpha_2\alpha_1)=\sqrt{1-\alpha_2\alpha_1}\epsilon \]

(12)\[ x_2=\sqrt{\alpha_2\alpha_1}x_{0} + \sqrt{1-\alpha_2\alpha_1}\epsilon \]

类似的

(13)\[ x_3=\sqrt{\alpha_3\alpha_2\alpha_1}x_{0} + \sqrt{1-\alpha_3\alpha_2\alpha_1}\epsilon \]

也即:

(14)\[ x_t=\sqrt{\overline{\alpha_t}}x_{0} + \sqrt{1-\overline{\alpha_t}}\epsilon \]
(15)\[ \overline{\alpha_t}= \prod_{i=1}^{t}\alpha \]

由于所有时间步的\(\alpha\)都是小于1的数值,因此最后\(x_t\)倾向于是一个标准正态分布噪音图。

总结,给定任意一个\(x_0\),经过若干时间步的去噪后,其都会生成一个标准正态分布噪音图。如果将其中每一步的\(\epsilon\)记下来,则存在一个一对一的\(x_0\)\(x_t\)的对应关系:输入一个\(x_t\),会准确的复现一个\(x_0\)。这个过程最重要的是将其中每一步的\(\epsilon\)记下来。如果进行一举反三,有1000个人脸照片,如果记录这1000个人脸照片进行多个时间步的\(\epsilon\),则可以从任意一个标准正态分布噪音图,依据每个照片的\(\epsilon\),反推出清晰的人脸。

去噪概率扩散模型并没有这样操作。当然了这种操作看起来并不智能也不是机器学习。在去噪概率扩散模型中,这个\(\epsilon\)会尽可能的贴合这1000个人脸照片的全部,而不是一对一关系。因此将一个标准正态分布输入到去噪概率扩散模型后,其最终会输出一个人脸\(x_0\),但有可能是一个完全没有见过的人脸。这也体现了机器学习的特性:从1000张人脸照片,进行机器学习,来生成全新的人脸。

_images/diffTrain1.JPG

如上图所示[HJA20],训练过程:

  1. 输入\(N_x\)个批次的\(x_0\),输入\(N_t\)个批次的\(t\)

  2. 提取一个标准正态分布的场\(\epsilon_t\)

  3. 通过方程(14)来计算\(x_t\);

  4. \(x_t\)\(t\)输入到神经网络,映射出预测的\(\epsilon_t^\theta\)

  5. 通过优化器最小化\(\epsilon_t^\theta\)

  6. 回到第一步,进行下一个批次的训练,直到损失最小;

因此神经网络的输入为\(x_t\)\(t\),输出为噪音\(\epsilon_t^\theta\);那么是否可以通过方程(14)来一次反推出\(x_0\)?如果这样操作,那么机器学习则不能生成全新的人脸,其生成的人脸大体最接近与这1000张人脸,也即缺乏泛化能力。考虑一个人脸作为\(x_0\),通过方程(14)来反推\(x_0\),则会完全的反推出\(x_0\)原型。这也是一种1对1关系。并不是我们的目的。

逆向过程/去噪过程/采样过程

在前向过程中,加噪的过程是固定的。在逆向过程中,为了防止出现1对1关系,逆向过程认为从\(x_t\)\(x_{t-1}\)是一个概率事件,而不是一个100%确定的事件。这会导致完全不同的结果,因为后者会预测一个1对1关系,前者泛化能力更强。更好的理解是,从一个标准正态分布的噪音开始,反推出来的人脸可能是A和B的组合(理解为A的耳朵、B的嘴巴),而不是A或者B(这是1对1关系)。在这里需要调用统计学的贝叶斯定理:

(16)\[ 从(x_t,x_0)到x_{t-1}的概率=\frac{从(x_{t-1},x_0)到x_{t}的概率\cdot 从(x_0)到x_{t-1}的概率}{从(x_0)到x_{t}的概率} \]

以方程(16)为基础,可以推导出(推导过程略,可参考链接):

(17)\[ x_{t-1}=\tilde{\mu_t}+\sigma_t \mathcal{N}(0,1) \]
(18)\[ \tilde{\mu_t}=\frac{1}{\alpha_t}\left(x_t-\frac{1-\alpha_t}{\sqrt{1-\overline{\alpha_t}}}\epsilon_t^\theta \right) \]
(19)\[ \sigma_t =\frac{(1-\alpha_t)(1-\overline{\alpha_{t-1}})}{1-\overline{\alpha_t}} \]

因此在逆向过程中,

  1. 生成一个标准正态分布噪音场\(x_t\)

  2. 从最后一个时间步\(t\)开始,将\(x_t\)\(t\)输入到神经网络,映射出\(\epsilon_t^\theta\)

  3. 通过方程(14)来计算一个可能的\(x_0\),即为\(\tilde{x_0}\)(其为一个可能的\(x_0\),并不是100%);

  4. 通过方程(18)\(x_{t-1}\)

  5. 回到第一步,直至求得\(x_0\)

_images/diffTrain2.JPG

很明显去噪过程有一个随时间推进的过程,因此越多的时间步需要越多的去噪时间。

[HJA20]

Jonathan Ho, Ajay Jain, and Pieter Abbeel. Denoising diffusion probabilistic models. Advances in neural information processing systems, 33:6840–6851, 2020.

[SLF23]

Dule Shu, Zijie Li, and Amir Barati Farimani. A physics-informed diffusion model for high-fidelity flow field reconstruction. Journal of Computational Physics, 478:111972, 2023.