深度学习的本质就是做两件事情:Representation Learning(表示学习) 和 Inductive Bias Learning(归纳偏好学习)。
要说到对比学习,首先要从自监督学习开始讲起。自监督学习属于无监督学习范式的一种,特点是不需要人工标注的类别标签信息,直接利用数据本身作为监督信息,来学习样本数据的特征表达,并用于下游任务。
Generative Methods(生成式方法)这类方法以自编码器为代表,主要关注pixel label的loss。举例来说,在自编码器中对数据样本编码成特征再解码重构,这里认为重构的效果比较好则说明模型学到了比较好的特征表达,而重构的效果通过pixel label的loss来衡量。
Contrastive Methods(对比式方法)这类方法则是通过将数据分别与正例样本和负例样本在特征空间进行对比,来学习样本的特征表示。Contrastive Methods主要的难点在于如何构造正负样本。
同理,相比起Generative Methods需要对像素细节进行重构来学习到样本特征,Contrastive Methods只需要在特征空间上学习到区分性。因此Contrastive Methods不会过分关注像素细节,而能够关注抽象的语义信息,并且相比于像素级别的重构,优化也变得更加简单。
对比学习
对一条样本x1通过数据增强得到x2,那么这就是一对正样本对,和其他样本就是负样本对。
通常的做法就是:一个batch假设大小是M(假设其中一个样本是x1),那么通过数据增强得到2M(x1数据增强得到x2),正样本就是x1和x2,负样本就是x1和batch内其他的样本。
一个例子是:
尽管我们已经见过很多次钞票长什么样子,但我们很少能一模一样的画出钞票;虽然我们画不出栩栩如生的钞票,但我们依旧可以轻易地辨别出钞票。基于此,也就意味着表示学习算法并不一定要关注到样本的每一个细节,只要学到的特征能够使其和其他样本区别开来就行,这就是对比学习和对抗生成网络(GAN)的一个主要不同所在。
表示学习的核心就是要学习一个映射函数 f,把样本 x 编码成其表示 f(x),对比学习的核心就是使得这个 f 满足下面这个式子:
这里的 x+ 就是和 x 类似的样本,x− 就是和 x 不相似的样本,s(⋅,⋅) 这是一个度量样本之间相似程度的函数,一个比较典型的 score 函数就是就是向量内积,即优化下面这一期望:
如果对于一个 x,我们有 1 个正例和 N−1 个负例,那么这个 loss 就可以看做是一个 N 分类问题,实际上就是一个交叉熵,而这个函数在对比学习的文章中被称之为 InfoNCE。事实上,最小化这一 loss 能够最大化 f(x) 和 f(x+) 互信息的下界,让二者的表示更为接近。理解了这个式子其实就理解了整个对比学习的框架,后续研究的核心往往就聚焦于这个式子的两个方面。
MoCo
CPC
对于文本、音频这样的数据,常见的裁剪、旋转等变换操作就无法适用了,因为其数据本身的时序性,设计合理的方法来把这一点考虑进去是至关重要的。Contrastive Predictive Coding(CPC) 这篇文章就提出,可以利用一定窗口内的 xt 和 xt+k 作为 Positive pair,并从输入序列之中随机采样一个输入 xt∗ 作为负例,下图说明了 CPC 的工作过程:
Simsce
ESimsce
ConSERT
SCCL
CLEA
...........