参考:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/
扩散模型的总体思路:不断增加噪声,再不断从噪声中去噪,让机器学会从噪声中生成数据。
Chapter 1:定义
我们用马尔科夫链来构造噪声:
q(xn∣xn−1)=N(1−βnxn−1,βnI), n=1,2,...,T
T 是总轮数,β 是噪声强度
这个条件概率可以直接写成随机向量相加的形式,因为 β 和 xn−1 是无关的:
xn=1−βnxn−1+βnωω∼N(0,I)
解释:后面的betan有一个根号的原因是:多维正态分布的第二项是一个正算子的正平方根形式。
那么将 xn−1 带入递推式进去:
xn=1−βn(1−βn−1xn−2+βn−1ω)+βnω=(1−βn)(1−βn−1)xn−2+βnω+(1−βn)βn−1ω=(1−βn)(1−βn−1)xn−2+1−(1−βn)(1−βn−1)ω
最后一个等式的第二项是因为正态分布相加是方差相加。
这样就可以归纳了,因此我们就有一个非常好的结论:
αn=1−βn,αn=i=1∏nαixn=αnx0+1−αnω
而 αn 显然是趋于零的,因此 limn→∞xn=N(0,I) 。
所以我们如果把这个模型训练出来了,可以通过反向扩散从随机正态分布生成有意义的内容?似乎是这样的。
Chapter 2:反向扩散
我们要通过反向扩散来进行去噪,从而生成有意义的信息。
写成条件概率的形式,反向扩散的概率是:q(xn−1∣xn) 。
但是这个东西完全不是能求的东西,好消息是,q(xn−1∣xn,x0) 是可求的,下面来推导一下。
q(xn−1∣xn,x0)=q(xn∣xn−1,x0)q(xn∣x0)q(xn−1∣x0)