小样本学习和元学习学习笔记

Few-shot learning

如果每一类只有一两个样本,计算机能否和人一样做出正确的分类?

和传统的监督学习不同 ,meta learning 不是让机器学习训练集中的图片并且泛化到测试集中,meta learning 的目标是让机器学会学习。模型会判断事物之间的异同。

Support Set 是 meta learning 的术语,类似于监督学习中的训练集,提供事物的信息,让机器学会学习。而遇到的问题叫做 Query 。

传统监督学习:使用训练集训练模型,模型训练完成以后拿着模型去做预测,给模型看图片让模型做预测,图片没有出现在训练集中,模型没有见过这张图片,但是这张图片所属的类别包含在训练集里面,所以模型很容易判断图片的类别;

而 Few-shot learning 中,模型不仅没有见过待分类图片,甚至没有见过待分类图片的类别。模型通过对比 Query 和 Support Set 中图片的相似度,判断其所对应的类别

K-way  和  N-shot:way:分类的种类数;shot:每一个way的图片量;WAY越少/SHOT越多,就越准确。

学习相似度函数:
假设有一个相似度函数sim(x,x')

 sim(x,x'),能衡量两个参数的相似度并给出得分,得分高的相似度就高,得分低的相似度也低

例如有三张图片:斗牛犬1,斗牛犬2,狐狸1

sim(斗牛犬1,斗牛犬2) = 1

sim(斗牛犬1,狐狸1) = 0

sim(斗牛犬2,狐狸1) = 0

Siamese Network 孪生网络(两种训练方法)

1.两两相似度训练

搭建卷积神经网络提取特征,提取相同种类的不同待测图片的特征向量,比如两张不同的老虎的图片,把他们加入神经网络中求出特征向量,再把特征向量相减求绝对值,得到向量Z是特征向量之间的区别,再使用全连接层处理向量Z得到一个标量,最后用Sigmoid处理这个标量,两张图片如果相同,则输出应为1,如果不同,输出应该接近0,这里两只老虎的的输出应该为1;

损失函数是标签与预测之间的差别。有了损失函数,就可以用反向传播来计算梯度,然后用梯度下降来更新模型参数,模型主要有两两个部分,一个是卷积神经网络记作f,用来从图片提取特征,另一部分是全连接层,用来预测相关度,训练过程就是更新这两部分的参数,损失函数做反向传播,梯度从损失函数传到向量Z以及全连接层的参数,有了损失函数关于全连接层的梯度,就可以更新全连接层的参数了,然后梯度进一步从向量Z传播到卷积神经网络f,用计算出的梯度来更新卷积层的参数,就完成了一轮的训练,做训练的时候,要准备正样本和负样本正样本中把相同类型图片设置成1,负样本把随机抽样的两种不同样本设置为0;训练完成后,可以作one-shot预测,预测结果是一个0~1的数。

2.Triplet Loss

先从训练集中随机选择一张老虎图片作为anchor,记录下这个锚点,然后从老虎的图片中随机抽样一张图片作为正样本,记录下这个正样本,然后排除老虎的类别,从数据集中随机抽样作为负样本,比如得到大象的图片作为负样本,记录下这个负样本,

现在有了锚点xa,一个正样本x+,一个负样本x-

使用卷积神经网络提取特征,得到三个特征向量,fx+、fx-、fxa

计算正样本和锚点的特征向量差的二范数的平方记为d+

锚点负样本的特征向量差的二范数的平方记为d-

我们希望,相同类别的特征向量都聚在一起,不同类别特征向量分开,所以我们希望d+很小,d-很大,特征空间图如图所示:

 我们通过指定一个 margin 记作 α ,α 是个超参数需要自己去调,理想情况下d-足够大d+足够小,如果d-比d+大超过 α ,我们就认为这种分类是正确的,

Loss损失函数定义为 = d^{+}+\alpha -d^{-} ,(Loss为正时为损失函数,为负数时损失函数是0)

也就是:Loss(x^{a}, x^{+}, x^{-}) = max { 0, d^{+}+\alpha -d^{-}  }

再求取损失函数关于卷积网络的梯度,然后做梯度下降,训练好之后,one-shot分类,给出query图片,比较特征向量之间的距离。输出结果应给为 d = 一个距离数字 找出距离最小的一个作为分类结果即可。

预训练与微调

一种非常简单的方法:在大规模数据上预训练模型,然后再小规模的 support set 上做 Fine Tuning(微调), 这种方法虽然简单,但是准确率很高

 

先介绍 cosine similarity ,可以衡量两个向量之间的相似度,首先要求两个向量的膜 = 1 ,然后将其绘制在同一个直径为1的⚪中,记他们的夹角为\Theta,此时的投影长度就是 cosine similarity 他的取值范围是[-1, 1],计算方法是X^{T}W,如果向量X和W的长度不是1,那就需要先把他们归一化:

再介绍一下 Softmax 函数,它是一种常见的激活函数,把向量映射成一个概率分布,他的输入是\phi,是一个任意的k维向量,把\phi中每一个元素做指数变换,之后进行归一化,让得到的k个数相加 = 1 ,把归一化的结果记为向量 p ,向量 p 就是softmax的输出,p也就是一个概率分布,softmax通常用于分类器的输出层,如果有k个类别,那么softmax的输出就是k个概率值,每个概率值表示对应类别的 信度 。

 和max函数很像(max让大的变成1,小的变成0),但是Softmax比max温柔一些,让最大的值变大,但没有变到1 

 Softmax 分类器是一个全连接层加一个 Softmax 函数,分类器的输入是特征向量x,把x乘到参数矩阵W上,再加上向量 b ,得到一个向量【】,对得到的向量【】做Softmax变换,得到输出向量p 加入类别数目 = k ,那么向量 p 就是 k 维的,矩阵 W 和向量 b 是这一层的参数,可以从训练数据中学习,W 的每一行对应一个类别,

 大多数 Few-shot 分类方法都基于类似的想法,先用一个大数据集来预训练一个神经网络,用来从图片中提取特征,做Few-shot预测的时候,要用到这个训练好的神经网络,我们把 Query 和 Support set 中的图片都映射成特征向量,这样我们就可以比较 Query 和 Support set 在特征空间中的相似度,比如CS的方法进行比较,最终选择相似度最高的作为对 Query 的分类结果。

搭建一个卷积神经网络来提取特征,输入是一张图片,输出是提取的特征向量,可以用不同的方法类预训练这个神经网络,可以用传统的监督学习,训练好之后把全连接层都去掉,也可以用孪生网络,用什么方法训练这个神经网络都可以。

一种不少文章用的 Few-shot 分类的方法:首先把每个图片提取特征作为特征向量,把相同类别的特征向量做平均,得到相同大小的向量,这个均值向量就是对松鼠向量的表征,然后把这些均值向量归一化,得到三个向量,他们的膜值(二范数)都为1,做分类的时候,要拿Query的特征向量跟\mu 1\mu 2\mu 3对比,有了\mu 1\mu 2\mu 3这些特征向量,可以对待测值Query做分类,判断它属于三种类别中的哪一个,

拿到待测值Query对其提取特征向量,再做归一化得到向量q,把三个\mu向量堆叠起来,作为矩阵M的三个行向量,

 现在预测的方法是:把Query的特征向量q乘到矩阵M上,然后做Softmax变换得到p向量,他是一个概率分布向量,这个例子中p是一个三维向量,分别代表对三种类别的 信度

还有一种方法,就是做完预训练之后,再做微调

有几篇论文采用的这种方法:

之前讲的没有微调的与训练中,计算P_{j}的方法是:p_{j} = Softmax(M\cdot f(x_{j})),其中x是Query,y是类别标签,而含有微调的 p_{j} = Softmax(W\cdot f(x_{j})+b),就是把其中的W改成M(M内容如上),把 b 置为 0 。如果合理的学习和微调W向量和b向量,可以把精度提高好几个百分点

损失函数为:min\sum _{j}CrossEntropy(y_{j}, p_{j})

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值