点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
作者&编辑:李中梁
自监督学习介绍
对于预训练技术大家一定不陌生,在训练我们的深度学习模型时,我们一般会选择一个预先训练好的模型,并对其进行微调得到想要的模型。如果从随机权重开始,意味着需要花费大量的数据和时间进行训练。
那么,如果在你的领域中没有预训练模型,该怎么办呢?例如,在医学图像领域,很少有预先训练过的模型。最近发表的一篇有趣的论文《Transfusion: Understanding Transfer Learning for Medical Imaging》研究了这个问题,并发现即使使用来自预先训练过的ImageNet模型的几个早期层,也可以提高医学图像模型的训练速度和最终准确性。因此,您应该使用一个通用的预先训练的模型,即使它不属于您正在处理的问题的领域。
然而,正如本文所指出的,将ImageNet预训练模型应用于医学成像时,其改进程度并不大。我们想要模型工作更好,但不需要大量的数据,秘诀就是“自监督学习”。在自监督学习中,标签来自数据,而不需要单独的外部标签(外部标签就是指我们手工标注的标签)。
这个想法有着悠久的历史,早在1989年,Jurgen Schmidhuber就在他1989年(甚至更早)的论文《Making the World Differentiable》中讨论过。到1994年,这个术语还被用来涵盖一种相关的方法,即使用一种模态作为另一种模态的标签,例如论文Learning Classification with Unlabeled Data,该论文使用音频数据作为标签,使用视频数据作为预测任务。例如下面这个例子:
听到“哞哞”声和看到奶牛往往同时出现
论文《Universal Language Model Fine-tuning for Text Classification》中也研究了自监督学习对文本分类任务的效果。预训练模型的任务是预测句子中的下一个单词。我们并不一定对语言模型本身感兴趣,但事实证明,能够完成这一任务的模型必须在训练过程中了解语言的本质,甚至“了解”一点世界。当我们把这个预先训练好的语言模型,fine-tune到另一个任务中,比如情绪分析,结果是我们可以用很少的数据很快得到最新的结果。
在计算机视觉任务中应用无监督学习
在自监督学习中,我们把用于预训练的任务称为“pretext task”,把用于fine-tune的任务称为“downstream task”。尽管自监督学习在当今的自然语言处理中几乎被普遍使用,但考虑到它的工作效果,它在计算机视觉模型中的使用要比我们预期的少得多。也许这是因为ImageNet的预训练已经获得了广泛的成功,所以像医学成像这样的社区中的人们可能不太熟悉自监督学习的必要性。在这篇文章的其余部分,我将努力提供一个简短的自监督学习在计算机视觉中的应用介绍,希望这可能有助于更多的人利用这一非常有用的技术。
在计算机视觉中使用自我监督学习最需要回答的问题是:“你应该使用什么pretext task?”“其实你有很多选择。下面展示了一些相关的工作。
Colorization
着色任务就是输入一张灰度图,让网络预测其彩色图的色彩分布。由于原始图片是彩色的的,所以可以自动构建好输入和输出标签对。
相关工作有:
《Colorful Image Colorization》
《Learning Representations for Automatic Colorization》
《Tracking Emerges by Colorizing Videos》Placing image patches in the right place
对一张图像分块。例如将其分成九宫格,输入中心小块周围的任意一小块,让网络预测其相对中心小块的位置,这是是一个典型的8分类问题,其学习到的特征可以用于下游任务。可以参考以下工作:
《Unsupervised Learning of Visual Representations by Solving Jigsaw Puzzles》
《Unsupervised Visual Representation Learning by Context Prediction》Placing frames in the right order
既然图像中有对某一个patch的位置进行预测,那么视频中就可以对某一帧的位置进行预测:
《Unsupervised Representation Learning by Sorting Sequences》
《Shuffle and Learn: Unsupervised Learning using Temporal Order Verification》Classify corrupted images
在《Self-Supervised Feature Learning by Learning to Spot Artifacts》这篇论文中,pretext task 是对损坏的图像进行分类,注意到绿色的图像没有被破坏,红色的图像被破坏。同时,过于简单的破坏机制可能会导致任务过于简单,并且不会产生有用的特性。上面的文章使用了一种聪明的方法,它破坏了自动编码器的特性,然后试图重建它们,使其成为一个具有挑战性的任务。
选择pretext task
如何选择合适的pretext task呢?您选择的pretext task必须是这样的:如果解决了这些任务,就需要提取这些数据的特征,而这些特征也是解决downstream task所需要的。例如,大家经通常使用autoencoder作为pretext task。这个模型可以将一个输入图像转换成一个大大简化的形式,然后将其转换回尽可能接近原始图像的内容。它有效地利用压缩作为的任务。然而,解决这个问题不仅需要重新生成原始图像的内容,还需要重新生成原始图像中的任何噪声。因此,如果您的downstream task是您想要生成更高质量的图像,那么这将是一个糟糕的pretext task的选择。
你还应该确保借口任务是人类可以做的事情。例如,您可以使用生成视频下几帧的问题作为pretext task。但是如果你试图生成的视频帧太靠后,那么它可能是一个完全不同的场景的一部分,因此没有模型能够自动生成它。
微调 downstream tasks
一旦你用一个pretext task预先训练了您的模型,你就可以继续进行微调了。在这一点上,你应该把这当作一个迁移学习的问题,因此你应该小心不要损失你预先训练的权重。可以借鉴ULMFiT论文中讨论的内容,例如逐步解冻权重、有区别的学习率和单周期训练。如果您正在使用fastai2,那么您可以简单地调用fine_tune方法来完成这些工作。
总的来说,我建议不要花太多时间来创建完美的pretext task模型,而应该尽可能地快速、简单地构建里所能构建的任何东西。然后你就可以知道它是否适合你的下游任务。通常情况下,你并不需要一个特别复杂的pretext task来完成你的下游任务。
还需要注意的是,你可以进行多轮的自我监督前训练和有规律的预训练。例如,你可以使用上述方法中的一种来进行初始的与预训练,然后进行细分以进行额外的预训练,最后再训练你的downstream任务。你也可以在一个或两个阶段同时做多个任务(多任务学习)。先做最简单的事情,然后只有在您确定确实需要它时才增加复杂性。
一致性损失
最后补充讲解一下Consistency loss(一致性损失)。
在自监督训练的基础上,你可以增加一个非常有用的技巧,这在NLP中被称为“一致性损失”,在计算机视觉中被称为“噪声对比估计”。基本思想是这样的:你的pretext task 是一些损坏你数据的事情,比如模糊部分,旋转它,移动补丁,或者(在NLP中)改变单词或者把一个句子翻译成外语然后再翻译回来。在这种情况下,你都希望原始数据和“混乱”数据在pretext task中给出相同的预测,并在中间层有相同的表达。你也希望同样的东西,当以两种不同的方式“搞砸”时(例如,一个图像旋转了两个不同的量),也应该有相同的一致表示。
因此,我们在loss函数中添加了一些内容,以惩罚为相同数据的不同版本(比如旋转了)获取不同的预测的训练。这张图来自谷歌的文章《 Advancing Semi-supervised Learning with Unsupervised Data Augmentation.》,提出了半监督学习和非监督的数据增强。
说这是“有效的”将是一个巨大的轻描淡写…例如,在谷歌的文章中讨论的方法完全和绝对打破了我们之前ULMFiT文本分类的结果。他们使用的标签数据少了1000倍!
Facebook人工智能最近发表了两篇论文,在计算机视觉环境中使用了这一想法:《Self-Supervised Learning of Pretext-Invariant Representations》和《https://www.fast.ai/2020/01/13/self_supervised》。就像NLP中的谷歌论文一样,这些方法超越了以前最先进的方法,并且需要更少的数据。
很可能你可以为你选择的几乎任何的pretext task来添加一致性损失。既然它是如此有效,我强烈建议你尝试一下!
参考文献
- https://www.fast.ai/2020/01/13/self_supervised/
好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~