之前想拟合数据分布的时候,基本都是想一步到位,使用一个复杂的函数来拟合,但往往这个函数不可解析计算或者计算太复杂。而一些可解析的分布函数又难以表征比较复杂的数据分布。这篇文章从热力学扩散中得到灵感,提出一种扩散模型(diffusion model),把原始信息逐步扩散到一个简单明了并能解析计算的分布(比如正态分布),然后学习这个扩散(diffusion)过程,最后在进行反传(reverse diffusion),从一个纯噪声逐步恢复出原始信息。
扩散模型巧妙地把学习数据分布的过程转化成学习数据分布的扩散过程,因为每一步的扩散都是很小的扰动,所以很好学习,而且能表征任意形式的数据分布。作者使用马尔科夫链来实现这个扩散过程,每一步的分布都是在上一步的分布上加上一定的噪声得到:

,扩散过程
(1) 每一步的新数据都是由上这次的扩散核作用在上一次数据上产生的 (2)扩散核,也就是扩散过程的规则, (3)q(x0) 表示x0的分布概率,q(xt|xt-1)表示马尔科夫链中的扩散核,这个式子表示一个马尔科夫过程:q(x0...T)是初始状态为q(x0)的马尔科夫链的所有状态的联合分布概率=q(x0)q(x1)...*q(xT),后面的可以使用累乘表示。

反向传播
在扩散率 β 很小的情况下,可以把正向扩散和反向传播的每一步都可以看成是同一种形式(比如高斯扩散)。而这个反向传播中高斯扩散的均值和方差便可以作为参数进行训练。
此模型采用了最大化对数似然(交叉熵)来进行优化训练:

交叉熵
经过一些骚作后得到 L 的下限,最大化 L 其实就是最大化其下限 K:

K的下限


那如何来最大化 K ,这就需要把 q 和 p 的解释式显式化,接下来详细讲解。
扩散过程是一个马尔科夫高斯扩散,每个时刻的分布只和前一个分布和扩散核有关:

q(x|x-1)
设 αt = 1 - βt,则:

x/x-1
将以上两个式子联立,带入,可以得到:

xt
两个独立同分布的高斯分布相加之后有以下公式:

N
最终可以简化并推导可得:

简化结果
q(xt|xt-1) 为扩散的过程,则 q(xt-1|xt) 为理想的逆扩散过程,利用贝叶斯可求解,而且当 β 足够小时候,逆扩散扩展可以看成和扩散过程一样的高斯扩散形式:

逆扩散
标准正态分布的展开为:

标准高斯形式
对比上面两式子可得:

13
根据 3.2 的扩散特性可消掉 x0,得

消掉x0
最终得到 q(xt|xt-1) 的表达形式(其中的噪声则是正向扩散时添加的噪声):

q的最终表达式
目前在 K 的表达式中还需要计算 p(xt|xt-1) 的解析式,设生成过程和扩散过程一样,是使用高斯核的马尔可过程,其高斯核的均值和方差则有多层网络根据该步生成的 xt 的回归通过一些计算间接得出:

网络结构图
首先输入 Xt,由多层网络输出一个多通道 y,然后在通道维度分成两部分,一部分用以计算均值,另一部分计算方差。

均值和方差
经过上面几个步骤,q(xt|xt-1) 、q(xt-1|xt) 和 p(xt-1|xt) 的解析表达式都得到,这样就可以带入3.1 中的 K 中,使用梯度下降法来最大化 K 了。训练完毕后,便可以使用训练好的网络来计算 p(xt-1|xt) 中的均值和方差,便可以一步一步地从 π(xt)中生成样本。

训练目标
文章从热力学扩散中得到灵感提出了一个很新颖的扩散模型来表征数据的分布,把学习数据分布的过程转化成学习数据分布的扩散过程。通过马尔科夫扩散链,逐步把原始分布扩散到一个纯噪声分布,相当于学习到了原始分布到噪声分布的映射。因为每一个马尔科夫过程都是很小的扰动,所以比较容易学习,并且能灵活地表征任意数据的分布。
本文分享自 GiantPandaCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!