Return to site

智源论坛 | 清华大学教授张长水:基于小样本学习的计算机视觉应用

· 新闻

众所周知,深度学习离不开样本。如果要用深度学习去学习一个目标分类器,就需要特别多的样本。以识别清华的“清”为例,常规操作是要收集关于“清”这个字的不同字体、倾斜和旋转情况,以及不同的噪声、背景、阴影——各种各样的字都要去学习才能得到很好的分类器。而样本多了,问题也就简单了。

我们早在 2013 年便做过类似的工作,彼时深度学习刚在视觉研究领域得到认可不久,又恰逢团队于 2012 年接到了国家自然科学基金委员会一个关于交通标识识别的项目,其初衷是想支持一些团队的无人车研究工作。虽然车在机械层面的自动控制等问题的研究从 2008 年起的两三年内就陆续有了成果,但基金委方面认为还需要打造一个交通标识识别系统,让车辆在行进过程中“知道”道路前方有什么样的标识。

当时用深度学习方法去研发交通标识识别系统的效果不错,单张图像识别率约为 99.5%。如下图右侧所示,我们在汽车的挡风玻璃上安装了摄像头,类似于现在的行车记录仪。但从车的角度来说却完全不能满足要求,因为这意味着一千张图像里就会有四五张分错。在一秒钟 24 张图像,一小时 3600 秒的实际情况面前,这样的误差显然不容忽视。

前面说的是“单张图片”的情况,但若是在视频流过来之时,远处的标识就会随着走近逐渐变得很大很清晰,所以连续的一张一个交通标识会在视频里出现很多次,信息关联后错误率也不会太大,所以在参与“智能车未来挑战赛”时候的效果就非常好。然而由于这部分工作实际上和一些地图应用的功能重合了,所以基金委真正需要的是地图导航应用不能告诉我们的信息,特别是红绿灯。因此我们改道研究针对路上标识的识别,达到了 99.49% 的识别率。

到这一步问题似乎已经解决了,然事实并非如此——标注数据依旧是负担大压力重,彼时没有公司支持的我们,只能在基金委的资金支持下自己想办法获取数据并标注,为此耗费了很长一段时间。

近年来,机器学习领域一直不乏数据标注方面的研究,下图是在 12306 网站购买火车票的体验,其进入页面后用户验证的过程就是在做图像标注,这个方法叫 Crowdsourcing(众包)。而机器学习领域大约在九、十年就有类似的研究,即在众包的形式下如何做机器学习。

这也是一个大家长期以来持续关注的难题,一方面是因为这个过程可能会有噪声;另一方面是获取数据本身就很难。以交通标识的识别为例,需要对每一张交通标识的各种表现进行收集,但像是“连续急转弯标识”这样的图像在数据里出现的次数特别少,数据获取也就相对比较困难——现实确乎给当前的我们提出了诸多难题。

为了应对这些问题,在机器学习方面还有一项较早的研究工作——半监督学习,其大约在 1998 年走入研究人员的视野,关注度也自此不断上涨,并一直持续到 2010 年前后,其间各种各样的半监督学习类工作迭出。

何为半监督学习?做机器学习时,如果有大量监督样本无疑能学得很好,但数据标注又很困难;非监督学习用到了很多未标注数据,我们学到的又不一定正确。而所谓半监督学习就是采此二者之长,运用一部分标注好的样本和大量没有标注的样本,一部分有监督一部无监督。


如下所示,左上角的图是由各个样本点构成的,而该图即是他们之间的关系,所有黑色的点之间是没有标注的。当给定一个蓝色样本和红色样本时,凭借其标签沿着该图进行传播,最后到右下角,就可以给定所有样本标签,这就是半监督学习的一个例子。

运用这个方法时会有这样的情况:构造一个目标函数,并通过不断迭代的方法给出一个解,最后这个解会收敛,收敛结果是上图中的最底下一行。这是我们团队早期在 2009 年左右的一项工作,借此我们了解到半监督学习一定会收敛,同时还分析了它和已有的流形学习之间存在的关系。

半监督学习方法可以用于任何地方,与应用无关,但在视觉领域里半监督学习有一个特别好的应用,即交互式的图像分割。而图像分割工作又实属相当困难,在计算机视觉领域历经 40 余载研究但仍突破不大。


分割之难,在于对同一个图像而言,人与人之间的需求不尽相同,根本不可能给出一个满足所有人要求的统一算法。当然从机器学习的角度来看,这就是聚类问题,但非监督学习永远无法保证其正确性,所以用上监督学习就能做得非常完美。


