小样本学习
目的:学会不同物体的异同。
Support Set不是训练集
用一个大的训练集训练一个大模型,训练的目的不是让模型识别训练集里的大象老虎,而是让模型知道事务之间的异同。(可以用SUpport Set数据集,让模型判断Query是水塔,尽管训练集里面没有水獭这个类别。)
Meta Learning(这个名字有些故能玄虚,可以把它看做Few-shot learning 小样本学习)
Few-shot Learning is a kind of meta learning。
Meta learning :learn to learn。
- 小孩子怎么学习
虽然他没有见过水獭,但是他有区分动物的能力(学习能力),你给他一些卡片和对应的名字,小孩子既没有见过水獭,也没见过卡片里的动物,但是他对比一遍就发现这个动物是水獭了(他有能力把相同的东西对应起来),他判断的依据是眼前的动物和卡片里水獭很像。
去动物园之前小朋友就用判断不同动物之间异同的能力(学习能力),培养小朋友自主学习就是mata learning. - 靠一张卡片学会识别水獭是one-short learning
传统监督学习和Few-shot learning 之间的区别。
传统监督学习:首先拿一个训练集训练模型,模型学习好之后,可以拿模型做预测(给模型看测试图,让他做预测),虽然模型没有见过这张哈士奇的图片,看是模型已经看过上百张哈士奇的图片了,所以模型可以判断出这张哈士奇。
few-shot learning:模型经过训练集训练,再拿query和support set对比,知道query是兔子。
- 小样本学习的术语:
k-way是指support里面有k个类别,n-shot指每个类别里面有n个样本。
2. 正确率受way和shot影响
解决方法
- 找出一个相似度函数进行判断,可以在一个很大的训练集上训练一个相似度函数。
数据集
1600个类,每个类20个样本
Sinamese Network(孪生网络(reid就是用孪生网络思想))
- 训练Sinamese Network要用一个大的有标签数据集。
正样本告诉网络什么是相似的,负样本告诉网络什么是不同的。
- 网络:提取特征
- 训练:
这种方法每次取两张训练,计算两两间相似度(取值0-1)
- 测试
Support set中的数据都不在训练集里。
- Triplet loss:每次取三张训练(计算距离)
Pretraining and Fine Tuning
一种简单而有效的方法:在大规模数据上预训练模型,再在小规模数据上微调。
- cosine similarity
如何衡量两个向量之间的距离呢?对于两个模相同的向量我们可以计算余弦距离。(长度为1时如下)
若两个向量长度不为1,需要归一化
support set中同一类别做均值,来代表这一类别
。其中用到softmax,这可以强化某些因素,并且让所有向量的模都是1。
- 比较
Fine-Tuning
可直接把W设置成M,这样就是用固定的W和b
M矩阵的每一行都是一个类别的均值向量。
Fine tuning:也可以在support set上学习W和b。
(Fine tuning可以把预测准确率提高好几个百分点。)
(用support set中所有的标签来训练这个分类器。分类器中的参数是W和b,也可以让梯度传播到卷积神经网络)
support set往往很小,容易过拟合。所以加一个Regularization防止过拟合。
- W和b的初始化很重要,W=M,b=0。
- 正则化
sim是归一化。
总结
解决few-shot问题就是预训练一个神经网络,用其来提取特征。比较两张图片在特征空间的相似度,从而做出分类。
分两步
- 用大规模数据预训练神经网络这个网络可以将图片映射成向量。
- 做预测:给一个query和一个support set,判断query为哪一类,把support set中的数据提取成特征向量,把每个类别的特征向量做平均,得到一个向量u,如果support set中有k个类别,就会得到k个平均后的特征向量,把query 的向量和这些向量作对比,计算cos相似度,最后做出分类。
在第一步和第二步之间可以加入Fine Tuning进一步训练。
用support set进行Fine Tuning,用support set训练一个softmax分类器,也可以反向传播到预训练好的神经网络,让提取的特征更有效。
Fine Tuning有一些有用的技巧。 - 用M初始化W,不要随机初始化。
- 用Entropy regularization让Entropy尽量小。
- 把Cosine similarity和Softmax classifier结合起来。