Den Oord A V, Li Y, Vinyals O, et al. Representation Learning with Contrastive Predictive Coding.[J]. arXiv: Learning, 2018.

Henaff O J, Srinivas A, De Fauw J, et al. Data-Efficient Image Recognition with Contrastive Predictive Coding[J]. arXiv: Computer Vision and Pattern Recognition, 2019.

@article{den oord2018representation,

title={Representation Learning with Contrastive Predictive Coding.},

author={Den Oord, Aaron Van and Li, Yazhe and Vinyals, Oriol},

journal={arXiv: Learning},

year={2018}}

@article{henaff2019data-efficient,

title={Data-Efficient Image Recognition with Contrastive Predictive Coding},

author={Henaff, Olivier J and Srinivas, Aravind and De Fauw, Jeffrey and Razavi, Ali and Doersch, Carl and Eslami, S M Ali and Den Oord, Aaron Van},

journal={arXiv: Computer Vision and Pattern Recognition},

year={2019}}

与其说是无监督, 不如用表示学习或者特征提取更为贴切. 感觉监督学习的一个瓶颈就是, 你直接告诉了神经网络它应该到达的终点, 那么它就会找一条最容易的路子去, 所以在训练中, 可以发现训练的精度很快就能达到100%, 而在测试集上的精度就差强人意了. 当然, 这错不在网络, 毕竟它已经尽可能地完成了我们交代给他的任务, 困难在于, 我们自己不知道该如何给这种兼顾泛化性的任务下达准确的定义(平移不变, 旋转不变等等只是泛化的冰山一角).

而表示学习的工作实际上就是比简单的分类损失等更具打磨的空间, 不同的先验知识可以融入其中. 这篇论文的观点就是, encoder提取的特征应当具有可预测性, 也就是说, 只有能够预测别的特征的才是好特征. 当然, 这个是对具有序(时域或者空间)的数据有意义, 对于图片可以认为构造这种数据, 个人认为这才是有趣的地方.

主要内容

从具有序的数据讲起

如上图, 在不同的时间点, 有数据\(x_t\), 其经过第一个encoder \(g_{\mathrm{enc}}\)得到隐变量(特征表示)\(z_t\). 到此打住, 如果是以前, 那可能再来一个decoder, 然后希望解码后数据和原始数据能够吻合. 不过作者认为, 这种方式有点太过勉强了, 其实一个好的特征并不是既低维度(高能量密度)又能够藏住大部分的信息, 一个好的特征应该是抓住最最最主要的信息, 如果是用于分类, 那就是抓住最具有区分度的信息(虽然这个很难下准确的定义).

作者的做法是, 将\(z_i, i\le t\)作为输入, 构造一个回归模型\(g_{\mathrm{ar}}\)(比如用RNN), 得到一个实际上具有之前数据信息的一个特征表示\(c_t\). 作者希望利用\(c_t\)来预测之后的\(x_{t+1},\ldots, x_{t+k},\ldots\), 或者\(z_{t+1},\ldots, z_{t+k},\ldots\), 自然最好的是有一个条件概率模型\(p(x_{t+k}|c_t)\), 然后最大化互信息

\[\tag{1}
I(x;c)=\sum_{x,c} p(x,c)\log \frac{p(x|c)}{p(x)}.
\]

Contrastive Predictive Coding (CPC)

作者并没有打算构建条件概率模型(感觉这样就像VAE一样需要超多假设了), 只是用

\[\tag{3}
f_k(x_{t+k}, c_t)=\exp(z_{t+k}^TW_kc_t),
\]

来衡量二者的关系, 可以把\(W_kc_t\)看成是一个预测\(\hat{z}_{t+k}\).

接下来就要用到对比学习的概念了, 文中说是利用了负样本采样, 但是我用负样本采样的那个推导实在推不出来他的函数, 但是是有一点类似的(感觉只是套用了负采样这个思想?). 即从\(p(x_{t+k}|c_t)\)中采样正样本\(x_{t+k}\), 从一般的分布\(p(x)\)中采样N-1个负样本\(x_j\), 然后最小化下式

\[\tag{4}
\mathcal{L}_N=- \mathbb{E}_X [\log \frac{f_k(x_{t+k},c_t)}{\sum_{x_j \in X} f_k(x_j,c_t)}].
\]

其中\(X=\{x_1,\ldots, x_N\}\)(注, 这里\(X\)是固定的, 已知的).

把\(\frac{f_k(x_i,c_t)}{\sum_{x_j \in X} f_k(x_j,c_t)}\)看成是第\(i\)个采样点是正样本的概率\(\hat{p}_i,i=1, \ldots,N\), 则上面的式子实际上就是一个交叉熵

\[\mathcal{L}_N = -\sum_{i=1}^N p_i \log \hat{p}_i,
\]

故令损失最小的概率为\(\hat{p}_i=p_i:=p(d=i|X, c_t)\), 即正样本在第\(i\)个位置的概率. 又

