Contrastive Predictive Coding(CPC)
Contrastive Predictive Coding(CPC)是DeepMind在2019年1月份提出的一种新的无监督目标特征学习方法。其中
Contrastive: 它是用对比的方法训练的,也就是说,主模型必须区分正确和错误的数据序列
Predictive: 模型必须在当前环境下预测未来模式
Coding: 模型在一个潜在的空间中执行这种预测,将代码向量转换为其他代码向量(与直接预测高维数据相比)
该论文作者为了证明CPC训练方法的效果,分别在Audio,Vision, Natural language, Reinforcement Learning几个任务上,使用CPC方法提取特征,然后加上linear classifer进行分类等性能评估,在一些公开数据集上,CPC方法的性能优于其它最新的无监督或者半监督训练方法。
在Vision上的训练流程如下,其中无监督训练过程是一个端到端的训练,损失函数的衡量引用了Noise Contrastive Estimation(NCE)方法,(loss函数从实现代码来看很简单,但是其中的数学原理很奇妙)。而《Data-Efficient Image Recognition with Contrastive Predictive Coding》这篇文章是针对CPC用于半监督图像分类任务的进一步深入研究。
image patches——encoder——context network(auto regressive)——prediction (无监督训练)
linear classifier (less label 分类器)
Image Classification with CPC
这篇文章是针对CPC用于图像分类的修订版本,主要体现在两个地方:
1,特征编码网络更深,将原来的ResNet101的第3个 residual block的23个blocks变成了46个,并将 1024-dimensional feature maps and 256dimensional bottleneck layers变成了 2048-dimensional feature maps and 512dimensional bottleneck layers。针对更深的网络训练也更难,因此用到了一些训练策略,如使用层标准化而不是批标准化。image patches 使用了' color dropping',randomly flip patches horizontally, random crop 56*56等。
2,Context network的训练由原来的自上到下单方向训练变成了自上到下和自下到上两个方向训练的两个Context network,加强了有监督信号。
论文做了多组实验证明该无监督方法在图像分类任务上性能表现。包括:与其它半监督方法的对比,有监督方法的对比,CPC训练迭代次数对分类性能影响的对比,以及进行监督分类时候,CPC提取特征权重部分和Fine-tuned的对比。都证明了当具有少量labeled数据时候,使用CPC方法可以更好的学习到目标的表征。
论文最重要的是组织框架图,但是不得不说这篇文章的组织框架图很简洁。如果不细扣论文的文字描述,最整体网络框架很难有一个清晰的认识,尤其是loss函数的处理。在这一点伤,论文和实现代码的结合可以帮助我们更快的理解作者的思路。下面有两个关于CPC图像分类的代码地址,一个是基于mnist数据的keras实现(更针对序列数据),一个是fashion mnist数据集的tensorfllow实现(针对实际图像分类数据流更清楚)。
https://github.com/davidtellez/contrastive-predictive-coding
https://github.com/flrngel/cpc-tensorflow