扩散概率模型,简称为扩散模型。是一个参数化的马尔科夫链,用变分推断方法训练,来产生匹配经过有限时间的数据的样本。这条链的反向过程是学习一个反向扩散过程,这个反向扩散过程也是一个马尔科夫链,在反向过程中逐步给样本增加噪声直到信号被破坏。当扩散由少量高斯噪声组成时,也可以将采样链转换设置为条件高斯,从而实现特别简单的神经网络参数化.
已知或者定义:
扩散模型是一个隐变量模型,模型形式:
,
是隐变量或潜在变量。
扩散过程(前向过程):
βt本来是一个可学习的参数,这里可以设为常数,这样,前向过程本来是给定Xt-1才知道Xt,但是有了βt设为了常数,就和时间t无关了,且Xt服从高斯分布,因此,可以直接从X0得到任意时间步的Xt。设,则
,
。
然后,
损失函数变分低界:
可以将上式重写为:
式中:
到这,上面损失函数公式中的比较都是在高斯分布之间比较的。
因为βt是常数,所以后验q没有参数了,所以Lt那一项为常数,可以忽略。
对于Lt-1这一项,,设
,让它和时间无关,实验中,
或者
结果相似,差不多,所以都行。所以到这,两个过程设定的高斯分布的方差是一样的,只有均值不一样。而前向过程没有参数,均值是前一张图片或第一张图片的均值的某个倍数。只有后向过程均值
不确定。
所以Lt-1可以写为:
所以只需要预测μt就行。将X0用Xt表示,上式写为:
公式10可以简化为:
截图来自视频:DDPM和DDIM公式推导,小白友好。(应龙实验室组会)_哔哩哔哩_bilibili
理一下这个过程:
首先,认为每个图片都可以映射到某个分布的一个点,这里就映射到一个高斯分布,为什么映射到高斯分布?因为高斯分布的叠加是高斯分布,高斯分布有公式。那么就意味着这个分布的每个点都对应着一张图片,那我从这个分布中随机挑一个点,就可以生成为一张图片。但是问题是,我不知道原来图片是怎么映射都这个分布的,那我就不知道怎么从这个分布还原成原来的图片。
所以,我假设一个图片是通过无限的一层一层的加噪声映射到某个分布的,为了让它能映射到高斯分布,所以我加的是高斯噪声。加噪声多了就变成了一个已经看不清原始图片的一个图片,继续加,就认为最后得到的是一个服从标准高斯分布的一个图片,即白噪声,即我就可以认为最后的这个白噪声就是我随机挑的点,因为我随机挑的点就是白噪声,两者等价。上面这个过程就是前向过程,其实没有可学习的参数,只要知道原始的一张图片就可以。接着上面的过程,得到白噪声之后,因为我知道是怎么一步步加的噪声,所以我可以再一步步减去前向过程加的那个噪声,就得到了一张清晰的图片,也就是,从一个噪声里面生成了一张图。
问题是,上面生成图的过程我知道它是如何加噪声的,加的高斯噪声的均值方差是多少,而实际上,给我一个随机点,我不知道它原本对应的那张图片是怎么一步步加噪声变成我拿到的这个随机点的。我可以把每一步加噪声的过程看做一个函数Ft,于是,我需要去学习这每一步的加噪声的函数Ft,学习函数的过程就是神经网络了。假如,我前向过程,也就是加噪声的过程用了T步,也就是加了T次噪声,那我后向过程(也就是从噪声生成图片的过程)神经网络也得学习T步,学习到每一步加的什么噪声,然后我挑的那个随机点一步步减去这个学习到的噪声,最终经过T步相减后,就得到了一张图片。
用公式表示一下这个过程:
原始图片x0
每一个时间步加噪声后的图片概率: