元学习相关博客:
数据集:
......
Few-Shot Learning 基本思想:
在大规模训练集中训练Siamese network
• 从 k-way 和 n-shot 中给出一组support set
• k-way 意味着k类
• n-shot 表示每个类别有n个样本
• 培训集不包含k类
• 给出一个查询,预测其类别
• 使用Siamese network计算相似性或距离
开始训练神经网络
Siamese Network
法一:Learning Pairwise Similarity Scores
训练这个神经网络要用一个分类数据集(数据有标注,每一类下面都有很多个样本)。我们需要用训练集来构造正样本和负样本。正样本可以告诉神经网络什么东西是同一类,负样本可以告诉神经网络事物之间的区别。
正样本:每次从训练集里面随机抽取一张图片,比如这张老虎的图片,然后从同一类中随机抽取另一张图片,比如另一个老虎的图片。把标签设置为1,意思是相似度满分。用同样的方法可以抽样得到两张汽车图片,两张大象图片。
负样本:每次随机抽取一张图片,比如抽到这辆汽车,然后排除掉汽车这个类别,再从数据集里做随机抽样,比如得到一只大象。这两张图片类别不同,所以标签设置为0,意思是相似度为0。同样的道理,做随机抽样构造负样本,比如得到哈士奇和老虎,或者大象和鹦鹉,标签都设置为0。
搭一个卷积神经网络,用来提取特征。这个神经网络有很多卷积层、pool层以及一个Flatten层。输入是一张图片,输出是提取的特征向量,把输入记为x,把输出的特征向量记作f(x)。
准备好训练数据,比如输入是两只老虎,标签是1。把这两张图片输入神经网络,刚才搭建的卷积神经网络记作函数f。卷积神经网络输出提取的特征向量,把第一张图片X1的特征向量记作h1,把第二张图片X2的特征向量记作h2(强调一下,只有一个卷积神经网络,这两个f指的是同一个神经网络)。然后拿h1-h2,得到一个向量,在对这个向量的所有元素,求绝对值记作向量z,表示两个特征向量之间的区别(即z=|h1-h2|)。再用一些全连接层来处理这个z向量,最终输出一个标量。最后用Sigmoid激活函数,得到的输出是一个介于0到1之间的实数,这个输出就可以衡量两个图片之间的相似度。如果两张图片是同一个类别,那么输出应该接近1,如果两张图片不同,那么输出应该接近0。之前我们已经准备好了标签,这两张图片都是老虎,所以标签是1。希望神经网络的输出接近标签,把标签与预测之间的差别作为损失函数。
有了损失函数,就可以用反向传播来计算梯度,然后用梯度下降来更新模型参数。模型主要有两个部分,一个是卷积神经网络f(用来从图片提取特征),另一部分就是这些全连接层(用来预测相似度)。训练的过程就是更新这两部分的参数,做反向传播,梯度从损失函数传回到向量z以及全连接层的参数。有了损失函数,关于全连阶层的梯度就可以更新全连阶层的参数了。然后梯度进一步从向量z传播到卷积神经网络f,用计算出的梯度来更新卷积层的参数,这样就完成了一轮训练。
做训练的时候,要准备同样数量的正样本和负样本。负样本的意思是这两张图片是不同的事物,负样本的标签设置为0,希望神经网络的预测接近0,意思是这两张图片不同,还是用同样的方法做反向传播,然后更新卷积层和全连接层的参数。
训练好模型之后,可以拿它来做One-Shot Prediction,这个例子里的Support set是six-way one- shot 一共有六个类别,每个类别只有一张图片。注意一下,这六个类别都不在训练集里,这就是future learn的困难之处。现在来了一个Query(知道它一定属于support六个类别中的一个),判断它属于哪一个 。具体做法就是逐一对比Query与Support的图片,Siamese network会输出一个介于0到1之间的值。有了所有这些相似度,查找相似度最高的发现,Query与松鼠的相似度最高,所以判断Query是松鼠。
法二:Triplet Loss
一个训练集,每次要从中选出三张图片做一轮训练。首先从训练集里面随机选一张图片,比如选中老虎的图片,把它作为anchor(即锚点)。记录下这个锚点,然后从老虎的类别里面随机抽样一张图片作为正样本,记录下这个正样本,然后排除掉老虎这个类别,从数据集里面做随机抽样,得到一个负样本,比如得到大象的图片,记录下这个负样本。现在有了一组样本,一个锚点,一个正样本,一个负样本。
把三张图片分别输入卷积神经网络f来提取特征(这三个f指的是同一个神经网络),拿卷积神经网络提取特征,得到三个特征向量。计算正样本与锚点在特征空间上的距离。把它的特征向量与求差,然后算二范数的平方得到距离。做类似的操作,把锚点与负样本的特征向量求差,然后计算二范数的平方得到距离。
希望学出来的神经网络有这样的性质,相同类别的特征向量都聚在一起,不同类别的特征向量都能被分开。所以,应该很小,因为正样本与锚点属于同一类别,而应该很大,因为负样本与锚点属于不同类别。
基于刚才讨论的想法来定义损失函数。第一,损失函数要鼓励正样本在特征空间上接近锚点,所以要让尽量小。第二,要鼓励负样本在特征空间上远离锚点,所以要让尽量大,只有这样才能分开正负样本。自己来指定一个margin,记作,是个超参数,需要自己来调。理想情况下,要足够大,要足够小。如果比大了,我们就认为这一组样本的分类是正确的,loss等于0。假如这个条件不满足,说明分不开,正负样本不知道老虎和大象的区别,那么,就会有loss,把loss定义为+-。
希望loss越小越好,也就是说,让尽量小,把两只老虎的特征尽量聚在一起,还要让尽量大,让大象和老虎的特征向量离得尽量远。综上所述,要定义这样一个损失函数,假如 +- 大于0,那么它就是损失函数;假如 +- 小于0,说明分类是正确的,那么损失函数就是0。有了损失函数,就可以求损失函数关于神经网络参数的梯度,然后做梯度下降来更新模型参数。
训练好神经网络之后,可以拿来做)One-Shot分类,给一个Support,它的类别都没有出现在训练集里面,神经网络没有见过这些类别。给一个Query图片,要求判断Query是什么。用神经网络来提取特征,把所有这些图片都变成特征向量,然后比较特征向量之间的距离。比如,Query与狐狸在特征空间上的距离等于231,Query与松鼠在特征空间上的距离等于19。用同样的方法算出所有的距离,然后找出距离最小是Query与松鼠之间的距离,最小只有19。这时模型认为query与松鼠最相似,分类结果是松鼠。
Pretraining and Fine Tuning
解决Few-Shot分类问题,最简单的方法就是预训练一个神经网络,用它来提取特征,有了这样的神经网络,就可以比较两张图片在特征空间上的相似度,从而做出分类。
具体分两步:
第一步,使用大规模数据来训练一个神经网络,这个神经网络可以把图片映射成特征向量。
第二步,做预测,给一个query和一个support,要求判断query属于哪一类,拿预训练的神经网络来解决特征,把support在中的图片都变成特征向量,把每个类别中的特征向量来做平均,得到一个向量。如果support中有k个类别,那么会得到k个特征向量到 ,把query的特征向量与这些就像做对比,最后根据相似度来做出分类。
先做预训练,在做Few-Shot预测,这是最简单的方法。
可以在这两部之间插入Fine Tuning,实验证明Fine Tuning可以显著提升预测准确率。做完预训练之后,用support set来进一步做训练,support set中有一些带标签的图片,可以拿它们来训练一个Softmax分类器,甚至可以更新预训练好的神经网络,让提取的特征更有效。
做Fine Tuning的时候有几个有用的技巧,第一,Softmax分类器的参数矩阵W不要随机初始化,而是用矩阵M作为初始值(矩阵M的行是那些均值向量);第二,用Entropy regularization让entropy尽量小;第三,把Cosine similarity与Softmax分类器结合起来,分类器里面不是计算内积,而是计算Cosine similarity。
参考内容:
Meta Learning(元学习)_哔哩哔哩_bilibili
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 ICML,2015.
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.
Chen, Liu, Kira, Wang,& Huang.A Closer Look at Few-shot Classification. In lCLR, 2019.
Dhillon, Chaudhari, Ravichandran, & Soatto.A baseline for few-shot image classification. In lCLR, 2020.
Chen, Wang, Liu, Xu, & Darrell.A New Meta-Baseline for Few-Shot Learning.arXiv, 2020.