Advertisement

【学习笔记】小样本学习(Few-shot Learning)入门

阅读量:

免费资源: Blogger(需翻Q)

免费资源: Blogger(需翻Q)


文章目录

  • 核心概念
  • 双胞胎网络(Duplicated Network)
  • 预训练与微调
  • 常见数据集(Few-shot Datasets)
  • 参考文献

基本概念

小样本学习(Few Shot Learning)是什么其本质是:基于少量样本实现分类与回归任务。

Few-shot Learning的目标 :让机器学会自己学习

小样本学习的直观理解

① 前提:首先要知道,训练一个模型的目的不是为了让模型如何分辨大象和蚂蚁,而是让模型具有判断图片“异同”的能力,即让模型看到两张图片后,它能分别出这俩是不是一个类别。这样,当我们在用大数据集训练出一个分类器后,在测试阶段给模型一个从来没见过的类别的图片(假设给了一个水獭图片),此时模型虽然不知道它是什么类别,但是依然能知道它不属于之前的所有类别。这时如果再给一个相同类别的图片(假设又给了一张水獭图片),此时虽然模型从来没见过这种类别的图片(模型从来没见过水獭),但模型依然能知道这俩是一种类别(模型能判断出这两张图片是一种动物)
② 思路:先用大的训练数据集训练出一个具备判断“异同”能力的模型,在测试阶段,再给一个小样本数据集(称为Support Set ),里面会包含模型没见过的样本类别,然后让模型判断当前给的图片属于 Support Set 中的哪一个类别。

例如:

在这里插入图片描述

在上图中,
基于现有的图像分类器,
然而该模型从未见过水獭(otter),
在测试阶段希望能够使该模型能够识别水獭,
从而为该模型提供一个支持集,
以便让其从这些选项中选择,
其查询图像应属于支持集中的一种。


在Meta Learning领域中,Few-shot learning 被视为一类独特的学习方法。其核心理念是致力于掌握系统性的知识获取方式(Learn to learn)。


k-way n-shot support Set :Support Set旨在帮助模型区分新类别中的小样本数据集。其中变量k表示小样本中类别的数量变量n表示每个类别所拥有的数据数量。例如,在一个分类任务中k=3n=1时,则被称为3-way one-shot.

  • k-way: k 的数量越多,分类准确率越低
  • n-shot: n 的数量越多,分类准确率越高