图像分割的工作可以用下图来进行说明,假设需要将图中雕塑从图像分形里抠出来,看似比较困难,但在半监督情况下可以实现——在中间一排,用鼠标左键划线,告诉计算机这是想要的地方;用右键划蓝线,告诉计算机这是不想要的地方,然后进行分割。从机器学习的角度看这属于半监督学习,从视觉的角度看这是交互,交互是图像分割。

再如右图所示,如果只需要保留前面的南瓜,而不要背景的南瓜,非监督学习就可以把这项工作做得非常完美。同理,非监督学习进行图像分割也适用于困难颇多的医学图像领域。

在此基础上,图像分割在视觉领域中还有很多有趣的应用,例如要把两朵玫瑰进行分割并且改变其中一朵玫瑰的颜色,或是把草地上的动物抹掉进行背景填充,这都属于半监督学习的范畴。

下面一个问题是多示例学习,其研究的问题如下图所示:假如要进行人脸检测,已知左边图像上有人脸,右边那张图像没有人脸,在这种情况下能否做好人脸检测呢?我们通常的做法是画出人脸的框架,并抠出来进行训练。但是这样做存在一定的难度,因为至少不同人脸框架的大小位置是不一样的,“人脸”本身就没有一个明确和清晰的唯一定义。

对此我们有一个思路,就是给机器一个很弱的标签,即整张图像有人脸,但不告知具体位置,同时告知右边图像没有人脸。在这种情况下能不能做机器学习,这是我们关心的问题。人们称之为“多示例学习”,其含义是其中有很多例子,已知有的是人脸,有的不是,同时还有很多图像中一个人脸都没有,能否在这样的条件下做学习?

类似的,假设我们有几个包,每个包里面有一个样本,现已知这里面每一个都含有我们要的样本,但下面还有一个包不是我要的样本,能不能根据已有信息把我要的样本找出来?这有点像做游戏,这样的问题有一个经典解法,即默认当我们把所有样本收集起来时,其在特征空间里会聚集在某些地方,密度最高的那些区域通常是我们要学的概念,在这个假设基础上就可以做学习。这个例子的本质是先建立一个目标函数,然后再对它进行求解。

我们也做过一些多事例学习的工作,但现在很多人谈及深度学习就认为一定要把样本十分精准地标出来,其实不必如此。我们前三年还有一项工作工作,是对叶片上的病虫害进行监测,只要一批数据有病虫害,另一批没有病虫害,就可以据此找到病虫害区域,这就是用好多示例学习思想的一个实际案例,而且有趣的是,这一方法相当于成功跳过了最困难的数据标注环节。

另一个与数据标注有关的问题叫 Active learning,其思路类似于给学生上课时不要按部就班地从头至尾一点点讲解,最好是先讲一个大概,然后询问学生没有听懂的地方,再就没听懂的地方细说。对应到 Active learning 中来看,就是当我们只有少量样本的时候,可以训练一个分类器,那么为了得到更多的标注样本,从而使得这个分类器性能更好,我们应该标注哪些样本?

如上图所示,毫无疑问在整个图像中再给更多左下角和右上角的样本其实意义不大,都能猜到那个地方不是×就是⚪,而且信息很充足。其实最容易出错的地方是在分界线附近,这个方法告诉我们,如果要标样本,在分界线附近的那些地方是最有价值的,只消标少量样本就可以达到很高的学习准确率。该办法经证明可以迅速缩小解空间,继而很快集中到所要的那个解,且在解空间上每标一个样本,就相当于对整个解空间做划分。Active learning 实际上与学习范式有关,其与学习模型和学习方法相结合,是减少标注样本的一个高效方法。

除此之外,还有 Multi-Label Learning。以下图为例,对于其中这张图像我们会有一个标注,这张标注可能是关于城市的,可能是汽车、楼房,也可能是道路、人、树。这些标签之间彼此关联(如下图右侧关系树所示),一张图像会用不同的标签,而我们则应充分利用这些标签之间的关系,从而使我们的预测结果更为准确——这就是“多标签学习”。

另一项值得一提的工作叫 Co-Training,也颇有意义,其来源于 1998 年发布的一篇论文。彼时,一位 CMU 的老师发表提出要将教师网页和学生网页进行分类,这确乎可行,毕竟前者关心的是科研、经费、学生培养、上课等,而后者关心的则是课题、选课,游戏、电影等——二者的关注点不同。

