【导读:这篇来自华盛顿大学的论文深入研究了各种对比自监督模型,系统分析了计算机视觉任务的基准问题;算法,数据集和终端任务如何影响模型性能;以及哪种编码器是最好的通用主干网络。】
作者:Klemen Kotar 编译:McGL
论文: Contrasting Contrastive Self-Supervised Representation Learning Models
https://arxiv.org/abs/2103.14005
Github 代码:
https://github.com/allenai/ViRB
近年来,在计算机视觉领域,我们看到了新的自监督学习方法的爆炸式增长。研究人员已经成功地使用绝大部分是未标注的数据来训练神经网络,这些神经网络在常见的基准测试(如 ImageNet 分类)中表现非常好。
事实证明,理解一幅图像与其他图像的不同之处,就足以产生该图像的抽象表示,可用于语义分类等现实世界的任务。这种方法的早期成功引发了大量描述这一主题的变种的论文发表,这些变种彼此之间都略有改进。
我们现在有一些方法,如 PIRL,CPC,SimCLR,MoCo 和 SwAV,这些方法都产生了显著的成果,它们应用了一种特定类型的自监督学习(self-supervised learning),称为对比学习(contrastive learning),其中编码器(encoder)被训练去识别同一图像的略微增强(augmented)的版本,它们彼此相似,但与其他图像不同。
虽然这种爆炸性的研究速度对于推进一个新想法很有帮助,但它也产生了许多独立的线程方向,很难进行比较或整合。在这篇文章中,我想谈谈自监督计算机视觉研究的现状,以及我最近与 Gabriel Ilharco、 Ludwig Schmidt、 Kiana Eshani 和 Roozbeh Mottaghi 一起发表的旨在解决其中一些问题的论文。
在深入讨论之前,让我们快速回顾一下几个关键术语,以及我将如何在这篇文章中使用它们:
预训练算法: 虽然术语“预训练算法”在深度学习中的定义相当宽泛,但在本文中,我将用它来描述最近流行的作品,如 MoCo 和 SwAV 提出的整个预训练流程。
预训练数据: 这是用于计算机视觉编码器自监督预训练的数据集。大多数工作都是使用 ImageNet。
编码器: 在计算机视觉中,我们经常将网络分为两部分: 一部分是通用的特征提取器,它将图像的原始像素数据编码为有用的抽象表示; 另一部分是终端任务网络,它使用这种抽象表示来完成一些现实世界的任务。前者就是我在这篇文章中所说的编码器。
终端任务网络: 如上所述,终端任务网络是我们模型的一部分,是为了执行一个特定的真实世界的任务,如图像分类,因此它必须为每个任务单独调整。
终端任务: 终端任务是我们的模型可以执行的一些有用的任务。通常这些都是实用的东西,比如从图像中估计房间的深度或者对狗的品种进行分类。终端任务是将我们的抽象模型与人们可以从中受益的现实工作联系起来的一种方式。
终端任务数据: 这是与特定终端任务相关联的训练数据集,用于训练终端任务网络对编码器生成的抽象图像表示做一些有用的事情。
所以总的来说,像 SwAV 这样的预训练算法使用预训练数据集来训练编码器,这是一个通用的工具,用于从图像中提取抽象表示。然后用终端任务数据对终端任务网络进行训练,以使用这些抽象表示来执行一些有用的实际终端任务。
图片来自论文《Contrasting Contrastive Self-Supervised Representation Learning Models》
既然我们已经了解了这些术语,那么让我们深入探讨一下自监督视觉领域快速创新带来的几个关键问题。
1. 苹果、桔子和香蕉
虽然各种提出的训练算法都试图创建一个良好的,通用的图像编码器,他们很少共享兼容的点,我的意思是应用算法到完全相同的模型结构,完全相同的预训练数据,且使用完全相同的终端。
通常情况下,这些完美匹配的点集会被减少到只有一个: 在 ImageNet 数据上训练的 ResNet50 进行 ImageNet 分类的性能。虽然这是一个很好的基准,但如果它是我们唯一关心的基准,那么它可能会变得极其危险。除此之外,不同的论文提供了终端任务、预训练数据集和模型结构的非重叠子集的结果,因此比较论文之间的数字往往就像是在比较苹果和橙子。
2. 我们到底在追求什么?
由于 ImageNet 分类是大多数计算机视觉社区能够同步和达成一致的唯一基准,看来真正的目标并不是生成一个好的通用图像编码器,而是生成一个对 ImageNet 分类有用的编码器,以及类似的终端任务。在某种程度上,任何研究人员产生的一个新的算法都被迫追逐这一基准,因为高分将使算法得到更多的关注,但这无意中导致社区优化了代理目标“ImageNet 性能”,而不是真正的“优秀的视觉编码器”的目标。结合大多数论文使用 ImageNet 作为训练数据的事实,我们有一个强大的反馈回路,产生编码器,这种编码器善于学习数据集(如 ImageNet)的基本分布统计,而不是善于理解图像中的内容。
我们的工作
希望这足以使你相信,在自监督的计算机视觉领域中存在重要的不一致性。现在让我们来谈谈解决这些问题的方法。具体来说,我将讨论我最近发表的论文《Contrasting Contrastive Self-Supervised Representation Learning Models》中的方法和发现。
为了得到一个标准化的参考框架来比较各种自监督算法和预训练数据集,我们必须修正很多实验变量。我们所有的测试都是使用相同的编码器结构(ResNet50)完成的。在训练终端任务网络时,我们也冻结了编码器的权重。
尽管冻结了这些变量,我们仍然使用了数千小时的 GPU 时间进行了700多个实验。我们在4个不同的预训练数据集(ImageNet, Places, Taskonomy, 和 Kinetics400)及这4种的集合上测试了由4种不同的预训练算法(SwAV、 MoCo v1、 MoCo v2和 PIRL)产生的30个编码器。我们对每个编码器的终端任务网络进行了20个终端任务训练集的训练,并报告了这些编码器在终端任务测试集上产生的结果(见下面的终端任务图)。
更多细节,请参阅论文。
现在让我们来看看结果......
ImageNet 是一个好的基准测试吗?
正如上面提到的,在 ImageNet 分类终端任务上评估在 ImageNet 数据集上训练的模型似乎有些死循环。为了衡量一个指标的性能,我们对编码器在 ImageNet 上的性能和其他终端任务进行了相关性分析。这意味着我们计算了对于任何给定的编码器来说,ImageNet 的性能和其他终端任务的性能的相关度有多强。我们发现 ImageNet 根本不是一个很好的指示器。虽然它在预测类似任务(如 CalTech 和 CIFAR-100分类)的性能方面表现相当出色,但在预测不同任务(如深度预测)的性能方面表现确实很差。
根据任务类型(语义或结构)和输出模式(图像级或像素级),我们将任务大致分为四类。下面是我们所有终端任务及其相应分类的图示:
图片来自论文
下面的图表显示了 ImageNet 分类的准确性与其他终端任务性能的比较。它说明了这一点,ImageNet 的性能对于其他图像级别的语义任务是一个很好的指标,但对于所有其他终端任务类别是个弱信号。此外,我们甚至看到一些负相关的结果,这表明优化编码器使其非常擅长 ImageNet 分类会导致它忽略一些对其他任务类型至关重要的信息。
图片来自论文
总之,这表明仅报告模型的 ImageNet 分类性能是非常有局限的。
所有的预训练数据集效果都是一样的吗?
我们想要探究的另一个领域是,预训练的数据对最终模型的质量有多大影响。由于这个领域的绝大多数工作都是在 ImageNet 上预训练编码器,因此在这个维度上没有太多的探索。我们在4个数据集(ImageNet,Places,Taskonomy 和 Kinetics400)上训练 MoCo v 2和 SwAV 编码器。我们对所有数据集进行子集采样,以匹配 ImageNet 的大小,并对4个数据集的组合进行训练。
首先,我们发现在 ImageNet 上训练的编码器在解决语义终端任务方面表现最好,而在 Places 上训练的编码器在解决结构终端任务方面表现最好。这很有意义,因为 ImageNet 包含许多不同的图像,而 Places 包含房间和建筑物的图像。此外,Places 和 ImageNet 有已经校对,标记和组织过的数据,而 Kinetics 是从 YouTub 视频上抓取的一系列的帧,Taskonomy 是 Matterport 3D 扫描的一系列帧。这表明,尽管我们没有显式地使用标签,但使用一个干净、有组织的数据集仍然可能有一些优势。这就使人们开始质疑在互联网上完全无监督的随机数据上训练视觉模型的可行性 —— 这是自监督计算机视觉的伟大承诺之一。虽然最近的一些研究表明,从互联网上收集的大量数据集的训练是成功的,但是这些数据有多整洁和有组织还不清楚。
其次,我们测试了我们的编码器用自监督的方法,是否预训练在一个类似于我们的最终任务数据的大的数据集会产生一个更好的编码器。对于我们的每一个预训练数据集(ImageNet,Kinetics,Places 和 taskenomy) ,我们找到一个相应的终端任务,它使用相似的数据集或相同数据集的子集(CalTech 分类,Kinetics 动作预测,SUN 场景分类和 taskenomy 深度预测)。我们绘制了在4个数据集上所有编码器的终端任务性能图:
图片来自论文
这个结果对于监督式学习来说是显而易见的,但是在我们的工作中,我们也验证了它适用于对比学习。有趣的是,我们发现组合数据集平均来说产生的编码器在所有任务上都相当出色,但在任何任务上都不是最好的。事实上,我们还发现,在 ImageNet 和 Places 上训练的编码器比一般的组合编码器性能更好,所以看起来混合数据集带来的好处要少于坏处。
数据集平衡重要吗?
除了上面提到的预训练数据集之外,我们还使用一个不平衡的 ImageNet 版本来测试预训练的效果,这个版本是通过对数取样的方法得到从每个类别中取出多少图像(例如,我们从少数类别中获得大量样本,从多数类别中获得少量样本)。我们发现,如果我们在 ImageNet 的一个严重不平衡的子集上预训练编码器,我们的最终任务性能并不比在同样大小的 ImageNet 的一个完全平衡的子集上预训练差。我们测试了每个数据集的3个不同的采样,没有非常大的差异,这表明所有的子采样都是一样好的,并且如果我们在我们的子采样中有很多特定类的样本,也没有神奇的类可以给我们一个巨大的性能提升。这一发现的令人兴奋,不足之处是我们只使用小型数据集(有25万个样本)训练了200个epoch,因此需要进一步的探索,在更大的数据集和更长的训练运行时间上验证这一趋势。
不同的预训练算法表现出不同的优势吗?
我们广泛介绍的两种训练算法是 MoCo v2和 SwAV。虽然不是我们工作的主要重点,但我们的分析提出了两种算法的一些有趣的对比性质。
MoCo v2 倾向于在结构性任务上做得更好,而 SwAV 则在图像级任务上做得更好。关于为什么会发生这种情况,我的高层假设是,由于 SwAV 在最后一层使用了聚类方法,它往往会丢失一些空间图像信息。这个理论的一些支持来自于我们对编码器进行的分层 CKA 分析的结果。我们发现,平均而言,经过 MoCo v2训练的编码器在早期和后期层表示之间有更强的一致性,这表明在最终编码中保留了更多的空间信息。下图展示了 MoCo 和 SwAV 编码器在像素和图像级任务中的性能差异:
图片来自论文
如果我们试图为需要空间信息的任务构建一个自定义编码器,这可能是一个有用的信息,因为我们现在有证据表明 MoCo v2是这项工作更好的预训练算法。这里我们看到了将 ImageNet 分类性能作为基准的另一个缺点。由于 SwAV 在这一特定的终端任务上表现优于 MoCo v2,许多人可能会认为它在总体上更好,而我们的研究表明,现实并非如此明确。
自监督编码器是否适用于所有下游任务?
简短的回答是肯定的。对于我们测试的每一个任务,自监督模型都表现得非常好,事实上除了3个任务之外,其他任务都超过了有监督的 ImageNet 基线。监督编码器执行得更好的3个终端任务分别是 ImageNet 分类、 ImageNet v2分类和 Pets 分类(与 ImageNet 非常相似)。由于我们没有为手头的任务微调编码器,这个结果一点也不令人惊讶,因为在 ImageNet 上训练的监督编码器在编码器训练期间被有效地微调到了终端任务。除此之外,自监督方法的性能更好,这给了我们一个强有力的证据,表明它们能够产生更好的通用编码器。
此外,我们发现一些终端任务在使用自监督模型时比其他任务获得了更大的提高,即结构性任务。下面的图表显示,虽然一些自监督编码器在每个任务类别中的表现都优于有监督基准,但几乎所有自监督编码器在结构性任务中的表现都优于有监督基准 —— 即使是那些预训练数据集和预训练算法与终端任务的匹配度很低的编码器:
图片来自论文
那么,我应该使用什么编码器?
在考虑了以上所有结果之后,很明显,当前标准的计算机视觉编码器( ImageNet 上有监督训练的 ResNet50)往往不是最好的通用编码器。我们发现,一些经过自监督学习训练的编码器几乎总是能够更好地解决最终任务,而一个特定的编码器(在 ImageNet 上用 SwAV 进行训练)能够更好地解决75% 以上的终端任务。
下面的图表显示了自监督模型比有监督的 ImageNet 的相对改进的程度。它还显示 ImageNet 和 Places 往往是实现上述最佳结果的两个数据集。
图片来自论文
更进一步的未解答问题
虽然我们在工作中进行了700多个实验,但是我们只描述了自监督计算机视觉整体图景中的一小部分。为了得到我们所做的详细结果,我们需要修正许多变量,这就留给我们许多开放性的问题,比如:
- 模型结构如何影响不同自监督算法的性能?
- 微调整整个编码器是否会显著影响性能?
- 如果编码器训练更多的 epoch,我们观察到的趋势是否会消失,还是变得更明显吗?
这些都是未来工作的良好起点,将进一步帮助我们了解自监督计算机视觉的优缺点。
总结
虽然这篇文章指出了当前自监督视觉领域工作的许多缺陷,但庆祝它的很多成就也很重要。我们的论文发现有证据表明,对比学习方法在产生一个良好的通用编码器方面优于监督式学习,进一步证明这不仅仅是一个简单的 trick,而是一个真正重要的进步。然而,我们也表明,在单一维度上衡量进展(ImageNet 分类)可能会导致我们忽视了大局(比如 MoCo v2在我们测试的近一半终端任务中表现优于 SwAV)。
因此,总的来说,我想从这项工作中提供4个关键要点,可能有助于计算机视觉研究人员和工程师未来的计算机视觉项目:
- 自监督的图像编码器是很好的通用特征提取器,你的下一个项目应该考虑试一下。我推荐在 ImageNet(如果你的项目是结构性的,可以使用 Places) 上用 SwAV 训练 ResNet50 800个 epoch。
- 如果你的领域中有大量数据,可以考虑自己使用它来训练自监督编码器,因为这可能会给你带来更大的性能提升。
- 如果您正在开发一个新的自监督模型,请确保在广泛的不同任务上对其进行评估。可以考虑我们的和项目一起发布的代码库 ViRB(
https://github.com/allenai/ViRB
)。 - 如果你正在开发一个新的数据集,那么数据类的平衡可能不那么重要,但是拥有一些不同的样本很要必要。
原文: https://towardsdatascience.com/contrasting-contrastive-learning-approaches-c3eab8a4728c
“觉得有帮助请分享,点赞,在看;没帮助请点在看并评论大力批判。“