Few-Shot Learning 问题概述
小样本学习:通过很少的样本做分类或者回归
正常人都能根据两个样本学习到正确的分类,计算机能不能学习得到?
Support Set : 非常小的数据集,不足以支撑训练一个神经网络模型,只能提供一些参考信息;
Few-shot learning 的训练目标不是让机器学习训练集里的图片然后泛化到测试集, 目标是让机器学会学习,能够区分事物的异同
-
模型并不知道这张图片里的是松鼠,但是模型可以知道这两张图片很像
Support Set 和 训练集的区别:
-
训练集规模很大,每一类下面都有很多图片,由于训练集足够大可以训练一个深度神经网络;
-
Support Set规模很小,每一类下面只有一张或者几张图片,不足以训练一个神经网络,只能在做预测的时候提供额外信息;
-
few-shot learning : 用足够大的训练集来训练一个大模型,训练的目的不是让模型来识别训练集里的大象老虎,而是让模型识别事物的异同,然后让Support Set提供的一点点信息,模型就能识别水獭,尽管模型里面没有水獭的类别;
Few-shot Learning & Meta Learning
-
Few-shot learning is a kind of meta learning;
-
Meta learning : learn to learn
Fei-Fei, Fergus, & Perona. One-shot learning of object categories. lEEE Transactions on PAMl, 2006.
-
Meta Learning 和传统的监督学习不一样:
-
传统监督学习:学习训练数据然后泛化到测试数据;
-
Meta learning的目标 : learn to learn 模型学会学习;
当一个小朋友去动物园,他不认识水獭,但是他有区分动物的能力,给他一堆卡片,里面有一个水獭的照片,小朋友会告诉你这是水獭,这个区分动物的能力就是meta learning
有监督学习和小样本学习
-
用训练集训练模型后给一个测试数据,测试数据不包含在训练集里,但是测试数据的类别包含在训练集里;
-
小样本学习训练集里不包括测试数据的样本,甚至都不包括测试数据的类别;
-
小样本学习比传统监督学习更难,主要原因就在于训练集里没有兔子这个类别;
-
训练集里没有兔子的类别,因此我们需要给模型提供更多信息,这些样本量很小的数据就叫Support Set;
-
通过Query 和 Supoort Set 的相似度比对,模型就知道这张图片是个兔子;
K-Way N-Shot
-
K-Way的意思:Support Set里头有K个类别;
-
n-shot的意思:每个类别有n个样本;
-
6-way, 1-shot
-
一般来说随着类别增加,分类准确率会降低, 随着shot的增加准确率会上升
我们已经知道了什么是Few-shot learning , 接下来思考怎么解决few-shot learning
-
Learning a Similarity Function: 最基本想法就是学一个函数来判断相似度
-
从一个很大的训练集里学习一个相似度函数,他可以判断两张图片的相似度有多高,比如训练一个孪生网络可以作为相似度函数;
-
训练结束之后,用学到的相似度函数来做预测,给一个query数据和support set中逐一对比计算相似度,然后找出相似度最高的作为预测结果;
孪生网络Siamese Network
Learning Pairwise Similarity Scores
Bromley et al. Signature verification using a Siamese time delay neural network. In NIPS. 1994.
Koch, Zemel, & Salakhutdinov. Siamese neural networks for one-shot image recognition. In /CML,2015.
训练数据构建
每次取两个样本, 比较他们的相似度 (有点像对比学习,孪生网络是实现对比学习的方法之一)
-
训练这个神经网络需要一个比较大的分类训练数据集
-
正样本告诉神经网络什么东西是同一类,负样本告诉神经网络事物之间的区别
模型训练
-
用一个卷积神经网络作为特征提取, 输入是一张图片,输出是提取的特征向量;
-
接下来开始训练神经网络, f表示同一个CNN神经网络,z表示两个特征向量之间的区别;
-
如果两张图片是同一个类别,那么输出接近1, 反之为0 ;
-
有了loss就可以反向传播更新参数, f(卷积神经网络)用来提取特, 全连接层用来计算相似度;
数据预测
-
训练好了之后我们要开始做预测
Triplet Loss
Schroff, Kalenichenko, & Philbin. Facenet: A unified embedding for face recognition and clustering. ln
CVPR,2015.
训练样本构建
我们有这样一个训练集,每次从中取出三个样本做一轮训练,首先从训练集里随机选一张图片,把他作为anchor锚点,然后从老虎的类别里随机抽样一张图片作为正样本, 然后排除掉老虎的类别,从数据集里随机抽样作为负样本
模型训练
-
把三张图片分别数据神经网络f 进行提取特征, 这三个f指的是同一个神经网络
-
计算正样本和锚点,负样本和锚点在特征空间上的距离,相同类别的特征向量都聚在一起,不同类别的特征向量都能被分开;
-
所以d+应该很小,因为正样本和锚点属于同一类别, d-应该很大,因为负样本和锚点属于不同类别;
-
基于刚才讨论的想法,我们来定义损失函数:
-
alpha是一个超参数,如果d- 比 d+大了alpha 我们就认为分类是正确的;
-
我们希望loss越小越好, 因此d+尽量小, d-要尽量大;
-
假如【d+ 加上alpha 减去 d-】 大于0,那么就是损失函数, 如果【d+ 加上alpha 减去 d-】小于0说明分类是正确的,损失函数为0;
数据预测
-
把这些图片都变成特征,然后计算特征之间的距离
总结
-
首先用一个比较大的数据训练一个Siamese network,知道事物之间的异同;
-
训练结束之后用Siamese network做预测,解决few-shot learning问题;
-
few-shot learing的特征是query的类别不在训练集里,所以还需要额外信息support set 来识别query图片;
预训练和微调 Pretraining and Fine Tuning
Few-Shot Prediction Using Pretrained CNN
Dhillon, Chaudhari, Ravichandran, & Soatto. A baseline for few-shot image classification, In ICLR, 2020.
Chen, Wang, Liu, Xu, & Darrell, A New Meta-Baseline for Few-Shot Learning. arXiv, 2020.
大多数Few-shot分类方法都是采用了这样的方法:
-
先用一个大数据集预训练一个神经网络,用来从图片中提取特征,做few-shot预测的时候,要用到这个训练好的神经网络;
-
把query 和 support set中的图片都映射成特征向量,这样就可以比较query与support set在特征空间上的相似度,比如计算两两特征的cosine similariy,最后选择相似度最高的,作为对query的分类结果;
-
cosine Similarity用于衡量两个单位向量之间的相似度;
-
两个向量的夹角作为两个向量的相似度, 把向量x投影到向量w上,投影的长度就是cosine similarity
-
当两个向量不为单位向量计算公式需要调整
-
用什么方法来训练这个神经网络都可以,只是这个网络的结构和训练方法会对最后结果产生影响
-
用训练好的神经网络对support set进行特征抽取和处理;
-
有了support set的特征向量,就可以对query进行分类
-
矩阵M有三行,u1, u2, u3, 左右给softmax得到分在每个类别的概率值
上面是用了预训练的神经网络来提取特征,从而做few-shot的预测, 这里和前面提到的孪生网络不一样的点:
1、这里的网络是预训练的,孪生网络是训练集里学的;
2、这里的相似性的计算用cosine Similarity, 孪生网络是一个全连接层;
Fine-Tuning
Chen, Liu, Kira, Wang, & Huang. A Closer Look at Few-shot Classification. In ICLR, 2019.Dhillon, Chaudhari, Ravichandran, & Soatto. A baseline for few-shot image classification. In ICLR, 2020Chen, Wang, Liu, u, & Darrell. A New Meta-Baseline for Few-Shot Learning. arXiv, 2020.
做完预训练之后可以用Fine-tuning来进一步提高准确率,Fine-tuning可以大幅提高few-shot的预测准确率
-
之前我们没有用Fine-tuning,不学习W和b , 而是直接固定W等于M(每一行都是一个类别的均值向量), b为全零向量
-
其实可以在support set上学习W和b , 这个叫做fine-tuning, 用support set中的数据链学习目标函数, 也可以让梯度传播到卷积神经网络,更新神经网络参数,让提取的特征向量更有效;
-
Supoort set通常很小,所以需要加上Regularization来防止过拟合;
Fine-tuning优化技巧(看时间决定是否跳过不说)
-
Fine-tuning 的参数初始化技巧:因为support set太小了,随机初始化有问题;
-
Fine-tuning的正则化用Entropy Regularization, 目的是引入信息熵,让模型有区分能力
-
进入Softmax之前用cosine similarity替换两个向量的直接内积;
总结
-
首先用一个大规模数据来预训练神经网络,这个神经网络可以把图片映射成特征向量;
-
第二步对support set 进行fine tuning 更新参数;
-
第三步把support set抽取成特征向量,比较query的特征做预测;
小样本学习总结
1. 什么是小样本学习?
-
小样本学习(Few-shot learning),在少数资料中也被称为low-shot learning。
-
小样本学习的目标是使用数量较少的训练集来构建准确的机器学习模型。
2. 小样本学习为什么重要 ?
-
类人的学习方式:人在看过少量例子后就可以认出手写字符之间的不同。然而,计算机需要大量的数据去“分类”它看到的东西,并识别出手写字符之间的不同。小样本学习是一种test base的方法,我们期望它能像人一样从少量的样本中学习。
-
稀有案例学习:小样本学习能用于稀有案例的学习。例如,当对动物图片进行分类时,用小样本学习训练的机器学习模型,在只得到少量的先验信息后,可以正确地对稀有物种的图像进行分类。
-
降低数据收集和计算成本:由于小样本学习仅需要少量的数据来训练模型,消除了数据收集和标记相关的高成本。
3. 小样本学习(Few-shot Learning)和零样本学习(Zero-shot Learning)的区别
小样本学习的目的是在有少量训练数据的情况下能获得准确分类测试样本的模型。零样本学习的目的是预测训练数据集中没有出现过的类。零样本学习和小样本学习有很多共同的应用,例如:
-
图像分类(image classification)
-
语义分割(semantic segmentation)
-
图像生成(image generation)
-
目标检测(object detection)
-
自然语言处理(natural language processing)
还有一种叫单样本学习(one-shot learning)的,单样本学习是小样本学习问题的一个特例,它的目的是从一个训练样本或图片中学习到有关物体类别的信息。单样本学习的一个例子是,智能手机中使用的人脸识别技术。
原文始发于微信公众号(风物长宜 AI):小样本学习简介
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论