图解 SimCLR 框架,用对比学习得到一个好的视觉预训练模型

作者:amitness
编译:ronghuaiyang

导读: 有点像词向量预训练模型,这个框架可以作为很多视觉相关的任务的预训练模型,可以在少量标注样本的情况下,拿到比较好的结果。

The Illustrated SimCLR Framework

Published March 04, 2020 in illustration

https://amitness.com/2020/03/illustrated-simclr/

近年来,众多的自我监督学习方法被提出用于学习图像表示,每一种方法都比前一种更好。但是,他们的表现仍然低于有监督的方法。当 Chen 等人在他们的研究论文“SimCLR:A Simple Framework for Contrastive Learning of Visual Representations”中提出一个新的框架时,这种情况改变了。SimCLR 论文不仅改进了现有的自监督学习方法,而且在 ImageNet 分类上也超越了监督学习方法。在这篇文章中,我将用图解的方式来解释研究论文中提出的框架的关键思想。

来自儿时的直觉

当我还是个孩子的时候,我记得我们需要在课本上解决这些难题。

孩子们解决这个问题的方法是通过看左边动物的图片,知道它是一只猫,然后寻找右边的猫。

“这样的练习是为了让孩子能够识别一个物体,并将其与其他物体进行对比。我们能用类似的方式教机器吗?”

事实证明,我们可以通过一种叫做对比学习的方法来学习。它试图教会机器区分相似和不同的东西。

对机器进行问题公式化

要为机器而不是孩子来对上述练习进行建模,我们需要做三件事:

1、相似和不同图像的样本

我们需要相似和不同的图像样本对来训练模型。

监督学习的思想学派需要人类手工创造这样的配对。为了实现自动化,我们可以利用自监督学习。但是我们如何表示它呢?

2、了解图像所表示的内容的能力

我们需要某种机制来得到能让机器理解图像的表示。

3、量化两个图像是否相似的能力

我们需要一些机制来计算两个图像的相似性。

SimCLR 框架的方法

本文提出了一个框架“SimCLR”来对上述问题进行自监督建模。它将“对比学习”的概念与一些新颖的想法混合在一起,在没有人类监督的情况下学习视觉的表示。

SimCLR 框架

SimCLR 框架,正如全文所示,非常简单。取一幅图像,对其进行随机变换,得到一对增广图像 x_i 和 x_j。该对中的每个图像都通过编码器以获得图像的表示。然后用一个非线性全连通层来获得图像表示 z,其任务是最大化相同图像的 z_i 和 z_j 两种表征之间的相似性。

手把手的例子

让我们通过一个示例来研究 SimCLR 框架的各个组件。假设我们有一个包含数百万未标记图像的训练库。

  1. 自监督的公式 [数据增强]

    首先,我们从原始图像生成批大小为 N 的 batch。为了简单起见,我们取一批大小为 N = 2 的数据。在论文中,他们使用了 8192 的大 batch。

论文中定义了一个随机变换函数 T,该函数取一幅图像并应用 <span>random (crop + flip + color jitter + grayscale)</span.

对于这个 batch 中的每一幅图像,使用随机变换函数得到一对图像。因此,对于 batch 大小为 2 的情况,我们得到 2N = 4 张总图像。

2、得到图像的表示 [基础编码器]

每一对中的增强过的图像都通过一个编码器来获得图像表示。所使用的编码器是通用的,可与其他架构替换。下面显示的两个编码器有共享的权值,我们得到向量 h_i 和 h_j。



在本文中,作者使用 ResNet-50 架构作为 ConvNet 编码器。输出是一个 2048 维的向量 h。

3、投影头

两个增强过的图像的 h_i 和 h_j 表示经过一系列非线性 Dense -> Relu -> Dense 层应用非线性变换,并将其投影到 z_i 和 z_j 中。本文用 g(.)表示,称为投影头。

  1. 模型调优: [把相似图像的拉的更近一些]

因此,对于 batch 中的每个增强过的图像,我们得到其嵌入向量 z。

从这些嵌入,我们计算损失的步骤如下:

a. 计算余弦相似性

现在,用余弦相似度计算图像的两个增强的图像之间的相似度。对于两个增强的图像 x_i 和 x_j,在其投影表示 z_i 和 z_j 上计算余弦相似度。

其中

  • τ是可调参数。它可以缩放输入,并扩大余弦相似度的范围[- 1,1]。
  • ||z_i|| 是该矢量的模

使用上述公式计算 batch 中每个增强图像之间的两两余弦相似度。如图所示,在理想情况下,增强后的猫的图像之间的相似度会很高,而猫和大象图像之间的相似度会较低。

b. 损失的计算

SimCLR 使用了一种对比损失,称为“NT-Xent 损失”(归一化温度-尺度交叉熵损失)。让我们直观地看看它是如何工作的。

首先,将 batch 的增强对逐个取出。

接下来,我们使用 softmax 函数来得到这两个图像相似的概率。

这个 softmax 计算等价于第二个增强的猫图像与图像对中的第一个猫图像最相似的概率。这里,batch 中所有剩余的图像都被采样为不相似的图像(负样本对)。

然后,通过取上述计算的对数的负数来计算这一对图像的损失。这个公式就是噪声对比估计(NCE)损失:

在图像位置互换的情况下,我们再次计算同一对图像的损失。

最后,我们计算 Batch size N=2 的所有配对的损失并取平均值。

基于这种损失,编码器和投影头表示法会随着时间的推移而改进,所获得的表示法会将相似的图像放在空间中更相近的位置。

下游任务

一旦 SimCLR 模型被训练在对比学习任务上,它就可以用于迁移学习。为此,使用来自编码器的表示,而不是从投影头获得的表示。这些表示可以用于像 ImageNet 分类这样的下游任务。

目标结果

SimCLR 比以前 ImageNet 上的自监督方法更好。下图显示了在 ImageNet 上使用不同自监督方法学习表示的训练线性分类器的 top-1 精度。灰色的十字架是有监督的 ResNet50,SimCLR 以粗体显示。

  • 在 ImageNet ilsvvc -2012 上,实现了 76.5% 的 top-1 准确率,比之前的 SOTA 自监督方法 Contrastive Predictive Coding 提高了 7%,与有监督的 ResNet50 持平。
  • 当训练 1% 的标签时,它达到 85.8% 的 top-5 精度,超过了 AlexNet,但使用带标签的数据少了 100 倍。

SimCLR 的代码

本文作者在 Tensorflow 中对 SimCLR 的正式实现可以在 GitHub 上找到:https://github.com/googl-research/simclr。他们还为使用 Tensorflow Hub 的 ResNet50 架构的 1 倍、2 倍和 3 倍变体提供了预训练模型:https://github.com/googresearch/simclr#。

有各种非官方的 SimCLR PyTorch 实现,它们已经在小型数据集上测试过,比如 CIFAR-10:https://github.com/leftthomas/SimCLR 和 STL-10:https://github.com/Spijkervet/SimCLR

总结

因此,SimCLR 为这一方向的进一步研究和改善计算机视觉的自监督学习状态提供了一个强有力的框架。

英文原文:https://amitness.com/2020/03/illustrated-simclr/


本文地址:https://www.6aiq.com/article/1590013147706
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出