既然任务可行,我们又该如何处理?

首先,我们可以考虑设计一个分类器,这个分类器仅根据内容进行分类,例如课程介绍、基金申请介绍、项目介绍,从中找出关键词做分类,以内容为重;另一个重要的分类指标是 link,即老师和学生关心的网页不同——学生可能会指向一些游戏,老师则可能会指向一些像是基金委、科技部这类的网站,所以也可以根据 link 来分类。但是 link 和内容之间孰重孰轻也不易权衡,因此很难放在一个空间里设计分类器。

因此,就需将其分为两部分:先用内容设计一个分类器 C1,再用 link 设计一个分类器 C2。设计好后标一些样本,并用这些样本来训练第一个分类器,得到结果后用同样的样本去训练第二个分类器,就得到了两个分类器。此时还有很多没有标注的数据,用第一个分类器试一下这些没有标的网页,明确是“学生”还是“老师”,再转而用这些确认的数据训练 C2。同样也可以交换次序,先由 C2 确认然后再训练 C1——如此轮换操作,得以提升整个分类器 C1 和 C2 的性能。这项工作获得了 ICML 2008 的十年最佳论文奖,影响力不容小觑,也因其思路简单,颇受人们喜欢。

此外,机器学习里还有一些其他的方法和工作,涉及到如何在有限样本的情况下提升学习的准确性,例如稀疏学习(Sparse Learning)、Low Rank 以及 Transfer Learning。其中,稀疏学习的思路是考虑到一些稀疏的特性,把一些稀疏优化的技术用到学习里,稀疏学习其实不只是用在机器学习里去减少标注量、提高准确率,还可以用在别的地方。

2010 年前后,我们做了一项名为“图像分离”的工作,即“混叠图像分离”。如下所示,左边一列有三张图像,现将这几张图像混叠成中间第二列的三张图像,混叠的意思就是指两个图像的纯粹相加。当然,混叠时这几张图像之间会有位置上的差异,或者说混叠的系数不一样,也可能会有位置的不同,以及一些平移等变化。

当初我们的设想是希望在只有中间这一列图像的情况下,能够得到左边这一列图像。这个问题在图像里难度非常高,人类能隐隐约约能感觉到一点不同图像的信息,却解决不了分离任务,于是我们就用到了稀疏性——考虑一个物体虽然在整个图像上到处都是,但是其边缘是很稀疏的,这是非常重要的信息,我们通过边缘的稀疏性去计算物体之间的关系,最后右边一列是我们反解出来的图像,和左边一列达成了非常好的对应。当然,混叠图像分离通常无法保证图像质量,但正确分离后能看出图像的大概即可。

这个问题还不止于此,原则上,一张图像混叠的图像要多,否则可提供信息很少。换言之,可以混叠四五张图像,一般混叠图像越多恢复出来的可能性越大。除此之外,我们还可以通过这个方法来做欠定,即用四张图像混叠成两张图像,只有中间两张图像就可以把这四张图像也恢复出来。当然,中间图像越少,恢复出来的质量就会越没那么好,如下所示,底层图像的质量和最上排仍存在一定差距。

在利用了稀疏特性后,会发现如果有类似下图树木花草这样的纹理图像,很难看到如汽车、飞机等物体图像那样的清晰边缘,还能否进行分离?答案是肯定的——我们对稀疏性要求没有那么高,如第一行两张图像混叠成第二行,最后我们把它分离成底部一行,仍然可以分离得很好。

早前所有人做这个工作都是在合成问题上展开,也就是指给定上面两张清晰的图像,进行人为的混合,混合以后再把它分离出来。其原因有二,一是我们知道标准答案,清楚两张原始图像是什么样的;二是我们在混合时严格按照模型操作,比如线性叠加,而且难度已经足够了,所以没有人做真实图像测试。

那么真实图像的操作又当如何?于是我们创造了这样的数据:

假设我们面对一面玻璃,玻璃另一边有一个张贴画,我们在这里拍那个张贴画,所以拍的时候(如上左图),我们既可以看到张贴画的图案,同时也可以看到拍摄人自己的反光,所以这是一个很真实的图像,我们得到两张图像之后可以做分离。中间那一列用经典的方法做就完全做不到,用我们的方法就可以把这两张图像分离开,这是我们第一次在真实图像上尝试。

这个现象其实在另外一个情况下也有可能出现,就是在电影电视中,一个镜头的淡出另外一个镜头的淡入,此二者也会混叠,这样的一些图像也可以用稀疏的方式进行分离,但这里并不是为了提高我们分类的准确性。

