当前位置:首页|资讯|AIGC

AIGC: SGM (Score-based GenerativeModel) 笔记

作者:刹那-Ksana-发布时间:2023-07-06

SGM 在扩散模型大家庭中算是一个重要的思想,也涉及很多复杂的东西, 如有写得不准确的地方还请指出。

本人数学不好,尽量避免复杂公式和各种证明 (´。_。`)

标准布朗运动

SGM (Score-based Generative Model) 说来话长,至于有多长,一直可以追溯到布朗运动(啊对,就是初高中物理课上学的那个……)

现在,假设我们有一个一维的直线,有个小人从原点出发,每次随机地选择向左走1格或者向右走1格,且向左走和向右走的两个选项,被选择的概率相等。

S_t 代表小人离原点的距离,t 代表选择的次数,如果选择的次数越多,那么 S_t 将会逐渐服从一个均值为 0,方差为 t 的正态分布。

网上找的图片,图中的N就是上文的t;t越大,曲线就会越来越扁平

%5CDelta%20x%3D1 (每次走1格的距离) 以及时间间隔 %5CDelta%20t%3D1 (每次选一下). 

接下来,我们希望把这个步长无限缩小,一直缩小到上述的过程变成一个连续的过程。

Var(S_1)%3D1, 我们取 %5CDelta%20x%3D%5Csqrt%7B%5CDelta%20t%7D%20, 然后我们让 %5CDelta%20t%20%5Cto%200, 就得到了所谓的"标准布朗运动" (Standard Brownian Motion). 由于布朗运动也叫做维纳过程 (Wiener Process),所以我们用 W_t 来表示。这个标准布朗运动满足一个特性(当然还有其他特性,不一一列举)——对于 s%3E0%2C%20t%3E0, W_%7Bs%2Bt%7D-W_s 服从一个均值为0,方差为 t 正态分布

最后,顺带一谈,这个布朗运动有一个重要的性质,其二阶变差(Quadratic Variation)存在且等于 T

换句话说,就是,假设把一个 %5B0%2C%20T%5D 的时间区间,切分为无限小的一份一份(即, dt)。每个非常小的区间里面,相邻两个 W 的差(即 W_%7Bt_i%7D-W_%7Bt_%7Bi-1%7D%7D , 只不过 t 和 t-1 间隔非常小)做个平方。然后,将所有的这么一小份一小份累加起来,最终的合计值将会是 T(此处应该有皮卡丘震惊表情). 引申一下,就得到了 (dW_t)%5E2%3Ddt.(这里的 dW_t 意味着 W 的变化;布朗运动不可微分

随机微分方程

(dW_t)%5E2%3Ddt. 这个公式是伊藤微积分(Itô calculus)的一个基础,从这个公式可以引入一系列的微分、积分的定理,但因为和文章主旨无关,所以略过不谈了。

Cut to the chase, 随机微分方程(stochastic differential equation, SDE)即带有随机过程的微分方程,其中一个典型的例子就是

dX_t%3Df(X_t%2Ct)dt%2Bg(X_t%2Ct)dW_t

f(X_t%2Ct)dt 被称为 drift, 后一项 g(X_t%2Ct)dW_t 被称为 diffusion, W 是一个标准布朗运动.  SGM 的论文里面为了简单,diffusion 项简化为了 g(t) 且是一个标量(虽然论文也给出了带有参数 X_t 的一般化形式,但是太难了一句话都没看懂).

f 是 g 是什么。

DDPM 与 VP-SDE

f 和 g 的公式;例如在 f(X_t%2Ct)%3D-%5Cfrac%7B1%7D%7B2%7D%5Cbeta_t%20%5Cbf%7Bx%7D, g(t)%3D%5Csqrt%7B%5Cbeta%20(t)%7D 的情况下,这个 SDE 被称作 VP-SDE, 是 DDPM 的一般化的形式.

这里稍微花一点时间,说一下上面两个函数 f 和 g 是怎么得到的。

首先,我们从 DDPM 的马尔可夫链出发:

%5Cbf%7Bx%7D_t%3D%5Csqrt%7B1-%5Cbeta_t%7D%5Cbf%7Bx%7D_%7Bt-1%7D%2B%5Csqrt%7B%5Cbeta_t%7D%5Cepsilon_%7Bt-1%7D%2C%5Cepsilon_%7Bt-1%7D%5Csim%20%5Cmathcal%7BN%7D(0%2CI)%2Ct%3D1%2C...%2CN

上面的马尔可夫链是非连续的,每一步的间隔是1。于是,我们借用最初那个布朗运动的那个小人的思想,把马尔科夫链的步长无限缩小,一直缩小到一个连续的区间 t%5Cin%5B0%2C1%5D 上面去。

%5Cbf%7Bz%7D_%7Bt%7D%3D%5Cbf%7Bz%7D(t%2FN)%2C%20x_i%3Dx(t%2FN)%2C%5Cbar%7B%5Cbeta_t%7D%3D%5Cbeta(t%2FN)t%5Cin%20%5C%7B0%2C%5Cfrac%7B1%7D%7BN%7D%2C...%2C%5Cfrac%7BN-1%7D%7BN%7D%20%5C%7D, 这样我们就有了 z_N%3Dz(1)%2Cx_N%3Dx(1) 之类的“映射”关系。

(原论文这里有个 typo, 把 1/N 写成了 1,看了半天没看懂,ε=( o`ω′)ノ)

