consistency model

paper: Consistency Models

看这一篇笔记之前,最好先把 "score-based SDE" 这篇笔记看了。score-based SDE 这篇笔记就是说,现有的生成模型,都可以用 SDE 去描述它们的前向和反向过程。而且发现,反向过程还可以用确定性的 ODE 过程来描述。

这篇 paper 受到反向过程可以用确定性的 ODE 过程来描述这个启发,提出了 consistency model ,具体来说就是训练一个模型,对于任意时间刻的采样 ,都能直接吐出 。这是怎么做到的,为什么以前不能做到?

1 引入

以前的反向过程是用 SDE 描述的,这就导致从高级别噪声的分布 走到下一级别噪声的分布 的过程中,路径是不一样的。(还记得 NCSN 的分层式采样吗?每一个噪声级别都会进行 T 次迭代,终点作为下一个噪声级别的起点)

所以,如果让我们发明的模型对于这过程中的每一个步都去映射到 ,这个工作量未免太大了点,因为随机过程的过程千千万万啊。

但是如果用 ODE 描述,过程就确定下来了,此时再对这轨迹上的每一点做映射,难度就小多了。

2 Method

通过 score-based SDE 这篇笔记,我们知道生成模型可以用 SDE 和 ODE 描述,consistency model 这篇 paper 也是一样的,其中,规定了漂流项 ,扩散项系数 。那么,该模型的前向过程和反向过程我分别用 SDE 和 ODE 写出来:

嗯? 是不是很熟悉?是的,它就是 score。我们可以直接先训练一个 score-based model 来得到它,所以不妨写为以下形式:

我们的目标是,能拥有一个模型 ,使得:

(不用 0 而是 是为了数值稳定性)

那么如何训练这个 呢?有两种方式,从已经学好的 scored model 蒸馏,或者从头开始训练。

2.1 Consistency Distillation (CD)

第一种方法很好理解,就是前面说的,用一个训好的 score-based model 去估计

那么最直接的想法就是,采样 ,然后顺着 ODE 概率流求解出 ,然后直接优化 。但是这样做的缺点是,每一个 ,都要跑一遍 ODE Solver 去得到 后才能算一次 loss,效率太低了。

所以论文的做法,是监督一条轨迹上相邻两个点的输出一致,具体如下:

首先离散化为 N 步,。然后先均匀采样一个 ,正向跑出 ,然后再顺着 ODE 概率流往回跑到 ,然后优化 之间的差距。

loss 函数如下:

这里注意, 参数的指数滑动平均(EMA),这种训练方式比起两边都用 梯度更加稳定,效果显著。

2.2 Consistency Training (CT)

也就是你没有先验模型来估计 score,那么此时你只能从数据中估计 score 。

我们在 score-based model 这篇笔记里推过如下式子:

即可以用 来估计 score。

那么接下来同理去优化 loss 就好了。

3 实验

效果上,diffusion > CD > diffusion distillation > CT

但是推理速度 CD, CT 比传统 diffusion 快得多的多。

  • 算法
    436 引用 • 254 回帖 • 24 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...