Contrastive Learning 两篇

近期的重点主要在弱监督上,所以了解了很多弱监督、半监督、无监督的技术。Contrasitive Learning(下文简称 CL)算是一种无监督学习技术。

当前深度学习往往依赖于海量数据,当数据标记不完整时,按照不完整的程度可以将监督学习划分为多种类别:

  • 完全监督:每个样本均有完整标签。
  • 半监督:仅有一个子集的样本具有完整标签,补集无标签。
  • 弱监督:所有样本的标签可能不完整、有错。
  • 无监督:所有样本无标签。也叫自监督学习。

在无监督学习里有一种似于聚类[1]的常规思路——对比学习,即对比不同样本的异同,从这种区别和相似中总结特征。对比学习的目标是学习一个编码器,编码器对同类样本的编码相似,对不同类样本的编码结果尽可能不同。

宏观目的

设编码器 f(x)f(\mathbf x),距离函数 d(x,y)d(\mathbf x,\mathbf y) 表示空间内两个点的距离度量。对于简单二分类的正样本 x\mathbf x 来说,容易得出它的目标就是

d(f(x),f(x+))d(f(x),f(x))d(f(\mathbf x),f(\mathbf x^+)) \ll d(f(\mathbf x),f(\mathbf x^-))

其中的 x+,xx^+, x^- 严格来讲是正/负类样本的中心点。

一个较早的 loss 形式大概是这样

L=[(1y)LS(d())+yLD(d())]\mathcal L=\sum\left[ (1-y) L_S(d(\cdot))+yL_D(d(\cdot)) \right]

其中,LD,LSL_D, L_S 都是满足势能定义的损失函数。更具体些,LSL_S 拉近同类样本的距离,而 LDL_D 推远异类样本的距离。一个可行的 L\mathcal L

L(x,x+,x)=(1y)12d(y,x+)2+y12max{0,md(y,x+)2}\mathcal L(x,x^+,x^-)=(1-y)\frac 1 2 d(y,x^+)^2 + y \frac 1 2 \max\{ 0, m - d(y,x^+)^2 \}

为了使用这个技术,我们需要知道这两个中心的位置,也就是需要建立正负样本库。无监督学习时我们的确没有方法直接获得这样的样本库。所以无监督学习中的 Encoder 训练往往是这样一个思路:对于一个样本 x,让 x 的增强数据作为 x 自己的正样本,其他的图像(和它们的增强)作为负样本。

在有了正负两个样本库后,就能继续接下来的工作。

InfoNCE

InfoNCE 是一个对比学习常用的 loss。它大致上是这样的形式:

L=logexp(xx+τ)exp(xxτ)\mathcal L=-\log\frac{\exp(\frac{x \cdot x^+}{\tau})}{\sum\exp(\frac{x\cdot x^-}{\tau})}

我们在这只简单提一下 InfoNCE,已经有详解该 loss 的文章了,看看就行。当然倒是还有个更简易的认知:

LNCE=xyxlogy^x=xyxilogexp(fi(x))jexp(fj(x))=logexp(fi(x))jexp(fj(x))=logexp(Wix)jexp(Wjx)=logexp(Wix/τ)jexp(Wjx/τ)=LNinfoNCE\begin{aligned} \mathcal L_N^{\text{CE}} &= -\sum_x y_x \log \hat y_x \\ &= -\sum_x y^i_x \log \frac{\exp(f^i(x))}{\sum_j\exp(f^j(x))} \\ &= - \log \frac{\exp(f^i(x))}{\sum_j\exp(f^j(x))} \\ &= - \log \frac{\exp(W^ix)}{\sum_j\exp(W^jx)} \\ &= - \log \frac{\exp(W^ix/\tau)}{\sum_j\exp(W^jx/\tau)} \\ &= \mathcal L_N^{\text{infoNCE}} \end{aligned}

所以总体上它也能当个交叉熵损失来看。

其中的 τ\tau 是温度系数超参。这玩意也是有一定物理意义的,当温度变小时,会迫使模型更加注意相似样本间的差别。常用取值是 0.07,0.20.07,0.2

MoCo: Momentum Contrast for Unsupervised Visual Representation Learning

这是一篇无监督论文,在做通用的图像特征学习,让模型能够将图像编码成更高质量的表征,以在下游的其他任务中使用。

它所采取的思路主要是数据增强加 Contrastive Learning。论文提出了以下两点想法:

  1. 一个更好的特征,需要大容量的样本库作为学习支撑。对于 CV,图像的特征相对于 NLP 的文本,在特征空间里更有连续性。这种连续性需要大量的样本支撑,才足以体现和学习。官方代码中容量取了 65536,可以说是够大了。
  2. 模型学习过程中需要保证特征的相对稳定性。

样本库

那么,为了使用 InfoNCE,构建正负样本库是必要的。然而无监督中我们不可能得到明确的正负标签。为了解决这一点,MoCo 采用了数据增强的做法,这也算是无监督中常用的想法。

简单来讲,MoCo 将一张图像经过随机增强(剪切、缩放、旋转、镜像等)后作为该图像自身的正样本,将其他图像作为负样本。即让样本趋近于自己的增强,远离其他样本。数据增强的过程对于 MoCo 的正样本库组成起到了至关重要的作用,所有增强操作中最特殊的一点是「随机剪切」,剪切切分了图像原有的特征,让图像自身成为自己的正样本更可行。不过,使用随机剪切来获取正样本的做法对特征有着潜在的影响:它当然让模型生成更加 general 的特征,但主要物体可能会被排除在图像外,导致模型反过来去关注更 low level 的纹理,甚至是常与物体出现的其他物体特征(例如鸟旁边的树)。

负样本的选取对于 MoCo (或者说所有基于 InfoNCE 的 CL)同样十分关键。如果没有负样本,模型就能摆烂输出 0\vec 0。MoCo 的话,就把所有其他图像的增强作为负样本。

下一个待解决的问题是哪来的「大量样本」。MoCo 提出了一种队列的设计,将近期 batch 的图像入队,维护一个远大于 batch 大小的样本库。

稳定性

随着模型的学习,一张图像的编码前后会发生变化。这种太过迅速的变化会损害到 InfoNCE 的训练过程。为了维持一个更为连续的编码,网络分为了两部分,即 QQKK 两部分,两部分结构一致。

  • QQ 输入原图像。
  • KK 输入增强后的图像。

其中 KK 部分的网络参数向着 QQ 变化,但是是滞后的。

θK=δθK+(1δ)θQ\theta'_K=\delta\theta_K+(1-\delta)\theta_Q

实验中,δ\delta0.9990.999 的效果要好于 0.990.99,算是印证了稳定的必要性。

总之……

这就是 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 的效果。有兴趣的话可以看看。


  1. 聚类是一种经典的无/自监督学习。输入算法的数据没有标注,算法需要自行发掘样本间的相似性和差别,将样本聚合为多个类别,最小化簇内样本区别,最大化簇间样本差距。 ↩︎


Contrastive Learning 两篇
https://blog.chenc.me/2022/03/07/contrastive-learning-note/
作者
CC
发布于
2022年3月7日
许可协议