学习笔记 | Meta Learning(元学习)

元学习相关博客:

MAML模型无关的元学习代码完整复现(Pytorch版)

元学习—模型不可知元学习(MAML)

元学习—MAML模型Pytorch实现


数据集:

 ......


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(即锚点)。记录下这个锚点,然后从老虎的类别里面随机抽样一张图片作为正样本,记录下这个正样本,然后排除掉老虎这个类别,从数据集里面做随机抽样,得到一个负样本,比如得到大象的图片,记录下这个负样本。现在有了一组样本,一个锚点X^{a},一个正样本X^{+},一个负样本X^{-}

        把三张图片分别输入卷积神经网络f来提取特征(这三个f指的是同一个神经网络),拿卷积神经网络提取特征,得到三个特征向量。计算正样本与锚点在特征空间上的距离。把它的特征向量f\left ( x^{+} \right )f\left ( x^{a} \right )求差,然后算二范数的平方得到距离d^{+}。做类似的操作,把锚点与负样本的特征向量求差,然后计算二范数的平方得到距离d^{-}。 

        希望学出来的神经网络有这样的性质,相同类别的特征向量都聚在一起,不同类别的特征向量都能被分开。所以,d^{+}应该很小,因为正样本与锚点属于同一类别,而d^{-}应该很大,因为负样本与锚点属于不同类别。

        基于刚才讨论的想法来定义损失函数。第一,损失函数要鼓励正样本在特征空间上接近锚点,所以要让d^{+}尽量小。第二,要鼓励负样本在特征空间上远离锚点,所以要让d^{-}尽量大,只有这样才能分开正负样本。自己来指定一个margin,记作\alpha\alpha是个超参数,需要自己来调。理想情况下,d^{-}要足够大,d^{+}要足够小。如果d^{-}d^{+}大了\alpha,我们就认为这一组样本的分类是正确的,loss等于0。假如这个条件不满足,说明分不开,正负样本不知道老虎和大象的区别,那么,就会有loss,把loss定义为d^{+}+\alpha-d^{-}

        希望loss越小越好,也就是说,让d^{+}尽量小,把两只老虎的特征尽量聚在一起,还要让d^{+}尽量大,让大象和老虎的特征向量离得尽量远。综上所述,要定义这样一个损失函数,假如 d^{+}+\alpha-d^{-} 大于0,那么它就是损失函数;假如 d^{+}+\alpha-d^{-} 小于0,说明分类是正确的,那么损失函数就是0。有了损失函数,就可以求损失函数关于神经网络参数的梯度,然后做梯度下降来更新模型参数。

        训练好神经网络之后,可以拿来做)One-Shot分类,给一个Support,它的类别都没有出现在训练集里面,神经网络没有见过这些类别。给一个Query图片,要求判断Query是什么。用神经网络来提取特征,把所有这些图片都变成特征向量,然后比较特征向量之间的距离。比如,Query与狐狸在特征空间上的距离等于231,Query与松鼠在特征空间上的距离等于19。用同样的方法算出所有的距离,然后找出距离最小是Query与松鼠之间的距离,最小只有19。这时模型认为query与松鼠最相似,分类结果是松鼠。


Pretraining and Fine Tuning

        解决Few-Shot分类问题,最简单的方法就是预训练一个神经网络,用它来提取特征,有了这样的神经网络,就可以比较两张图片在特征空间上的相似度,从而做出分类。

        具体分两步:

        第一步,使用大规模数据来训练一个神经网络,这个神经网络可以把图片映射成特征向量。

        第二步,做预测,给一个query和一个support,要求判断query属于哪一类,拿预训练的神经网络来解决特征,把support在中的图片都变成特征向量,把每个类别中的特征向量来做平均,得到一个向量\mu。如果support中有k个类别,那么会得到k个特征向量\mu _{1}到 \mu _{k},把query的特征向量与这些就像做对比,最后根据相似度来做出分类。

        先做预训练,在做Few-Shot预测,这是最简单的方法。

        可以在这两部之间插入Fine Tuning,实验证明Fine Tuning可以显著提升预测准确率。做完预训练之后,用support set来进一步做训练,support set中有一些带标签的图片,可以拿它们来训练一个Softmax分类器,甚至可以更新预训练好的神经网络,让提取的特征更有效。

        做Fine Tuning的时候有几个有用的技巧,第一,Softmax分类器的参数矩阵W不要随机初始化,而是用矩阵M作为初始值(矩阵M的行是那些均值向量\mu);第二,用Entropy regularization让entropy尽量小;第三,把Cosine similarity与Softmax分类器结合起来,分类器里面不是计算内积,而是计算Cosine similarity。


参考内容:

Meta Learning(元学习)_哔哩哔哩_bilibili

元学习—MAML模型Pytorch实现

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.

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程日记✧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值