Skip to content

DDIM

约 734 个字 预计阅读时间 2 分钟

Abstract

对于 DDIM,首先还是推荐阅读苏剑林的博客.这篇文章可以跟读,文章中有我却没有提的部分就是我认为没什么好补充的了。

清洗

从 DDPM 那篇博客中,我们就已经可以看到\(p(x_t|x_{t-1})\)这一前后连续时间的状态转移已经没有使用到了,尽管我们当时给定了这一状态转移的表达式,并以此推出了\(p(x_t|x_0)\).但是既然没有用到也可以完成后续推导推导的话,我们可以在保留后一个状态转移的前提下,不再定死前面的状态转移函数了,先将其当作待定,看看这一新的自由度会带来什么。

于是在贝叶斯公式中,我们将这一项积掉,随后保持我们走出的每一步都是正态分布的假设,用待定系数法求解。

然后我们就看见,我们的方程书少了另一个,这事因为我们不再限制\(p(x_t|x_{t-1})\)自然就多了一个关于这个函数可以是什么的自由度(当然这个函数不一定还是 DDPM 的形式了,但他还是要满足其他给定的性质,比如保证\(p(x_t|x_0)\)形式如前),我们调节这个新的参数,就是换不同的满足条件的\(p(x_t|x_{t-1})\)解,使其表现出不同的特性。

随后的自然就是几个不同的例子了.首先,一定存在某个\(\sigma_t\)使得\(p(x_t|x_{t-1})\)还是跟 DDPM 一样的取值,我们把 DDPM 中的方差带入,就得到了跟 DDPM 中一样的结果.以及文章中建议的另一个方差,都能得到不错的结果.也可以取一些特殊的值,比如完全去掉方差,使得往回走的每一步都是一个向量而不再是一个分布,这样走的效果很好。

加速

这部分原论文的思想实在是精妙,用类比而言,我们从起点出发走了 1000 步,如果我们每 5 步记一步的话,我们也可以看作是 200 步走到了同一个地方,只要我们的模型预测的足够好,完全理解我们是沿着那条路往外走的,那么这 200 步也足以让我们走回来,这就实现了加速.这一过程是有点像 C++里的 upcasat,我原先当你是个 Shape 类,但我知道你实际上是个 Circle,那我们就把指针改成 Circle*来把你当做一个 circle 对待,对象并没有变,只是我们处理他的方式变了,那我们就修改好适合于 200 步的\(\alpha,\beta\)来反向采样。

最后一段把 DDPM 作为一个阶微分方程的过程,值得一看。

Comments