%5CDelta%20t%3D1%2FN, 然后我们有以下的公式

x(t%2B%5CDelta%20t)%3D%5Csqrt%7B(1-%5Cbeta(t%2B%5CDelta%20t)%5CDelta%20t%7D%5Ccdot%20x(t)%2B%5Csqrt%7B%5Cbeta(t%2B%5CDelta%20t)%5CDelta%20t%7D%5Ccdot%20z(t)

%5Csqrt%7B(1-%5Cbeta(t%2B%5CDelta%20t)%5CDelta%20t%7D,我们可以利用二项近似(Binomial Approximation)进行改写%5Csqrt%7B(1-%5Cbeta(t%2B%5CDelta%20t)%5CDelta%20t%7D%20%5Capprox%20%5Cfrac%7B1%7D%7B2%7D%5Cbeta(t%2B%5CDelta%20t)%5CDelta%20t%20%3D%20(1-%5Cfrac%7B1%7D%7B2%7D)%5Cbeta(t%2B%5CDelta%20t)%5CDelta%20t.

%5CDelta%20t%5Cto0, 所以,这里有如下的近似关系

x(t%2B%5CDelta%20t)%5Capprox%20x(t)-%5Cfrac%7B1%7D%7B2%7D%5Cbeta%20(t)%5CDelta%20t%20x(t)%2B%5Csqrt%7B%5Cbeta(t)%5CDelta%20t%7Dz(t)

x(t) 移到前面去,于是我们就有了如下的随机微分方程

dx%3D-%5Cfrac%7B1%7D%7B2%7D%5Cbeta(t)xdt%2B%5Csqrt%7B%5Cbeta(t)%7Ddw

上面的这个式子叫做 VP-SDE(Variance Preserving SDE),DDPM 是其离散化的形式,还有一种叫做 VE-SDE,SMLD 是其离散化的形式(在这里略过不说了)。

所以,正儿八经说了大半天 装了大半天B,想说的一点就是——上面的 VP-SDE 就是给数据分布加噪的过程(正向过程)。

网上找的一张很直观的图片,左侧是数据分布,右侧是正态分布,t 是连续时间

Reverse-Time SDE

dX_t%3Df(X_t%2Ct)dt%2Bg(X_t%2Ct)dW_t,有一个对应的逆向过程——

d%5Cbf%7Bx%7D%20%3D%20%5B%5Cbf%7Bf%7D(%5Cbf%7Bx%7D%2C%20t)%20-%20g(t)%5E2%20%20%5Cnabla_%7B%5Cbf%7Bx%7D%7D%20%20%5Clog%20p_t(%5Cbf%7Bx%7D)%5D%20dt%20%2Bg(t)%20d%5Cbar%7B%5Cbf%7Bw%7D%7D

f%2Cg 是我们已知的,%5Cbar%7Bw%7D 是标准布朗运动,如果我们知道 %5Cnabla_%7B%5Cbf%7Bx%7D%7D%20%20%5Clog%20p_t(%5Cbf%7Bx%7D) 这一项的话,那就大功告成了。

Score Matching

%5Cnabla_%7B%5Cbf%7Bx%7D%7D%20%20%5Clog%20p_t(%5Cbf%7Bx%7D) 是什么呢。

p_t(x) 一个概率分布,这个概率分布,我们虽然不知道,但我们也许可以用一个 %5Ctheta 参数化的概率分布 p_%7B%5Ctheta%7D去模拟它,我们通过学习参数 %5Ctheta 使 p_%7B%5Ctheta%7D 去接近 p

p_%7B%5Ctheta%7D,我们可以认为由两部分组成——表示"密度"的函数 %5Ctilde%7Bp%7D_%7B%5Ctheta%7D , 与归一化因子 Z_%7B%5Ctheta%7D

p_%7B%5Ctheta%7D(x)%3D%5Cfrac%7B%5Ctilde%7Bp%7D_%7B%5Ctheta%7D(x)%7D%7BZ_%7B%5Ctheta%7D%7D%3D%5Cfrac%7B%5Ctilde%7Bp%7D_%7B%5Ctheta%7D(x)%7D%7B%5Cint_%7Bx%5Cin%20X%7D%5Ctilde%7Bp%7D_%7B%5Ctheta%7D(x)dx%7D

%5Ctheta,比如说,用极大似然估计法 (Maximum Likelihood Estimation),我们首先要知道 p_%7B%5Ctheta%7D 的具体形式,但是问题就在于 Z_%7B%5Ctheta%7D 这一项是解不出来的。

怎么办呢,这里我们引入 score matching 的概念。我们把 %5Cnabla_%7Bx%7D%5Clog%20p_%7B%5Ctheta%7D(x) 叫做 score function,然后把上面的 p_%7B%5Ctheta%7D(x) 通过 log 拆分成两项 %5Cnabla_%7Bx%7D%20%5Clog%20%5Ctilde%7Bp%7D_%7B%5Ctheta%7D(x)%20-%5Cnabla_%7Bx%7D%20%5Clog%20Z_%5Ctheta . 然后我们发现,我们要的是 x 的梯度,所以后面一项 %5Cnabla_%7Bx%7D%20%5Clog%20Z_%5Ctheta 因为和 x 无关,所以就完全没了(皮卡丘震惊表情)。而且 %5Ctilde%7Bp%7D_%7B%5Ctheta%7D 还不受"概率分布"的约束 (unnormalized),意味着我们甚至可以使用一个神经网络作为  %5Ctilde%7Bp%7D_%7B%5Ctheta%7D 。

%5Cnabla_%7Bx%7D%5Clog%20p_%7B%5Ctheta%7D(x) 去贴近数据分布的 score function %5Cnabla_%7Bx%7D%5Clog%20p_%7Bdata%7D(x). 然后就大功告成了,是吗?问题是,我们也不知道数据分布的 score function。

Z_%7B%5Ctheta%7D .

这个方法有么?还真有!(なんとでもなるはずだ!)

这里直接把公式列出来了:

L%3D%5Cmathbb%7BE%7D_%7Bp_%7Bd%7D%7D%5Btr(%5Cnabla%20_x%5E2%5Clog%20p_%7B%5Ctheta%7D%20(x))%2B%5Cfrac%7B1%7D%7B2%7D%7C%7C%5Cnabla_x%20%5Clog%20p_%7B%5Ctheta%7D(x)%20%7C%7C_2%5E2%5D 

注:我在一维的情况下做了一些模拟——例如,标准正态分布中采样,并假设我们的模型就是标准正态分布,理论上 loss 应该给出0,但是最后算出来却是 -0.5(而且还是个负数)。这里贴出代码,请大佬们指点一下。我也试了一下逻辑分布(Logistic Distribution), 但也没有得到想要的结果。

最后,我们有了去噪的SDE,我们对其离散化,我们就得到了逆向过程。这里我就直接贴论文里的公式了。

%5Ctextbf%7Bx%7D_i%3D%5Ctextbf%7Bx%7D_%7Bi%2B1%7D-f_%7Bi%2B1%7D(x_%7Bi%2B1%7D)%2Bg_%7Bi%2B1%7Dg%5ET_%7Bi%2B1%7Ds_%7B%5Ctheta%5E*%7D(%5Ctextbf%7Bx%7D_%7Bi%2B1%7D%2Ci%2B1)%2Bg_%7Bi%2B1%7D%5Ctextbf%7Bz%7D_%7Bi%2B1%7D%2C%20z%5Csim%20%5Cmathcal%7BN%7D(0%2C%20I)

Predictor-Corrector

x_%7Bi%7D)而因为我们的 score function 是一个随着 t 变动的模型,为了确保 x_%7Bi%7D 来自分布 p_t(x) 论文里面使用了一个 corrector 进行修正。这个 corrector 可以是任何基于 MCMC 的算法。

论文给出的 Predictor-Corrector 采样的伪代码;这里的 corrector 用的是朗之万;这里,外循环和内循环里面,s 的下标一个是 i+1, 一个是 i,所以是两个不同的 score function

一些可以参考的资料

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


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1