AIGC: Discrete Contrastive Diffusion 笔记
如果有错误还请各位指出。我们都不是搞研究的,咱们不玩复杂公式 (*^_^*)
Contrastive Predictive Coding
首先,Conditional Discrete Contrastive Diffusion 这个方法,要先从 Contrastive Predictive Coding(1807.03748,1905.09272,以下简称CPC)说起。
CPC 是一种从高位数据里面抽取代表性的内容(Representations)的无监督学习方法。其要点是,相比于去模拟 (
代表一个高维数据,如文字、图片、声音等,
代表数据对应的标签)的话,CPC 的目的是最大化
与
之间相互信息(Mutual Information):
. 即,相当于最大化
.
CPC 的过程也很简单,挑选一个正样本和 N 个负样本(即所谓的 Contrastive),然后最小化Loss: , 其中,
.

具体的公式和由来并不是那么的重要,网上由很多相关的文章可以参考,链接放在文章末尾。
如上图所示,整个模型由负责生成的编码器 , 一个自我回归(Autoregressive)模型
(比如,GRU), 和一个序列
组成。在每一步
钟,我们利用
的输出
来预测接下来几步的结果
. 对于图像来说,我们可以把图像整体分割为一个个的小方块,这样,整个图像就可以被看成一个序列了。
然后我们构造一些正负配对,比如,正样本的配对里面 来自原始声音,负样本的配对是别的地方的声音。最后,通过 CPC 这么一套流程下来,模型将会更好的区分正负样本,进而,我们得到了一个更好的编码器。
基本设定
接下来,进入到 Conditional Discrete Contrastive Diffusion(2206.07771,以下简称 CDCD)的世界里。
CDCD 的设定是,我们有一个向量量化模型(Vector-Quantized Model,比如,VQ-VAE),这个 VQ 模型将生成 所对应的离散向量(Discrete Representation)
.
扩散过程的目标则是给出依赖条件 , 然后复原这个 latent
. 最后我们通过 VQ 模型的解码器,将 latent
复原成图像
.
因此,在 CPC 的设定下,这里我们的目标是最大化相互信息 . 如果我们也采用和 CPC 原论文相同的方法,设定一个比值
,然后去最大化这个比值的话,我们可以导出和 CPC 论文中的形式的 Loss:
这里的 代表了负样本通过 VQ 编码器生成的 latent.
但是,在扩散模型的设定里面,我们并不需要去最大化比值 , 我们可以直接去优化
(但依旧保持 Contrastive Learning 的世界观)
与扩散模型的关联
之前写的 DDIM 文章里面,详细地介绍过 DDPM 的目标——最大化变分下界(Evidence Lower Bound),所对应的 Loss 为:
当然,因为我们这里还有一个依赖条件 , 所以上面公式里面的
,
变成了
,
. (在这里,
的具体形式并不重要)
随后,论文里面提出了两种扩散机制—— Step-Wise Parallel Diffusion 和 Sample-Wise Auxiliary Diffusion

这两种扩散机制,源头都来自于 loss (论文的附录中有详细的公式推导),但是工作方式有所区别,而上面的示意图已经很直观地表明了——
无论是 Step-wise 还是 Sample-wise,我们都选取 1 个正样本 N 个负样本,
但是对于 Step-wise 来说,如图所示,我们同时进行 N+1 个扩散过程,在每一步 t 中, .我们"增强"正样本 的同时,"抑制"负样本
. 这些负样本来自于上一步的扩散,即公式中的
,(这里注意,凡是有上标的都意味着负样本)
对应的 Loss 为:
而对于 Sample-wise 来说,如图所示,这里只有一个扩散过程,在每一步 t 中, “增强” 到达正样本 的路线, "抑制"到达负样本
的路线,即公式中的
.
对应的 Loss 为:
所以最终的 loss 由变分下界引导出的 loss 和以上的 CDCD loss 两部分组成
(注:论文的附录B4有算法的伪代码,但是个人感觉里面的符号好像有点问题,没有贴出来,想参考的可以去翻看原论文)
Loss 相关的代码可以参考官方 github 源代码 synthesis\modeling\transformers\diffusion_d2m.py 中的 458 行开始(d2m应该是 dance to music 的意思...)
Intra/Inter Sampling
intra: 在...之内;inter: 在...之间
对于负样本的获取,我们可以有两种不同的办法,一种是利用原始数据本身来制造负样本(Intra),一种是利用别的数据来充当负样本(Inter)

这里,原论文给出的示意图已经直观地说明了两种不同的方式的差异,故不在多提。
所以根据 Step 和 Sample 两种扩散方式以及 Intra 和 Inter 两种采样方式,就有4种不同的组合,这些组合的差异和表现可见原论文第4节,在此也不提了。
一些值得参考的文章
CPC 的原理,非常通俗易懂:https://zhuanlan.zhihu.com/p/137076811

现在扩散模型相关的论文都太多公式了,导致很多内容,都特别难懂 orz…