除了Transformer之外,自监督对比学习预训练目前也是CV领域的另一大研究热点。在不使用任何的标签的情况下,使用自监督对比学习预训练出的CNN编码器参数能够在分类、分割、检测等基础任务上都有上佳的表现。这篇文章重点总结了SimCLR, MoCo, BYOL三个经典的CV领域无监督对比学习预训练的方法。

一、自监督对比学习预训练简介

1)自监督学习为什么重要
机器学习通常以受监督的方式完成:我们使用由输入和“正确答案”(输出)组成的数据集来找到从输入数据映射到正确答案的最佳函数。相比之下,在自监督学习中,数据集中没有提供正确答案。相反,我们学习了一个将输入数据映射到自身的函数(例如:MAE中使用没有mask的区域来预测被mask区域的像素值)。
这种方法在从语言到图像和音频的所有方面都被证明是成功的。事实上,最近的NLP领域的语言模型(从word2vecBERTGPT-3),以及CV领域的预训练模型(MAE、PeCo)都是自监督方法的例子。有些学者认为自监督学习可能是类人智能的重要组成部分。
2)对比学习
对比学习是训练分类器区分“相似”和“不同”输入数据的过程。分类器的正例是同一图像的不同版本,而负例是同一数据集中的其他图像。例如,假设有一张狗的图片。在这种情况下,正例可能是该图像的不同数据增强形式(见下图),而反例可能是来自完全不同图像的数据增强。
原始图片的数据增强版本。这些中的任何两个都可以用作正例对
具体来说,对比学习基于以下两个基本原则:
1)不同的原样本在特征空间有不同的表征;
2)同一个原样本的不同augmentation结果 / view在特征空间有相同的表征。
这也是各个对比学习的框架去构建损失函数、训练流程时的基本规则。在以上两个原则的监督下,能够使得编码器得到的特征能够很好的表征图像。
实际上,这种对比学习的方法在NLP的文本表征中已经有过很好的应用。比如我之前总结过的“文本匹配入门必读:预训练模型前的文本匹配模型总结”中的基于表示的方法就是对比学习的早期应用。这些方法试图用对比学习的形式预训练得到每一个句子级别的向量表征。不过,这些方法,在BERT的自监督预训练形式出来之后便没有了进一步的进展(当然,也有像sentence-bert这样在bert上做对比学习的来进一步提升句子的表征能力的)。而目前,CV中的借鉴BERT的自监督预训练也在蓬勃发展,它是否也会像NLP的的发展浪潮一样终结对比学习对于图片的表征呢?我们可以拭目以待?
当然,我们还是先来看看,目前图像自监督对比学习预训练是怎么做的。

二、图像对比学习中预训练典型方法

1)SimCLR(ICML2020)
SimCLR 是一种特别优雅的自监督算法,它设法简化了以前的基本核心方法并提高了它们的性能。同一图像 x 的 两个变换(不同的数据增强)和 v' 通过同一网络(比如resnet)的进行特征提取在特征空间产生两个图像的两个表征向量 y 和 y' ,然后通过 projection(MLP)得到 z 和 z'。对比损失旨在最大化来自同一输入的两个投影 z 和 z' 的相似性,同时最小化与同一小批量中其他图像的投影的相似性。
2)MoCo
相对于 SimCLR,MoCo 将单个网络拆分为一个online网络(顶行),和一个momentum网络(底行)。online网络通过随机梯度下降更新,而momentum网络基于online网络的权重更新,更新形式为(
)。
momentum网络允许 MoCo 有效地使用过去预测的Memory bank作为对比损失的反例。比如,上面的狗图像数据增强插图中,正例将是同一条狗图像的增强图。反例是过去mini batch中使用的完全不同的图像,其投影向量存储在Memory bank中。这种改动使得我们没有必要在一次前向传播中,momentum网络既要处理正例又要处理反例,从而增大每个step的batch size。
Memory bank使用队列的更新形式,会将最新的图像编码后的向量 z', 存储到 Memory bank中,并将最早的存储在Memory bank z' 出列。而之所以要用到momentum这种参数的更新形式,主要是考虑到online网络参数更新很快,如果,momentum与其一样更新的话Memory bank中存储的不同step的 z'就会不一致。所以
这种形式(公式中
一般取接近1的值,比如0.998,这样使得momentum网络的参数在很多个step之后仍然差别不大)的更新能够保持Memory bank中存储的z'的一致性。
3)BYOL
BYOL 基于 MoCo 的动量网络概念,添加了 prediction head 从 z 预测 z'。BYOL 不使用对比损失,而是使用归一化预测 p 和目标 z' 之间的 L2 误差。其实也就相当于用momentum网络的输出来监督 online 网络。
由于此损失函数不需要负示例,因此 BYOL 中没有使用Memory bank。如果真的理解了对比学习的话,此时一定会陷入沉思之中。怎么会不需要负例的参与呢?两个网络不管输入是什么,都输出值为0的向量岂不是就能够正确率100%?但是,显然,BYOL的这种训练方式并没有使得网络陷入到上述的这种trivial solution中。这是为什么呢?网上有些研究者也给出了自己的见解,以下是我认为很有道理的见解:
作者:郑华滨
链接:https://www.zhihu.com/question/402452508/answer/1293518245
来源:知乎
众所周知,contrastive learning框架有两大目标:

  • 不同的原样本有不同的表征,负样本的存在就是为了确保这个目标
  • 同一个原样本的不同augmentation结果 / view有相同的表征
而之前其实已经有挺多工作告诉我们,一个随机初始化的CNN就已经具备一定程度的图像特征抽取能力。更进一步地,如果CNN随机初始化之后,就已经会把不同的样本输入投射到特征空间的不同地方,并且投射得足够分散,那它就已经完成了contrastive learning框架中第一个目标。如果上述猜测成立,那么只要在接下来的训练过程中达成contrastive learning框架第二个目标,并且小心翼翼地维护第一个目标不被破坏,避免网络收敛到trivial solution,那就确实可以抛开负样本。而这个小心翼翼维护的操作,在BYOL里面就体现为”teacher不要太快跟上student的步伐“,论文Table 5说明,跟得太快会破坏contrastive特性,跟得太慢又有损训练效率,为了trade-off,就祭出了mean teacher这个好用的工具,平衡稳定性与效率。
所以我猜测BYOL能work的基石,很可能就是CNN结果在图像数据集上天然存在、不依赖于训练的contrastive feature repersentation能力,BYOL所做的,主要是为CNN补上了transformation invariance。换言之,如果换一个完全不同的网络结构(比如MLP)或者完全不同的数据形态(比如文本),导致该结构并不天然具备针对该数据形态的特征抽取能力,那么BYOL就不work,还得negative sample出来救场。

三、微调结果

上述预训练完之后,我们可以取其预训练好的encoder在分类、分割、检测任务上进行微调。
1)分类:
2)分割、检测与其他任务。可以看到甚至比有监督的预训练更好:
参考资料:
1)https://generallyintelligent.ai/blog/2020-08-24-understanding-self-supervised-contrastive-learning/
2)https://zhuanlan.zhihu.com/p/347998638
3)如何评价BYOL:https://www.zhihu.com/question/402452508/answer/1293518245
阿柴提示
以上若有你需要而查不到或有疑惑的项目,
请联系小编为你解答
Ps:欢迎关注公众号,获取更多计算机视觉、图像分割和自然语言处理领域资料:

以上如果对你有用,请点击点击右下角在看或者分享一下噢
继续阅读
阅读原文