Diffusion 学习笔记

参考:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

扩散模型的总体思路:不断增加噪声,再不断从噪声中去噪,让机器学会从噪声中生成数据。

Chapter 1:定义

我们用马尔科夫链来构造噪声:

q(xnxn1)=N(1βnxn1,βnI),   n=1,2,...,Tq(x_n | x_{n-1}) = N(\sqrt{1-\beta_n} x_{n-1}, \beta_n I),\ \ \ n=1,2,...,T

T 是总轮数,β\beta 是噪声强度
这个条件概率可以直接写成随机向量相加的形式,因为 β\betaxn1x_{n-1} 是无关的:

xn=1βnxn1+βnωωN(0,I)x_{n}= \sqrt{1-\beta_n} x_{n-1} + \sqrt{\beta_n} \omega \\ \omega \sim N(0,I)

解释:后面的betan有一个根号的原因是:多维正态分布的第二项是一个正算子的正平方根形式。
那么将 xn1x_{n-1} 带入递推式进去:

xn=1βn(1βn1xn2+βn1ω)+βnω=(1βn)(1βn1)xn2+βnω+(1βn)βn1ω=(1βn)(1βn1)xn2+1(1βn)(1βn1)ωx_{n} = \sqrt{1-\beta_n} (\sqrt{1-\beta_{n-1}} x_{n-2} + \sqrt{\beta_{n-1}} \omega) + \sqrt{\beta_{n}} \omega \\ =\sqrt{(1-\beta_n)(1-\beta_{n-1})} x_{n-2} + \sqrt{\beta_{n}} \omega + \sqrt{(1-\beta_{n})\beta_{n-1}} \omega \\ =\sqrt{(1-\beta_n)(1-\beta_{n-1})} x_{n-2} + \sqrt{1-(1-\beta_n)(1-\beta_{n-1})} \omega

最后一个等式的第二项是因为正态分布相加是方差相加。
这样就可以归纳了,因此我们就有一个非常好的结论:

αn=1βn,αn=i=1nαixn=αnx0+1αnω\alpha_n = 1-\beta_n, \overline{\alpha_n} = \prod\limits_{i=1}^{n} \alpha_i \\ x_n = \sqrt{\overline{\alpha_n}} x_0 + \sqrt{1-\overline{\alpha_n}} \omega

αn\overline{\alpha_n} 显然是趋于零的,因此 limnxn=N(0,I)\lim_{n\to \infty} x_n = N(0,I)
所以我们如果把这个模型训练出来了,可以通过反向扩散从随机正态分布生成有意义的内容?似乎是这样的。

Chapter 2:反向扩散

我们要通过反向扩散来进行去噪,从而生成有意义的信息。
写成条件概率的形式,反向扩散的概率是:q(xn1xn)q(x_{n-1}|x_n)
但是这个东西完全不是能求的东西,好消息是,q(xn1xn,x0)q(x_{n-1}|x_n,x_0) 是可求的,下面来推导一下。

q(xn1xn,x0)=q(xnxn1,x0)q(xn1x0)q(xnx0)q(x_{n-1}|x_n,x_0) = q(x_n|x_{n-1},x_0) \frac{q(x_{n-1}|x_0)}{q(x_n|x_0)}