当前位置:首页|资讯|AIGC

AIGC: Discrete Contrastive Diffusion 笔记

作者:刹那-Ksana-发布时间:2023-07-27

如果有错误还请各位指出。我们都不是搞研究的,咱们不玩复杂公式 (*^_^*)

Contrastive Predictive Coding

首先,Conditional Discrete Contrastive Diffusion 这个方法,要先从 Contrastive Predictive Coding(1807.03748,1905.09272,以下简称CPC)说起。

p(x%7Cc)x 代表一个高维数据,如文字、图片、声音等,c 代表数据对应的标签)的话,CPC 的目的是最大化 x 与 c 之间相互信息(Mutual Information):I(x%3Bc)%3A%3D%5Csum_%7Bx%2Cc%7D%20p(x%2Cc)%20%5Clog%20%5Cfrac%7Bp(x%7Cc)%7D%7Bp(x)%7D. 即,相当于最大化 %5Cfrac%7Bp(x%7Cc)%7D%7Bp(x)%7D

%5Cmathcal%7BL%7D%3D-%5Cmathbb%7BE%7D_X%5Cleft%5B%20%5Clog%20%5Cfrac%7Bf_k(x_%7Bt%2Bk%7D%2Cc_t)%7D%7B%5Csum_%7Bx_j%20%5Cin%20X%7D%20f_k(x_j%2Cc_t)%7D%20%5Cright%5D, 其中,f_k(x_%7Bt%2Bk%7D%2Cc_t)%5Cpropto%20%5Cfrac%7Bp(x_%7Bt%2Bk%7D%7Cc_t)%7D%7Bp(x_%7Bt%2Bk%7D)%7D.

CPC 的大致原理图

具体的公式和由来并不是那么的重要,网上由很多相关的文章可以参考,链接放在文章末尾。

g_%7Benc%7D, 一个自我回归(Autoregressive)模型 g_%7Bar%7D(比如,GRU), 和一个序列 x 组成。在每一步 t 钟,我们利用 g_%7Bar%7D 的输出 c_t 来预测接下来几步的结果 x_%7Bt%2B1%7D%2Cx_%7Bt%2B2%7D%2C.... 对于图像来说,我们可以把图像整体分割为一个个的小方块,这样,整个图像就可以被看成一个序列了。

x_%7Bt%2B1%7D%2Cx_%7Bt%2B2%7D%2C... 来自原始声音,负样本的配对是别的地方的声音。最后,通过 CPC 这么一套流程下来,模型将会更好的区分正负样本,进而,我们得到了一个更好的编码器。

基本设定

接下来,进入到 Conditional Discrete Contrastive Diffusion(2206.07771,以下简称 CDCD)的世界里。

x 所对应的离散向量(Discrete Representation)z_0

c, 然后复原这个 latent z_0. 最后我们通过 VQ 模型的解码器,将 latent z_0 复原成图像 x

I(z_0%3Bc). 如果我们也采用和 CPC 原论文相同的方法,设定一个比值 f(z_0%2Cc)%3D%5Cfrac%7Bp_%5Ctheta(z_0%7Cc)%7D%7Bp_%5Ctheta(z_0)%7D ,然后去最大化这个比值的话,我们可以导出和 CPC 论文中的形式的 Loss:

%5Cmathcal%7BL%7D_%7BCDCD%7D%3A%3D-%5Cmathbb%7BE%7D%5Cleft%5B%20%5Clog%20%5Cfrac%7Bf(z_0%2Cc)%7D%7Bf(z_0%2Cc)%2B%5Csum_%7Bz%5Ej%20%5Cin%20Z'%7D%20f(z_0%5Ej%2Cc)%7D%20%5Cright%5D%20

Z'%3D%5C%7Bz%5E1%2Cz%5E2%2C...%2Cz%5EN%5C%7D 代表了负样本通过 VQ 编码器生成的 latent.