\[\begin{array}{ll}
p(d=i|X, c_t)
& = \frac{p(x_i|c_t) \prod_{l\not= i} p(x_l)}{\sum_{j=1}^N p(x_j|c_t)\prod_{l\not= j}p(x_j)} \\
&= \frac{\frac{p(x_i|c_t)}{p(x_i)}}{\sum_{j=1}^N\frac{p(x_j|c_t)}{p(x_j)} }.
\end{array}
\]

也就是说, 此时

\[f_k(x_{t+k},c_t) \propto \frac{p(x_{t+k}|c_t)}{p(x_{t+k})}.
\]

图片构建序



如图所示, 一张256x256的图片, 均匀分成7x7张, 每张大小为64x64, 两者最多有50%的重叠部分. 从上到下, 从左往右, 依次可以对其排序, 用前几行的patches出来的\(z\)来预测后面的\(z\).

疑问: 这个负样本的采样空间, 是一个图片所有的patches还是一个batch的所以的patches呢?

Representation Learning with Contrastive Predictive Coding的更多相关文章

  1. 论文解读(SUGRL)《Simple Unsupervised Graph Representation Learning》

    Paper Information Title:Simple Unsupervised Graph Representation LearningAuthors: Yujie Mo.Liang Pen ...

  2. (转)Predictive learning vs. representation learning 预测学习 与 表示学习

    Predictive learning vs. representation learning  预测学习 与 表示学习 When you take a machine learning class, ...

  3. PredNet --- Deep Predictive coding networks for video prediction and unsupervised learning --- 论文笔记

    PredNet --- Deep Predictive coding networks for video prediction and unsupervised learning   ICLR 20 ...

  4. 论文解读(MVGRL)Contrastive Multi-View Representation Learning on Graphs

    Paper Information 论文标题:Contrastive Multi-View Representation Learning on Graphs论文作者:Kaveh Hassani .A ...

  5. 论文解读(GRACE)《Deep Graph Contrastive Representation Learning》

    Paper Information 论文标题:Deep Graph Contrastive Representation Learning论文作者:Yanqiao Zhu, Yichen Xu, Fe ...

  6. 论文解读(S^3-CL)《Structural and Semantic Contrastive Learning for Self-supervised Node Representation Learning》

    论文信息 论文标题:Structural and Semantic Contrastive Learning for Self-supervised Node Representation Learn ...

  7. 论文解读(MERIT)《Multi-Scale Contrastive Siamese Networks for Self-Supervised Graph Representation Learning》

    论文信息 论文标题:Multi-Scale Contrastive Siamese Networks for Self-Supervised Graph Representation Learning ...

  8. 翻译 Improved Word Representation Learning with Sememes

    翻译 Improved Word Representation Learning with Sememes 题目 Improved Word Representation Learning with ...

  9. (zhuan) Notes on Representation Learning

    this blog from: https://opendatascience.com/blog/notes-on-representation-learning-1/   Notes on Repr ...

随机推荐

  1. 日常Java 2021/10/18

    Vecter类实现了一个动态数组,不同于ArrayList的是,Vecter是同步访问的, Vecter主要用在事先不知道数组的大小或可以改变大小的数组 Vecter类支持多种构造方法:Vecter( ...

  2. C++福尔摩斯的约会

    这道题的要求总结如下: 1.DAY 星期 大写字母:A B C D E F G2.HH 时 数字+大写字母 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M ...

  3. YYYY-MM-DD引发的问题

    yyyy 和 YYYY 用YYYY格式化代码 2019-12-31 转 YYYY/MM/dd 格式: 2020/12/31 2020-01-01 转 YYYY/MM/dd 格式: 2020/01/01 ...

  4. react-native安卓运行报错:The number of method references in a .dex file cannot exceed 64K.

    错误原因:App里面方法数超过64K解决方法:在android/app/build.gradle中添加implementation 'com.android.support:multidex:1.0. ...

  5. ssm+ajax实现登陆

    ssm的搭建见上一章 1.数据协议层 public User selectByLoginnameAndPassword(@Param("loginname")String logi ...

  6. 一行配置搞定 Spring Boot项目的 log4j2 核弹漏洞!

    相信昨天,很多小伙伴都因为Log4j2的史诗级漏洞忙翻了吧? 看到群里还有小伙伴说公司里还特别建了800+人的群在处理... 好在很快就有了缓解措施和解决方案.同时,log4j2官方也是速度影响发布了 ...

  7. C/C++ Qt 数据库与Chart历史数据展示

    在前面的博文中具体介绍了QChart组件是如何绘制各种通用的二维图形的,本章内容将继续延申一个新的知识点,通过数据库存储某一段时间节点数据的走向,当用户通过编辑框提交查询记录时,程序自动过滤出该时间节 ...

  8. Python 3 字典(Dictionary)

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: d ...

  9. 记ByteCTF中的Node题

    记ByteCTF中的Node题 我总觉得字节是跟Node过不去了,初赛和决赛都整了个Node题目,当然PHP.Java都是必不可少的,只是我觉得Node类型的比较少见,所以感觉挺新鲜的. Nothin ...

  10. pipeline 共享库

    目录 一.简介 二.共享库扩展 共享库使用 共享库结构 pipeline模板 一些小问题 三.共享库例子 使用公共变量 使用共享库的src方法 使用共享库的vars方法 四.插件实现pipeline ...