基于近邻的学习(Few-shot Learning)的核心概念
构建一个相似性测度(similarity measure):\text{sim}(x, x') ,用于评估样本 xx' 之间的相似程度,在测度值较高的情况下,则判断这两个样本很可能属于同一类别。借助于规模庞大的数据集可以训练出这一测度函数,并将其应用于预测任务中。

这里的相似度函数指的是整个模型。


孪生网络(Siamese Network)

Siamese Network 是一种用于小样本学习的网络


该网络所用训练数据集(Training Data)包含两部分:

  1. 正样本(Positive Samples ):两个“同类别”的样本构成的样本对 (x_i, x_j, 1), 其中 1 表示 x_ix_j 是同一个类别的样本,例如:(老虎a, 老虎a, 1)
  2. 负样本(Negative Samples):两个“不同类别”的样本构成的样本对(x_i, x_j, 0),其中 0 表示 x_ix_j 不是同一个类别的样本,例如 (汽车a, 大象a, 0)

Siamese Network的网络结构:

在这里插入图片描述
  • 系统 f: 可以包括CNN卷积神经网络;值得注意的是,在此上下文中 f 指同一个体。
  • 向量 \mathbf{h₁}, \mathbf{h₂}: 网络 \mathbf{f} 生成的输出向量。
  • 向量 \mathbf{z}: 对 \mathbf{h₁}, \mathbf{h₂} 进行操作后得到的结果为 \mathbf{z} = |\mathbf{h₁} - \mathbf{h₂}|.
  • Dense Layers: 全连接层。
在这里插入图片描述

:全连接层输出的数值(scalar)

该网络前向传播的过程:

将两个图像输入同一卷积神经网络f中,并通过该网络分别获得输出向量h_1h_2
计算其差值的绝对值以获得新的向量z = |h_1 - h_2|
然后将该向量z输入全连接层并经过激活函数处理以获得一个标量。
最后通过Sigmoid函数处理后得到最终结果,
这个结果即为这两个图像之间的相似度评估。

对于负样本(Negative Sample)同理。


进阶架构Triplet Loss

在这里插入图片描述

从训练集中随机抽取一个样本作为锚点(anchor)x^a后,并根据该锚点对应选取一个正样本x^+和一个负样本x^-. 将这三个样本输入到同一个卷积神经网络模型中,并分别计算正样本与锚点之间的欧氏距离平方d^{+}以及负样本与锚点之间的欧氏距离平方d^-. 具体而言,

d^{+} = \|\mathbf{f}(\mathbf{x}^{+}) - \mathbf{f}(\mathbf{x}^{a})\|_{2}^{2},

d^{-} = \| \mathbf{f}(x^{a}) - \mathbf{f}(x^{-}) \|_{2}^{2}.

其中\|\cdot\|_2^{2}表示二范数的平方运算.
显然地,在我们的目标函数中,
我们希望d^{+}尽可能小,
d^{-}尽可能大.
用图表示则为:

在这里插入图片描述
  1. 该损失函数被定义为 Loss(x^a, x^+, x^-)= \max\{0, d^+ + \alpha - d^-\} 其中α被视为一个正参数其意义在于:若负样本与锚点之间的距离超过正样本距离并增加α值即可认为正确分类则此时损失值将归零;反之则将d^+ + \alpha - d^-的结果作为该损失函数的输出值

Pretraining and Fine Tuning

针对熊类物种的另一种 Few-shot Learning 方法:基于现有的通用预训练模型进行学习,并通过这种学习策略能够有效解决少量样本学习的问题

CNN的预训练模型:采用了基于已有数据训练完成的CNN架构,在保留原始结构的基础上去除了最终全连接层即可。剩余的卷积层负责从图像中提取关键特征,并其功能类似于将图像信息转化为低维向量表示(embedding)。

具体做法

在这里插入图片描述
  1. 基于预训练模型 f 对所有的小样本进行特征提取,并获得它们各自的特征向量(feature Vectors)。
  2. 将同类别的Feature Vectors进行合并(如采用平均值计算的方式),随后对其进行归一化处理(normalization),最终获得每个类别对应的向量 u_i
  3. 当前准备工作已完成,请开始预测工作。
在这里插入图片描述

根据步骤1至2的方法对图像进行查询操作以获取向量 q 。接着计算向量 q 与各个类别向量 u_i 之间的距离,并确定与哪一个最接近;因此可判定该图片属于相应的类别。

计算过程的数学公式为:

概率向量\textbf{p}通过应用softmax函数计算得到的概率分布为p = \text{Softmax}(M\mathbf q), 其中M\mathbf q表示矩阵与向量相乘的结果, 每一行如\mathbf u_i^T\mathbf q即为对应于第i个基向量与向量\mathbf q的内积结果

选取 \textbf{p} 中数值最大的类别即可。


如何实现或应用Fine Tuning? 上述方法仅依赖于预训练模型而未对其进行进一步的微调(即Fine Tuning)。实际上,在某些文献中指出,在对预训练模型实施了微调后能够获得更好的效果。

Fine Tuning 策略:将预训练好的CNN的全连接层替换成自定义的,并通过使用支持集对全连接层进行微调即可完成任务。用数学公式表示就是:

p_j = \text{Softmax}(W \cdot f(x_j) + b)

其中预训练模型f不含全连接层;而本方法中的全连接层参数由\{W, b\}表示;同时我们选择Cross Entropy Loss(CE)作为损失函数进行计算

其实,上面没有Fine Tuning的版本就是将 W 固定为 M,而 b 固定为0.

Fine Tuning小技巧:

采用 W=Mb=0 进行参数设置,在实验中发现性能表现更好。
通过引入正则化手段能进一步提升损失函数的表现。
优化操作符作用于矩阵变量 \bm{W}_q, 该操作包括将原始权重矩阵中的每个元素 \bm{w}_q \in \mathbb{R}^{d \times d} 替换为其相似度表示 \text{sim}(\bm{w}_q), 据说这一改进措施能显著提升分类精度(参考文献: [1]).

在这里插入图片描述

Few-shot常用数据集

  • Omniglot:手写字母识别,适合学术界,只有几M,有1600多个类,但每个类别样本很少
  • Mini-ImageNet:图片识别,有100个类别,每个类别有600个样本

参考资料

参考视频:https://www.youtube.com/watch?v=UkQ2FVpDxHg

全部评论 (0)

还没有任何评论哟~