f(z_0%2Cc), 我们可以直接去优化 p_%7B%5Ctheta%7D(但依旧保持 Contrastive Learning 的世界观)

与扩散模型的关联

之前写的 DDIM 文章里面,详细地介绍过 DDPM 的目标——最大化变分下界(Evidence Lower Bound),所对应的 Loss 为:

%5Cmathcal%7BL%7D_%7Bvb%7D%3D%5Cmathbb%7BE%7D_q%5BD_%7BKL%7D(q(x_T%7Cx_0)%7C%7Cp(x_T)%20%2B%5Csum_%7Bt%3E1%7DD_%7BKL%7D%5Cleft(q(x_%7Bt-1%7D%7Cx_t%2Cx_0)%7C%7Cp_%5Ctheta(x_%7Bt-1%7D%7Cx_t)%5Cright)%20-%5Clog%20p_%7B%5Ctheta%7D(x_0%7Cx_1))%5D

c, 所以上面公式里面的 p_%5Ctheta(x_%7Bt-1%7D%7Cx_t) , p_%5Ctheta(x_%7B0%7D%7Cx_1) 变成了 p_%5Ctheta(x_%7Bt-1%7D%7Cx_t%2C%20c), p_%5Ctheta(x_%7B0%7D%7Cx_1%2C%20c). (在这里,p_%5Ctheta(x_%7Bt-1%7D%7Cx_t%2C%20c) 的具体形式并不重要)

随后,论文里面提出了两种扩散机制—— Step-Wise Parallel Diffusion 和 Sample-Wise Auxiliary Diffusion

两种不同的 Diffusion 机制的示意图,左边为 Step-wise,右边为 Sample-wise。绿色的代表正样本,红色的代表负样本。论文中是以一个视频转音乐的模型为例子,所以这里的条件依赖 c 是视频(一连串的图片)。

%5Cmathcal%7BL%7D_%7BCDCD%7D(论文的附录中有详细的公式推导),但是工作方式有所区别,而上面的示意图已经很直观地表明了——

无论是 Step-wise 还是 Sample-wise,我们都选取 1 个正样本 N 个负样本,

z_t 的同时,"抑制"负样本 z_t%5Ej. 这些负样本来自于上一步的扩散,即公式中的 p_%5Ctheta%20(z_%7Bt-1%7D%5Ej%7Cz_%7Bt%7D%5Ej%2Cc),(这里注意,凡是有上标的都意味着负样本)

对应的 Loss 为:

%5Cmathcal%7BL%7D_%7BCDCD-Step%7D%3D%5Cmathcal%7BL%7D_%7Bvb%7D(z%2Cc)-C%5Csum_%7Bz%5Ej%5Cin%20Z'%7D%5Cmathcal%7BL%7D_%7Bvb%7D(z%5Ej%2Cc)

z_0 的路线, "抑制"到达负样本 z_0%5Ej 的路线,即公式中的 p_%5Ctheta%20(z_%7B0%7D%5Ej%7Cz_%7Bt%7D%2Cc).

对应的 Loss 为:

%5Cmathcal%7BL%7D_%7BCDCD-Sample%7D%3D%5Cmathbb%7BE%7D_%7Bq%7D%5B-%5Clog%20p_%5Ctheta%20(z_0%7Cz_t%2Cc)%5D-C%5Csum_%7Bz%5Ej%20%5Cin%20Z'%7D%5Cmathbb%7BE%7D_%7Bq%7D%5B-%5Clog%20p_%5Ctheta%20(z_0%5Ej%20%7C%20z_t%2Cc)%5D

所以最终的 loss 由变分下界引导出的 loss 和以上的 CDCD loss 两部分组成

%5Cmathcal%7BL%7D%3D%5Cmathcal%7BL%7D_%7Bvb%7D%2B%5Clambda%20%5Cmathcal%7BL%7D_%7BCDCD%20%5C%20Step%2FSample%7D

(注:论文的附录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…


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1