什么是对比学习
自主地从大量数据中学习同类数据的相同特性,并将其编码为高级表征,再根据不同任务进行微调即可。
对比式学习着重于学习同类实例之间的共同特征,区分非同类实例之间的不同之处。
与生成式学习比较,对比式学习不需要关注实例上繁琐的细节,只需要在抽象语义级别的特征空间上学会对数据的区分即可,因此模型以及其优化变得更加简单,且泛化能力更强。
目前,对比学习貌似处于“无明确定义、有指导原则”的状态,它的指导原则是:**通过自动构造相似实例和不相似实例,要求习得一个表示学习模型,通过这个模型,使得相似的实例在投影空间中比较接近,而不相似的实例在投影空间中距离比较远。**而如何构造相似实例,以及不相似实例,如何构造能够遵循上述指导原则的表示学习模型结构,以及如何防止模型坍塌(Model Collapse),这几个点是其中的关键。
SimCLR
一些问题
- 做了两次非线性映射,分别是Encoder 和Projector,为什么要做两次投影变换呢?看上去貌似没有道理,这其实是个经验结果。Moco在做特征表示投影时只有基于ResNet 的Encoder,并未后跟Projector,其实这么做才是符合直觉的做法,而Projector是在后续的SimCLR模型中提出的。实验证明,加上这个Projector对于提升模型效果改进很明显,这从经验角度说明两次投影变换是必须的。
- SimCLR最大的贡献有两个:一个是证明了复合图像增强很重要;另外一个就是这个Projector结构。这两者结合,给对比学习系统带来很大的性能提升,将对比学习性能提升到或者超过了有监督模型,在此之后的对比学习模型,基本都采取了Encoder+Projector的两次映射结构,以及复合图像增强方法。
MoCo
一些问题
- **动量更新(Momentum Update)机制:**为什么负例队列里的图像编码,不用上分枝对应的最新的模型参数 ,而是采用缓慢移动的 来更新呢?实验表明,假设动量更新公式中的m取很小的数值,意味着更多依赖最新参数来更新负例队列的编码,对比学习模型效果会急剧下降。只有当m数值比较大,即下分枝的正例和负例参数缓慢而稳定的变动,才能提供较好的模型效果。这可能是因为缓慢更新的模型参数 ,给队列中来自不同Batch内的实例表征编码相对稳定而统一的改变,增加了表示空间的一致性。
SimCLR与MoCo
都是基于负例的对比学习方法
SimCLR主要是使用batch内的负例
Moco主要是维护负例的队列
类似于simCLR,负例可以由一个batch中的其他数据组成,但此时负例对只能来源于同一个batch的数据。通过queue提供负例,负例的来源范围更广,可以来自于不同batch的数据,并且负例不会产生梯度,计算量可以得到下降,使用的显存量会下降,同时训练模型的难度也会下降。
一句话概括,相比于simCLR,通过queue提供负例,可以减少负例增多导致的计算量增多。