自监督学习和计算机视觉

本文翻译自文章 《Self-supervised learning and computer vision
我把我认为重要的部分加粗显示了

1.自监督学习介绍

只要有可能,你都应该用一个预先训练好的模型来开始你的神经网络训练,并对它进行微调。 你真的不想从随机的权重开始训练,因为这意味着你将从一个完全不知道如何学习的模型开始! 通过预训练,您使用的数据可以比从零开始少1000倍。

那么,如果您的领域中没有预训练的模型,您该怎么办? 例如,在医学影像领域,很少有预先训练过的模型。 最近一篇有趣的论文,Transfusion: Understanding Transfer Learning for Medical Imaging对这个问题进行了研究,发现即使使用预先训练过的 ImageNet 模型中的前几层,都可以提高医学成像模型的训练速度和最终的准确性。 因此,您应该使用通用的预训练模型,即使它不在您的问题范围内。

然而,正如本文指出的那样,ImageNet 预先训练的模型应用于医学成像时的改进量并不大。 我们希望有一些更好的工作,但不需要大量的数据。 其中的秘密就是“自监督学习”。 在这里,我们使用作为输入数据自然组成部分的标签来训练模型,而不需要单独的外部标签。

这个想法有着悠久的历史,早在1989年,于尔根·施密德胡伯就在他的著作中讨论过 Making the World Differentiable 。 到1994年,这一术语也被用来涵盖一种相关的方法,即用一种方法作为另一种方法的标签,例如这篇论文 Making the World Differentiable ,使用音频数据作为标签,视频数据作为预测因子。 本文给出了一个例子: 听到“哞哞”的叫声和看到牛群往往是一起发生的。

自监督学习是 ULMFiT 的秘密,它是一种自然语言处理训练方法,极大地提高了这一重要领域的最新水平。 在 ULMFiT 中,我们首先预训练一个“语言模型”ーー也就是说,一个预测句子中下一个单词的模型。 我们不一定对语言模型本身感兴趣,但是事实证明,能够完成这项任务的模型必须在训练过程中了解语言的本质,甚至了解一点世界。 当我们使用这种预先训练好的语言模型,并对其进行微调以适应另一项任务时,比如情绪分析,结果表明,我们可以很快地用很少的数据得到最先进的结果。 要了解更多关于如何工作的信息,请参考 introduction to ULMFiT 和语言模型预训练介绍。

2. 计算机视觉中的自监督学习

在自我督学习中,我们用于预训练的任务被称为“pretext task”(借口任务)。 然后我们用于微调的任务称为“downstream tasks”(下游任务)。 尽管如今自监督学习在自然语言处理中几乎普遍使用,但是考虑到它的工作效果,它在计算机视觉模型中的应用比我们预期的要少得多。 也许这是因为 ImageNet 的预训练已经取得了广泛的成功,所以像医学成像这样领域的人可能不太熟悉自监督学习需求。 在这篇文章的其余部分,我将努力提供一个简短的介绍在计算机视觉中使用自我监督学习,希望这可以帮助更多的人利用这个非常有用的技术。

在计算机视觉中使用自主学习需要回答的最重要的问题是: “你应该使用什么样的 pretext task? ” 事实证明,你可以从中选择很多。 下面是一些论文的列表,描述它们的论文,以及每个部分论文中的一张图片,展示了这种方法。

2.1 Colorization

给图像上色

(paper 1, paper 2, paper 3)

自监督学习和计算机视觉

2.2 Placing image patches in the right place

将图像碎片放置在正确的位置

(paper 1, paper 2)

自监督学习和计算机视觉

2.3 Placing frames in the right order

按顺序排列帧

(paper 1, paper 2)

自监督学习和计算机视觉

2.4 Inpainting

图像修补

(paper)

自监督学习和计算机视觉

2.5 Classify corrupted images

给损坏图像分类

(paper)

自监督学习和计算机视觉

在此示例中,绿色图像没有损坏,红色图像已损坏。 请注意,一个过于简单的损坏方案可能会导致任务过于简单,并且不会产生有用的特征。 上面的论文使用了一种巧妙的方法,破坏了一个自动编码器的特性,然后试图重建它们,使之成为一个具有挑战性的任务。

2.6 Choosing a pretext task

选择借口任务

您选择的 pretext task 需要了解您下游任务的数据。 例如,从业人员经常用一个称为“autoencoder 自动编码器”的任务作为借口任务。 这是一个模型,可以采取一个输入图像,转换成一个简化形式(使用瓶颈层) ,然后将其转换回尽可能接近原始图像。 它有效地使用压缩(compression )作为借口任务。 然而,解决这个任务不仅需要再生成原始图像内容,而且还要再生成原始图像中的任何噪声。 因此,如果您的下游任务是希望生成高质量图像的任务,那么这将是一个糟糕的选择。

您还应该确保借口任务是人类可以完成的任务。 例如,您可以将生成视频未来帧的问题作为借口。 但是,如果你试图生成的画面太遥远,那么它可能是一个完全不同的场景的一部分,因此没有任何模型可以指望自动生成它。

3. 微调下游任务

一旦您用一个借口任务预训练了您的模型,您就可以进行微调(fine tune)了。 在这一点上,你应该把这当作一个迁移学习(transfer learning)问题,因此你应该小心不要影响你预训练的权重。 使用 ULMFiT 论文中讨论的内容来帮助您,比如逐渐解冻、区分性学习速度和单周期训练。 如果您正在使用 fastai2,那么您可以简单地调用微调方法来完成这一切。

总的来说,我建议不要花太多的时间去创造一个完美的借口模型,而是尽可能快速简单地创造出你能想到的东西。 然后你就可以发现它是否符合你的下游任务。 通常情况下,你并不需要一个特别复杂的借口来完成你的下游任务

4. 一致性损失

在自监督训练的基础上,还可以加入一个非常有用的技巧,即自然语言处理中的“一致性损失”(consistency loss)或计算机视觉中的“噪声对比估计”(noise contrastive estimation)。 其基本思想是这样的: 你的借口任务是一些扰乱你的数据的东西,比如模糊部分,旋转它,移动补丁,或者(在 NLP 中)改变单词或者把一个句子翻译成外语然后再转回来。 在每种情况下,您都希望原始项和混乱项在一个借口任务中给出相同的预测,并在中间表示中创建相同的特性。 同时你也希望,当同一个物品以两种不同的方式“弄乱”(messed up)时(比如,一幅图像以两种不同的数量旋转) ,也应该具有相同的一致性表示。

因此,我们在损失函数中增加了一项对同一数据的不同版本得到不同答案的惩罚。 下面是一个图形化的表示(from Google post)

自监督学习和计算机视觉

说这种方法有效太轻描淡写了… … 例如,上面谷歌帖子中讨论的方法完全打破了我们以前使用 ULMFiT 进行文本分类的最先进的方法。 他们使用的标签数据比我们少1000倍!

Facebook AI 最近发表了两篇 CV 领域的文章就使用了这种思想:Self-Supervised Learning of Pretext-Invariant RepresentationsMomentum Contrast for Unsupervised Visual Representation Learning 就像谷歌的 NLP 论文一样,这些方法打败了以前最先进的方法,并且需要更少的数据。

对于您选择的几乎任何借口任务,您都可以向模型添加一致性损失。 既然它如此有效,我强烈建议你试一试!

5. 延伸阅读

如果您有兴趣了解有关计算机视觉中自监督学习的更多信息,请查看以下最新内容: