使用元学习进行少样本图像分类

描述

首发:AI公园
作者:Etienne
编译:ronghuaiyang

导读

你并不总是有足够的图像来训练一个深度神经网络。下面是教你如何通过几个样本让模型快速学习的方法。

我们为什么要关心少样本学习?

1980年,Kunihiko Fukushima开发了第一个卷积神经网络。自那以后,由于计算能力的不断增强和机器学习社区的巨大努力,深度学习算法从未停止提高其在与计算机视觉相关的任务上的性能。2015年,Kaiming He和他的微软的团队报告说,他们的模型在从ImageNet分类图像时比人类表现更好。那时,我们可以说计算机在处理数十亿张图像来解决特定任务方面比我们做得更好。

但是,如果你不是谷歌或Facebook,你不可能总是能够构建具有那么多图像的数据集。当你在计算机视觉领域工作时,你有时不得不对图像进行分类,每个标签只有一个或两个样本。在这场比赛中,人类还是要被打败的。只要给婴儿看一张大象的照片,他们从此以后就可以认出大象了。如果你用Resnet50做同样的事情,你可能会对结果感到失望。这种从少量样本中学习的问题叫做少样本学习。

近年来,少样本学习问题在研究界引起了极大的关注,并且已经开发出了许多优雅的解决方案。目前最流行的解决方案是使用元学习,或者用三个词来概括:learning to learn。如果你想知道元学习是什么以及它是如何工作的,请继续阅读。

少样本图像分类任务

首先,我们需要定义N-way K-shot图像分类任务。给定:

一个由N个标签组成的支持集,每个标签对应K个有标签的图像

由Q个查询图像组成的查询集

任务是对查询图像进行分类。当K很小(通常是K<10)时,我们讨论的是少样本图像分类(在K=1的情况下,是单样本图像分类)。


一个少样本分类任务的例子:对于支持集中N=3个类中的每个类,给定K=2个样本,我们希望将查询集中的Q=4只狗标记为Labrador, saint bernard或Pug。即使你从没见过Labrador、saint bernard或Pug,这对你来说也很容易。但要用人工智能解决这个问题,我们需要元学习。

元学习范式

1998年,Thrun & Pratt说,要解决一个任务,一个算法学习“如果性能可以随着经验提升”,同时,给定一族需要解决的问题,一个算法学习”性能随着经验和任务数量提升”。我们将后者称为元学习算法。它不是去学习如何解决一个特定的任务。它可以学会解决许多任务。每学习一项新任务,它就能更好地学习新任务:它学会去学习。

正式的描述一下,如果我们想要解决一个任务T,元学习算法训练一批任务{Tᵢ}。算法通过尝试解决这些任务来得到学习的经验,最终去解决终极任务T。

例如,考虑上图中显示的任务_T_。它包括有标签图像,如Labrador,Saint-Bernard或Pug,使用3x2=6个有标签图像。一个训练任务Tᵢ可能是利用6个有标签图像把图像标记为Boxer, Labradoodle或者Rottweiler。meta-training过程是一连串的这些任务Tᵢ,每一次都是不同品种的狗。我们期望元学习模型“随着经验和任务数量的增加”变得更好。最后,我们在_T_上对模型进行评价。

我们评估了Labradors、Saint-Bernards和Pugs的元学习模型,但我们只在其他品种上训练。

怎么做呢?假设你想要解决这个任务(Labrador,Saint-Bernard 和Pug)。你需要一个元训练数据集,里面有很多不同品种的狗。例如,你可以使用Stanford Dogs数据集,其中包含从ImageNet提取的超过20k只狗。我们将此数据集称为_D_。注意,_D_不需要包含任何Labrador,Saint-Bernard或Pug。

我们从_D_中抽取batch组成episodes。每个episodes 对应于一个N-way K-shot分类任务Tᵢ,(通常我们使用相同的N和K)。模型解决了batch中的所有的episodes后(对查询集中的所有图像打标签),它的参数被更新。这通常是通过对查询集上的分类不准确造成的损失进行反向传播来实现的。

这样,模型跨任务学习,以准确地解决一个新的,看不见的少样本分类任务。标准学习分类算法学习一个映射_图像→标签_,元学习算法学习一个映射:support-set→c(.),其中c是一个映射:query→label。

元学习算法

既然我们知道了算法元训练意味着什么,一个谜仍然存在:元学习模型是如何解决一个少样本的分类任务的?当然,解决方案不止一种。我们聚焦在最流行的方案上。

元学习

度量学习的基本思想是学习数据点(如图像)之间的距离函数。它已经被证明对于解决较少样本的分类任务是非常有用的:度量学习算法不需要对支持集(少量标记图像)进行微调,而是通过与标记图像进行比较来对查询图像进行分类。

查询(右侧)与支持集的每个图像进行比较。它的标签取决于哪些图像最接近。

当然,你不能逐像素地比较图像,所以你要做的是在相关的特征空间中比较图像。为了更清楚一些,让我们详细说明度量学习算法如何解决一个少样本的分类任务(上面定义为一个标签样本的支持集,和一个我们想要分类的图像的查询集):

1、我们从支持和查询集的所有图像中提取嵌入(通常使用卷积神经网络)。现在,我们在少样本分类任务中必须考虑的每一幅图像都可以用一维向量表示。

2、每个查询根据其支持图像集的距离进行分类。距离函数和分类策略都有很多可能的设计选择。一个例子就是欧氏距离和k近邻。

3、在元训练期间,在episode结束时,通过反向传播查询集上分类错误造成的损失(通常是交叉熵损失)来更新CNN的参数。

每年都会发布几种度量学习算法来解决少样本图像分类的两个原因是:

1、它们在经验上很有效;

2、唯一的限制是你的想象力。有许多方法可以提取特征,甚至有更多的方法可以比较这些特征。现在我们将回顾一些现有的解决方案。

匹配网络的算法。特征提取器对于支持集图像和查询图像是不同的。使用余弦相似度将查询的嵌入与支持集中的每幅图像进行比较。然后用softmax对其进行分类。

匹配网络(见上图)是第一个使用元学习的度量学习算法。在这种方法中,我们不以同样的方式提取支持图像和查询图像的特征。来自谷歌DeepMind的Oriol Vinyals和他的团队提出了使用LSTM networks在特征提取期间使所有图像进行交互的想法。称为全上下文嵌入,因为你允许网络找到最合适的嵌入,不仅知道需要嵌入的图像,而且还知道支持集中的所有其他图像。这让他们的模型表现的更好,因为所有的图像都通过了这个简单的CNN,但它也需要更多的时间和更大的GPU。

在最近的研究中,我们没有将查询图像与支持集中的每一张图像进行比较。多伦多大学的研究人员提出了Prototypical Networks。在它们的度量学习算法中,在从图像中提取特征后,我们计算每个类的原型。为此,他们使用类中每个图像嵌入的平均值。(但是你可以想象数以千计的方法来计算这些嵌入。为了反向传播,函数只需是可微的即可)一旦原型被计算出来,查询将使用到原型的欧式距离进行分类(见下图)。

在原型网络中,我们将查询X标记为最接近原型的标签。

尽管简单,原型网络仍然能产生最先进的结果。更复杂的度量学习架构后来被开发出来,比如一个神经网络来表示距离函数(而不是欧氏距离)。这略微提高了精确度,但我相信时至今日,原型的想法是在用于少样本图像分类的度量学习算法领域中最有价值的想法(如果你不同意,请留下愤怒的评论)。

模型无关元学习

我们将以模型无关元学习 (MAML)来结束这次回顾,这是目前最优雅、最有前途的元学习算法之一。它基本上是最纯粹的元学习,通过神经网络有两个层次的反向传播。

该算法的核心思想是训练神经网络的参数,可以适应快速和较少的例子,以新的分类任务。下面我将为你提供一个关于MAML如何在一个episode中进行元训练的可视化例子(例如,在从D中采样得到的Tᵢ上进行few-shot分类任务)。假设你有一个神经网络M参数为

审核编辑 黄昊宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分