以上就是在深度学习之前,机器学习对小样本问题做的事。进入深入学习以后,又出现了一些新办法。起初在 2013-2015 那几年,大家都热血沸腾地去办数据标注公司,结果发现难度很大,因此该领域近年来以另外一种形式出现——叫做 Few-shot Learning。它提出了一个比较有意思的范式,该范式告诉我们,以下图为例,前三行可以收集到大量的类别,比如对各种各样的树木、植物进行分类,但有时我们发现在某些类别我们只能得到有限的三五张图像,比如左下角这三类。而一个非常实际的问题在于,以后见到这三五类图像的时候我们能否识别好。

针对这一问题,近几年有一些典型的工作:第一类是通过样本的生成完成工作,其做法是一些图像经过卷积神经网络后,到了特征空间,同时在特征空间做一些扰动,加一些噪声,生成各种各样的图像,使它的泛化性能更好;另外一类工作是当只有左下角那几张图像时,给每一张图像算一个圆心,即做一个平均,算完圆心以后如果新来一个样本 X,可以计算 X 领域内这三个圆形样本之间的距离,它与谁的距离近就分成哪一类,通过求解对新的 query 进行分类。该方法的好处在于适用于只有一个样本的场景,即所谓的 One-shot Learning。但是其效果也比较受限,因为它利用的信息太少,所以效果没那么好;还有一类方法叫“元学习”,其思路是将每一个分类项目当成不同的任务,同时研究这些分类任务之间的共同点,并希望通过这些学到的共同点在以后遇见新问题时,能够根据少量的样本做调整,从而实现对新的类别进行分类的目的——这便是眼下主流的三类思路,以下为详解:

DualTriNet 实际上是对数据很少的类别做 feature-levelaugmentation,它由 EncoderTriNet 和 DecoderTriNet 组成,如上图所示。Encoder 的输入为 ResNet 关于一张输入图像的各层特征图,输出为该图像对应的语义向量,通过对该语义向量进行增广之后(增广的手段包括对语义向量加随机高斯噪声等),便形成了新的语义向量,该语义向量被认为是属于同类的其他图像的语义向量。通过 Decoder 网络对增广的语义向量进行反解码,形成各层的特征图,最后用原特征图和增广得到的特征图对 ResNet 进行充分训练。由于可以无限增广,所以可以达到增加训练数据量的效果。

但是,在语义空间的构造过程中,这个算法需要用到额外的媒介信息,比如类别层面的 word2vec 或 attributevector 信息,以此来构建任务类别(包括训练类和测试类)之间新的语义关系,从而来指导语义向量的解码过程。

本质上来说,基于数据增广的 few-shotlearning 方法并没有摆脱基于大量数据的学习框架,且增广得到的特征或数据并不能完全拟合真实数据的分布。

Prototypicalnets 的主要思路是为每一类生成一个原型表征,这个表征可以通过对该类仅有的几个样本的 embedding 进行平均而得到,如果每一类只有一个训练样本,那该仅有的单样本的 embedding 自然就是该类的原型表征。

对于测试样本,会计算该测试样本的 embedding 与每类原型表征点的距离,然后用 softmax 形式形成类别预测的概率分布,进而进行训练或预测。

embedding 的生成过程通过一个 CNN 实现,整个网络的训练也借鉴了 matchingnetwork 提出的 episodictraining 策略。

该方法的问题在于:embeddings 之间距离度量的选择会很大程度地影响算法性能,另外,当任务类别数量增加或单类样本增加时,不同类之间的 prototyperepresentation 区分度会有所降低,这种在 embedding 空间的最近邻分类策略将难以应付。

MAML 算法是一种经典的基于元学习思路去解决 few-shotlearning 任务的算法。将每个 few-shotlearning 任务视为一个 task,那么 MAML 的思路是学一个兼顾众多独立 task 的模型参数初始值,以期能在新的 task 的几个样本上只需经过数步的 fine-tune 操作就能使模型在该任务上达到较好的泛化性能(如左上图,三个方向代表三个不同的 few-shotlearningtasks)。

本质上,MAML 是寻找到了一些对 task 化敏感的参数,使得当梯度方向改变时,小的参数变动能够带来较大的损失函数变化,从这一点上增强模型对诸多小样本学习 tasks 的平均泛化能力。

All Posts
×

Almost done…

We just sent you an email. Please click the link in the email to confirm your subscription!

OK