点击上方,选择星标或置顶,每天给你送干货!
阅读大概需要5分钟
跟随小博主,每天进步一丢丢
来自 | 知乎
地址 | https://www.zhihu.com/question/389155523/answer/1175157989
作者 | ICOZ
编辑 | 机器学习算法与自然语言处理公众号
本文仅作学术分享,若侵权,请联系后台删文处理
这个就是典型的few shot classification的问题,经常被包装成玄学的meta learning。
目前市面上效果最好的模型反而是最简单的模型,简单来说就是一个pre-trained feature encoder + 一个distance metric就可以直接比较样本来做分类了。
如果一个类里有多个图怎么办?
1.可以fuse一下同类里不同图片的feature,作为此类的prototype,然后用distance metric。
2.也可以直接取nearest neighbour
3.也可以和这一类里的每个数据都求一个distance,然后平均一下,作为和这一类的distance。
4.当你每个类的数据都很多的时候,你其实就可以考虑训练一个classifier了,你可以固定住feature encoder不动,去学习每个类的prototype。当然,如果每个类数据数量差别太大,可以考虑long tail的问题。
具体来说feature encoder怎么来呢?很简单,把你能有的数据全部用上,训练一个CNN,然后把fc layer扔掉,你就得到一个feature encoder了。
那distance metric呢?可以是 欧氏距离 (prototypical network), cosine distance (matching network),还有EMD距离 (DeepEMD)。基于此种方法的few shot classification miniimagenet 1shot5way的task已经可以达到68%+的正确率了,目前最好的结果。
再补充两句关于feature encoder的渊源。最开始matching network提出了一种训练模式,叫做episode learning,就是每次sample一个classification task,比如5张训练图片,10张测试图片,然后去做分类,cross entropy 作为loss来训练。这样做的目的就是想通过这种方式学习到那些比较general的feature,希望可以在unseen class上也能用到的feature。但是这种方法显然很低效,因为每次训练的图片太少。后来一众fancy的meta learning算法都是基于这种训练方式来学习,编出了各种美丽的故事。
后来有人发现直接把所有training class拿来训个分类器,再把fc layer扔了,用来提取feature,效果巨好,吊打各种meta learning算法。最早期的paper,prototypical network 和matching network就远比SOA的方法好很多。所以现在最好的训练方法一般是一个feature pre-training的环节(训练一个普通分类cnn),再扔掉fc layer,然后用episode training。这个时候episode training的角色就变了,从学习feature变成了调整feature,效率就高很多了。
以后有空可以整理一下市面上这些又简单效果又巨好的few shot 方法,作为baseline模型供大家使用。