SGM 在扩散模型大家庭中算是一个重要的思想,也涉及很多复杂的东西, 如有写得不准确的地方还请指出。
本人数学不好,尽量避免复杂公式和各种证明 (´。_。`)
SGM (Score-based Generative Model) 说来话长,至于有多长,一直可以追溯到布朗运动(啊对,就是初高中物理课上学的那个……)
现在,假设我们有一个一维的直线,有个小人从原点出发,每次随机地选择向左走1格或者向右走1格,且向左走和向右走的两个选项,被选择的概率相等。
代表小人离原点的距离, 代表选择的次数,如果选择的次数越多,那么 将会逐渐服从一个均值为 0,方差为 的正态分布。
(每次走1格的距离) 以及时间间隔 (每次选一下).
接下来,我们希望把这个步长无限缩小,一直缩小到上述的过程变成一个连续的过程。
, 我们取 , 然后我们让 , 就得到了所谓的"标准布朗运动" (Standard Brownian Motion). 由于布朗运动也叫做维纳过程 (Wiener Process),所以我们用 来表示。这个标准布朗运动满足一个特性(当然还有其他特性,不一一列举)——对于 , 服从一个均值为0,方差为 正态分布
最后,顺带一谈,这个布朗运动有一个重要的性质,其二阶变差(Quadratic Variation)存在且等于 .
换句话说,就是,假设把一个 的时间区间,切分为无限小的一份一份(即, )。每个非常小的区间里面,相邻两个 的差(即 , 只不过 t 和 t-1 间隔非常小)做个平方。然后,将所有的这么一小份一小份累加起来,最终的合计值将会是 (此处应该有皮卡丘震惊表情). 引申一下,就得到了 .(这里的 意味着 的变化;布朗运动不可微分)
. 这个公式是伊藤微积分(Itô calculus)的一个基础,从这个公式可以引入一系列的微分、积分的定理,但因为和文章主旨无关,所以略过不谈了。
Cut to the chase, 随机微分方程(stochastic differential equation, SDE)即带有随机过程的微分方程,其中一个典型的例子就是
被称为 drift, 后一项 被称为 diffusion, 是一个标准布朗运动. SGM 的论文里面为了简单,diffusion 项简化为了 且是一个标量(虽然论文也给出了带有参数 的一般化形式,但是太难了一句话都没看懂).
是 是什么。
和 的公式;例如在 , 的情况下,这个 SDE 被称作 VP-SDE, 是 DDPM 的一般化的形式.
这里稍微花一点时间,说一下上面两个函数 f 和 g 是怎么得到的。
首先,我们从 DDPM 的马尔可夫链出发:
上面的马尔可夫链是非连续的,每一步的间隔是1。于是,我们借用最初那个布朗运动的那个小人的思想,把马尔科夫链的步长无限缩小,一直缩小到一个连续的区间 上面去。
, , 这样我们就有了 之类的“映射”关系。
(原论文这里有个 typo, 把 1/N 写成了 1,看了半天没看懂,ε=( o`ω′)ノ)
, 然后我们有以下的公式
,我们可以利用二项近似(Binomial Approximation)进行改写.
, 所以,这里有如下的近似关系
移到前面去,于是我们就有了如下的随机微分方程
上面的这个式子叫做 VP-SDE(Variance Preserving SDE),DDPM 是其离散化的形式,还有一种叫做 VE-SDE,SMLD 是其离散化的形式(在这里略过不说了)。
所以,正儿八经说了大半天 装了大半天B,想说的一点就是——上面的 VP-SDE 就是给数据分布加噪的过程(正向过程)。
,有一个对应的逆向过程——
是我们已知的, 是标准布朗运动,如果我们知道 这一项的话,那就大功告成了。
是什么呢。
一个概率分布,这个概率分布,我们虽然不知道,但我们也许可以用一个 参数化的概率分布 去模拟它,我们通过学习参数 使 去接近 。
,我们可以认为由两部分组成——表示"密度"的函数 , 与归一化因子 .
,比如说,用极大似然估计法 (Maximum Likelihood Estimation),我们首先要知道 的具体形式,但是问题就在于 这一项是解不出来的。
怎么办呢,这里我们引入 score matching 的概念。我们把 叫做 score function,然后把上面的 通过 log 拆分成两项 . 然后我们发现,我们要的是 x 的梯度,所以后面一项 因为和 x 无关,所以就完全没了(皮卡丘震惊表情)。而且 还不受"概率分布"的约束 (unnormalized),意味着我们甚至可以使用一个神经网络作为 。
去贴近数据分布的 score function . 然后就大功告成了,是吗?问题是,我们也不知道数据分布的 score function。
.
这个方法有么?还真有!(なんとでもなるはずだ!)
这里直接把公式列出来了:
注:我在一维的情况下做了一些模拟——例如,标准正态分布中采样,并假设我们的模型就是标准正态分布,理论上 loss 应该给出0,但是最后算出来却是 -0.5(而且还是个负数)。这里贴出代码,请大佬们指点一下。我也试了一下逻辑分布(Logistic Distribution), 但也没有得到想要的结果。
最后,我们有了去噪的SDE,我们对其离散化,我们就得到了逆向过程。这里我就直接贴论文里的公式了。
)而因为我们的 score function 是一个随着 t 变动的模型,为了确保 来自分布 论文里面使用了一个 corrector 进行修正。这个 corrector 可以是任何基于 MCMC 的算法。
MIT的公开课程,讲伊藤微积分、随机微分方程的。小白也能看的懂,而且还带英文字幕:
https://ocw.mit.edu/courses/18-s096-topics-in-mathematics-with-applications-in-finance-fall-2013/video_galleries/video-lectures/
知乎上的一篇有关于SDE和Diffusion的文章,如果你想知道一些SDE公式的来龙去脉,可以参考:
https://zhuanlan.zhihu.com/p/619188621
知乎上的一篇讲DDPM的文章,非常透彻,之前也推荐过,这里再推荐一次:
https://zhuanlan.zhihu.com/p/638442430
知乎上的一篇有关于 Score Matching 的文章,里面有 Score Matching 的 loss 的公式推导:
https://zhuanlan.zhihu.com/p/583666759
SGM 论文,官方的 colab,里面有完整的代码
https://colab.research.google.com/drive/120kYYBOVa1i0TD85RjlEkFjaWDxSFUx3?usp=sharing
还有一个 probability flow ODE 没有涉及,但太累了写不下去了,留到以后哪天和DDIM一起合并了写吧……坑+1