Contrastive Learning 两篇
近期的重点主要在弱监督上,所以了解了很多弱监督、半监督、无监督的技术。Contrasitive Learning(下文简称 CL)算是一种无监督学习技术。
当前深度学习往往依赖于海量数据,当数据标记不完整时,按照不完整的程度可以将监督学习划分为多种类别:
- 完全监督:每个样本均有完整标签。
- 半监督:仅有一个子集的样本具有完整标签,补集无标签。
- 弱监督:所有样本的标签可能不完整、有错。
- 无监督:所有样本无标签。也叫自监督学习。
在无监督学习里有一种似于聚类[1]的常规思路——对比学习,即对比不同样本的异同,从这种区别和相似中总结特征。对比学习的目标是学习一个编码器,编码器对同类样本的编码相似,对不同类样本的编码结果尽可能不同。
宏观目的
设编码器 ,距离函数 表示空间内两个点的距离度量。对于简单二分类的正样本 来说,容易得出它的目标就是
其中的 严格来讲是正/负类样本的中心点。
一个较早的 loss 形式大概是这样
其中, 都是满足势能定义的损失函数。更具体些, 拉近同类样本的距离,而 推远异类样本的距离。一个可行的 为
为了使用这个技术,我们需要知道这两个中心的位置,也就是需要建立正负样本库。无监督学习时我们的确没有方法直接获得这样的样本库。所以无监督学习中的 Encoder 训练往往是这样一个思路:对于一个样本 x,让 x 的增强数据作为 x 自己的正样本,其他的图像(和它们的增强)作为负样本。
在有了正负两个样本库后,就能继续接下来的工作。
InfoNCE
InfoNCE 是一个对比学习常用的 loss。它大致上是这样的形式:
我们在这只简单提一下 InfoNCE,已经有详解该 loss 的文章了,看看就行。当然倒是还有个更简易的认知:
所以总体上它也能当个交叉熵损失来看。
其中的 是温度系数超参。这玩意也是有一定物理意义的,当温度变小时,会迫使模型更加注意相似样本间的差别。常用取值是 。
MoCo: Momentum Contrast for Unsupervised Visual Representation Learning
这是一篇无监督论文,在做通用的图像特征学习,让模型能够将图像编码成更高质量的表征,以在下游的其他任务中使用。
它所采取的思路主要是数据增强加 Contrastive Learning。论文提出了以下两点想法:
- 一个更好的特征,需要大容量的样本库作为学习支撑。对于 CV,图像的特征相对于 NLP 的文本,在特征空间里更有连续性。这种连续性需要大量的样本支撑,才足以体现和学习。官方代码中容量取了 65536,可以说是够大了。
- 模型学习过程中需要保证特征的相对稳定性。
样本库
那么,为了使用 InfoNCE,构建正负样本库是必要的。然而无监督中我们不可能得到明确的正负标签。为了解决这一点,MoCo 采用了数据增强的做法,这也算是无监督中常用的想法。
简单来讲,MoCo 将一张图像经过随机增强(剪切、缩放、旋转、镜像等)后作为该图像自身的正样本,将其他图像作为负样本。即让样本趋近于自己的增强,远离其他样本。数据增强的过程对于 MoCo 的正样本库组成起到了至关重要的作用,所有增强操作中最特殊的一点是「随机剪切」,剪切切分了图像原有的特征,让图像自身成为自己的正样本更可行。不过,使用随机剪切来获取正样本的做法对特征有着潜在的影响:它当然让模型生成更加 general 的特征,但主要物体可能会被排除在图像外,导致模型反过来去关注更 low level 的纹理,甚至是常与物体出现的其他物体特征(例如鸟旁边的树)。
负样本的选取对于 MoCo (或者说所有基于 InfoNCE 的 CL)同样十分关键。如果没有负样本,模型就能摆烂输出 。MoCo 的话,就把所有其他图像的增强作为负样本。
下一个待解决的问题是哪来的「大量样本」。MoCo 提出了一种队列的设计,将近期 batch 的图像入队,维护一个远大于 batch 大小的样本库。
稳定性
随着模型的学习,一张图像的编码前后会发生变化。这种太过迅速的变化会损害到 InfoNCE 的训练过程。为了维持一个更为连续的编码,网络分为了两部分,即 和 两部分,两部分结构一致。
- 输入原图像。
- 输入增强后的图像。
其中 部分的网络参数向着 变化,但是是滞后的。
实验中, 取 的效果要好于 ,算是印证了稳定的必要性。
总之……
这就是 MoCo 所有的核心设计了,像是 loss 的传播截断、多卡随机传播应该算是细节上的东西。MoCo 的设计可以说是简洁易懂,且效果明显。
PiCO: Contrastive Label Disambiguation for Partial Label Learning
看题目就知道这玩意是在跟着 MoCo 走。当然实际上也的确在跟着 MoCo 走。
这篇文章在做的是弱监督的一种 Partial Label 任务。有好多任务都称自己是 Partial Label,这篇的设置为每张图像有一个待选标签集合,集合中有且仅有一个正标签。例如犬种分类可以算作一种实际的场景。
它的整体结构就是 MoCo,然后混了一点 Prototype。
同样,问题出在样本库
为了解决正负样本的选择,这篇文章的想法比较简单:相信网络的收敛能力,以置信度最高的类别作为正标签。(然后因为问题的设置,自然负样本也就有了)
文章说到这样效果就已经非常不错了……行吧,也没办法是吧。不过接下来,该文还在此之上又做了些别的考虑,也就是Prototype。
Prototype
我们说过,对比学习实际上具有聚类效应。聚类会有一个「簇中心」,这里我们同样有类似的概念,也就是「原型」,一个代表这个类别的最完美的特征。听着有点古典哲学本体论的感觉。PiCO 同时为每个类别学习一个原型,同样采用了 Momentum 的想法,维持簇中心的相对稳定。以特征与原型的相似程度替换掉原来的分类器置信度,将两个部分切割开来。
总之……
大体上也就是这样。文末还证明了 Contrasitive Learning 和聚类的等价性,并试图解释 PiCO 的效果。有兴趣的话可以看看。
聚类是一种经典的无/自监督学习。输入算法的数据没有标注,算法需要自行发掘样本间的相似性和差别,将样本聚合为多个类别,最小化簇内样本区别,最大化簇间样本差距。 ↩︎