这篇文章是博主学习 Few-Shot Learning 过程中所记录的学习笔记
文章目录
- 学习资料
- Few-Shot Learning 背景知识
- Few-Shot Learning的目标
- Meta Learning
- Supervised Learning VS. Few-Shot Learning
- Ways or Shots与Accuracy的关系
- 如何具体解决小样本学习
- Meta Learning常用数据集Datasets
学习资料
-
Shusen Wang: Few-Shot Learning (1/3): 基本概念
Few-Shot Learning 背景知识
正常人分不清穿山甲和犰狳,但是只要给他看5分钟Support Set中的图片,这时问题Query里的图片是什么,那他就能给出判断。
如果人能做到这一点,那么计算机能不能做到呢?
只靠这四个样本是不可能训练出一个深度学习网络的,对这种小样本学习你不能用传统的方法来分类
Support Set指的是一个很小的数据集,比如有两类,每类只有两类。这个集合不能用来训练一个大的网络,它只能提供一些参考信息。
Few-Shot Learning的目标
Few-Shot Learning的目标不是让机器识别训练集里的图片并且泛化到测试集,而是让机器学会学习
Few-Shot Learning学习的目的是让模型学会区分事物的异同,给两张图片不是让模型识别出这两张图片具体是什么,而是让模型知道这两张图片是相同的东西还是不同的东西。
训练完模型后(模型学会了区分事物的异同)可以问模型,下面两张图片是不是同一个东西呢?
模型不知道这两张图片是什么,不会识别出松鼠(因为训练集里没有松鼠),但是模型会判断事物之间的异同,模型知道这两张图片长得很像,所以很可能是相同的动物
模型虽然没有见过穿山甲和哈士奇,但是模型觉得他们长得不像,应该不是同一个动物。
换一个说法
神经网络拿query与support set中的6张图片进行对比,找出最相似的
比如神经网络发现query的图片与水獭Otter最相似,所以认为Query应该是水獭
注意:Support Set里面每个类可能只有1张或者2张图片(带标签),它只能在预测的时候提供一些额外信息。
Meta Learning
举个例子:
小朋友来到水族馆看到一个动物,但是他从来没有见过这个动物,他很想知道这个动物是什么?
虽然小朋友没有见过这个动物,但是他知道怎么样区分动物,他有自主学习的能力
现在,你给小朋友一堆卡片(Support Set) ,每张卡片上有动物的图片和名字,小朋友可能也没有见过卡片上的很多动物,但是他很聪明,他把卡片翻了一遍,就知道自己看到的动物是水獭了!
他作出判断的依据是“水里的动物与卡片上的水獭长得很像”
去动物园前小朋友就有了自主学习的能力,他知道怎么判断动物间的异同
培养小朋友学会自主学习就是Meta Learning,即教小朋友学会区分不同的动物就是Meta Learning
靠一张卡片学会识别动物,叫做One shot learning
Supervised Learning VS. Few-Shot Learning
传统监督学习
模型虽然没见过这张图片,但是训练集中有哈士奇一类,包含上百张图片,模型很容易判断出这就是哈士奇
小样本学习
模型不但没有见过这张图片,而且训练集中还没有这张图片的类别。
Few-Shot learning
- Query samples are never seen before.
- Query samples are from unknown classes
小样本学习比传统监督学习更难,因为训练集Training Set里面没有这个类别。
所以这时我们需要给模型提供更多的信息,即Support Set。给模型看这些小卡片,每张卡片上有图片和名字。这些小卡片就叫作Support Set
通过对比Query和这些小卡片的相似度,模型发现Query与下面这张图片的相似度最高,于是模型就知道Query图片里面是个兔子
小样本学习常用术语
- k-way: the support set has k classes
- n-shot: every class has n samples
上面的例子中 k=6,n=1, 即 six way one shot learning
再比如:
Ways or Shots与Accuracy的关系
3个里面选1个正确的和6个里面选1个正确的,显然前者更简单
显然每个类样本越多,作预测更容易
如何具体解决小样本学习
Idea: Learn a Similarity Function
最基本的想法是学一个函数来判断相似度
s i m ( x , x ′ ) sim(x, x^{'}) sim(x,x′)
Step1:学习一个相似度函数
Learn a similarity function from large-scale training dataset.
具体地,从一个很大的训练集中学习一个相似度函数,它可以判断两张图片的相似度有多高。比如可以拿ImageNet这种大规模数据集来训练
Step2:应用相似度函数来作预测
Apply the similarity function for prediction
- Compare the Query with every sample in the Support set
- Find the sample with the highest similarity score
举个例子:
现在我求出Query与每个Support Set中的卡片的相似度(用Step1训练得到的sim函数),然后找到分数最大的样本作为预测结果
Meta Learning常用数据集Datasets
如果你做元学习Meta Learning的研究,需要用一些常用的数据集来评价模型的表现。介绍两个论文中常用的数据集
数据集Omniglot
Official Website: https://github.com/brendenlake/omniglot/
Tensorflow: https://www.tensorflow.org/datasets/catalog/omniglot
Omniglot数据集大小几个MB而已
Omniglot与MNIST有点像,是个手写字体数据集
MNIST是手写数字识别,有10个类,每个类有6000个样本
Omniglot的特点在于每个类的类别很多,但每个类的样本却很少。
1623个类,而每个类只有20个样本(由20个不同的人手写)
数据集 Mini-ImageNet
100个类,每个类有600个样本,每个样本是84*84的图片