CPC (Contrastive Predictive Coding)

原论文链接:https://arxiv.org/pdf/1807.03748.pdf

本文若有讲述错误或不妥之处,欢迎大佬在评论区纠正!

论文总览

CPC总览

论文详细解读

1. 论文的motivation

  1. 为了学习高维数据之间的潜在共享信息(slow features)
  2. 生成式模型计算量太大,且学习到的很多特征都是特定模式下的特征

所以我们不应该直接学习后验概率 p(x|c) (其中 x 是当前的输入,c 是上下文),而是应该将 x 和 c 嵌入到更加紧凑分布的空间(a compact distributed vector representations)中,并最大化保留 x 和 c 之间的互信息MI

I(x;c) = \sum_{x,c}^{}p(x,c)log\frac{p(x|c)}{p(x)}

2. 论文的architecture

来源:原论文

 包含两个主要结构:非线性编码器  g_{enc} 和自回归编码器 g_{ar} 

非线性编码器 g_{enc}

可以是任何CNN/Transformer类型网络,将每个输入都映射到隐空间(即上面提到的compact distributed space)生成特征向量:

z_{t} = g_{enc}(x_{t})

自回归编码器 g_{ar}

可以是任何RNN类型网络,将前 t 个输入映射的特征向量进行信息汇聚(summarize)生成上下文特征向量:

c_{t} = g_{ar}(z_{\leqslant t})

损失函数 loss

  • 互信息转化

        将上述的互信息转化为简单的双线性对数函数:

f_{k}(x_{t+k}, c_{t}) = exp(z_{t+k}^{T}W_{k}c_{t}) \propto \tfrac{p(x_{t+k}|c_{t})}{p(x_{t+k})}

  • InfoNCE loss

        给定数据集 X (包含 1 个正样本和 N-1 个负样本),可以求得损失函数为:

L_{N} = - E_{X}[log\tfrac{f_{k}(x_{t+k}, c_{t})}{\sum_{x_{j}\in X}^{}f_{k}(x_{j}, c_{t})}]

        可以证明最小化 InfoNCE loss就等于最大化 MI

整体过程

  • 首先前 t 个数据经过 g_{enc} 和 g_{ar} 编码生成 \left \{ z_{1}, ..., z_{t} \right \} 和 c_{t} ;
  • 对于往后的输入数据 x_{t+k}, 先进入 g_{enc} 生成 z_{t+k} ,然后将 c_{t} 线性映射成 W_{k}c_{t}(作为对 z_{t+k} 的预测)。注意:这里的 W_{k} 对于每一个 k 都是不同的(即 t 之后的每个时间步都不同)
  • 最后将 z_{t+k} 和 W_{k}c_{t} 带入 InfoNCE 进行互信息计算,然后 BP 更新 g_{enc} 和 g_{ar} 参数

 3. 论文的experiment(图像方面)

来源:原论文

 由于我本身更多混迹在CV领域,所以重点讲解CPC如何在图像上操作(仅仅是一些重要操作).

  1. 对于 g_{enc} ,论文使用 ResNet v2 101 (没有使用 BN);对于 g_{ar} ,论文使用 PixelCNN-style AR model(感兴趣的大佬可以了解一下);
  2. 他们将每个图片分成 7x7 格(当然还有一系列变换,这里不细讲),每格作为一个数据 x_{t}\left \{ t\in \left \{ 1,...,49 \right \} \right \} (从左上到右下按顺序展开),变成一个序列,然后送入CPC进行训练;
  3. 论文中最多预测 5 行(35格),即最少有2行(14格)作为 x_{t} 之前的数据进行提取 \left \{ z_{1}, ..., z_{t} \right \} 和 c_{t} ,不进行互信息计算

 个人总结

CPC作为一个通用架构,泛化性还是很强的,在多种模态下都可以使用,并可以根据任务不同侧重使用 z_{t} 或 c_{t} 作为下游任务的特征输入. 但是CPC依旧是偏 generative 式的模型,它通过 c_{t} 对 z_{t+k} 进行预测生成 W_{k}c_{t},然后才计算互信息,对于计算量要求还是比较大.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值