【学习笔记】小样本学习(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=3且n=1时,则被称为3-way one-shot.
- k-way: k 的数量越多,分类准确率越低
- n-shot: n 的数量越多,分类准确率越高
基于近邻的学习(Few-shot Learning)的核心概念:
构建一个相似性测度(similarity measure):\text{sim}(x, x') ,用于评估样本 x 与 x' 之间的相似程度,在测度值较高的情况下,则判断这两个样本很可能属于同一类别。借助于规模庞大的数据集可以训练出这一测度函数,并将其应用于预测任务中。
这里的相似度函数指的是整个模型。
孪生网络(Siamese Network)
Siamese Network 是一种用于小样本学习的网络
该网络所用训练数据集(Training Data)包含两部分:
- 正样本(Positive Samples ):两个“同类别”的样本构成的样本对 (x_i, x_j, 1), 其中 1 表示 x_i 和 x_j 是同一个类别的样本,例如:(老虎a, 老虎a, 1)
- 负样本(Negative Samples):两个“不同类别”的样本构成的样本对(x_i, x_j, 0),其中 0 表示 x_i 和 x_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_1和h_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^{-}尽可能大.
用图表示则为:

- 该损失函数被定义为 Loss(x^a, x^+, x^-)= \max\{0, d^+ + \alpha - d^-\} 其中α被视为一个正参数其意义在于:若负样本与锚点之间的距离超过正样本距离并增加α值即可认为正确分类则此时损失值将归零;反之则将d^+ + \alpha - d^-的结果作为该损失函数的输出值
Pretraining and Fine Tuning
针对熊类物种的另一种 Few-shot Learning 方法:基于现有的通用预训练模型进行学习,并通过这种学习策略能够有效解决少量样本学习的问题
CNN的预训练模型:采用了基于已有数据训练完成的CNN架构,在保留原始结构的基础上去除了最终全连接层即可。剩余的卷积层负责从图像中提取关键特征,并其功能类似于将图像信息转化为低维向量表示(embedding)。
具体做法 :

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

根据步骤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=M 和 b=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个样本
