利用先验知识,FSL(Few-shot Learning)可以快速推广到只包含少量监督信息样本的新任务。
FSL方法从如何利用先验知识的层面上可以分为三类:
(1)数据,利用先验知识来增强监督经验;
(2)模型,利用先验知识减少假设空间的大小;
(3)算法,利用先验知识在给定的假设空间中改变搜索最优假设的方法。
许多FSL的相关算法已经被提出,如元学习,嵌入学习,生成模型等。本文“Generalizing from a Few Examples: A survey on Few-shot Learning”对小样本学习领域研究内容的概括非常全面,其贡献主要如下:
(1)给FSL下了一个正式定义;
(2)列举了FSL相关的学习问题,并说明其联系与区别;
(3)指出了FSL监督学习问题的核心问题:基于机器学习中错误分解的不可靠经验风险最小化问题;
(4)从数据、模型、算法的角度对FSL进行了分类与讨论;
(5)从问题设置、技术、应用和理论等方面提出了FSL的未来发展方向。
FSL的相关问题
弱监督学习
与FSL最相关的问题是不完全监督的弱监督学习,即只有少量样本具有监督信息。从定义上,只有当FSL的先验知识是无标记信息,任务是分类或回归时,FSL就是弱监督学习问题。还可进一步分为:
半监督学习
半监督学习是从少量有标记的样本和(通常是大量)无标记的样本中学习。应用案例如文本分类和网页分类。
正无标记学习是半监督学习的一种特例,只给出正面的和不标记的样本。
主动学习
选择有信息的无标记数据来查询数据库获取输出。通常被用于注释标签开销较大的应用,如行人检测。
不平衡学习
不平衡学习从 y y y的偏态分布的经验 E E E中学习,即当 y y y的一些值很少被取到的情况,比如欺诈检测和灾难预测检测。不平衡学习训练和测试从所有可能的 y y y中选择,相比之下,FSL用少量样本对 y y y进行训练和测试,同时可能把其他的 y ′ s y's y′s作为先验知识进行学习。
迁移学习
迁移学习将知识从训练数据丰富的源领域/任务领域迁移到训练数据稀缺的目标领域。域适应是一种目标任务相同但目标任务域不同的迁移学习,例如在情感分析中,源域数据包含客户对电影的评论,而目标域数据包含客户对日常商品的评论。迁移学习方法广泛应用于FSL,将先验知识从源任务转移到少镜头任务。
元学习
元学习通过提供的数据集和元学习者跨任务提取的元知识来提高新任务 T T T的 P P P。具体来说,元学习者在任务中逐渐学习通用信息(元知识),学习者利用任务特定信息将元学习者概括为一个新任务 T T T。
FSL的核心问题
这一节中,作者阐述了监督学习中基于错误分解的FSL的核心问题。
经验风险最小化
对于假设
h
h
h,我们希望最小化其期望风险
R
R
R,是相对于
p
(
x
,
y
)
p(x,y)
p(x,y)的损失。具体地说:
R
(
h
)
=
∫
l
(
h
(
x
)
,
y
)
d
p
(
x
,
y
)
=
E
[
l
(
h
(
x
)
,
y
)
]
R(h)=\int l(h(x),y)dp(x,y)=\mathbb{E}[l(h(x),y)]
R(h)=∫l(h(x),y)dp(x,y)=E[l(h(x),y)]
由于
p
(
x
,
y
)
p(x,y)
p(x,y)未知,经验风险(即训练集
D
t
r
a
i
n
D_{train}
Dtrain上
I
I
I个样本的平均样本损失)
R
I
(
h
)
=
1
I
∑
i
=
1
I
l
(
h
(
x
i
)
,
y
i
)
R_I(h)=\frac{1}{I}\sum_{i=1}^{I}l(h(x_i),y_i)
RI(h)=I1i=1∑Il(h(xi),yi)
通常被作为 R ( h ) R(h) R(h)的替代,来进行经验风险最小化的计算(可能会使用一些正则化)。这个过程,即使用
h ^ = a r g m i n h R ( h ) \hat h=argmin_hR(h) h^=argminhR(h)作为最小化期望风险的函数;
h ∗ = a r g m i n h ∈ H R ( h ) h^*=argmin_{h\in\boldsymbol{H}}R(h) h∗=argminh∈HR(h)作为 H \boldsymbol{H} H中最小化预期风险的函数;
h I = a r g m i n h ∈ H R I ( h ) h_I=argmin_{h\in\boldsymbol{H}}R_I(h) hI=argminh∈HRI(h)作为 H \boldsymbol{H} H中最小化预期风险的函数。
由于 h ^ \hat h h^未知,必须用某个 h ∈ H h\in\boldsymbol{H} h∈H来近似它。 h ∗ h^* h∗是 h ^ ∈ H \hat h\in\boldsymbol{H} h^∈H中的最佳近似,而 h I h_I hI是通过经验风险最小化获得的 H \boldsymbol{H} H中的最佳假设。
简单起见,我们假设
h
^
\hat h
h^,
h
∗
h^*
h∗,
h
I
h_I
hI是唯一的。总误差可分解为:
E
[
R
(
h
I
)
−
R
(
h
^
)
]
=
E
[
R
(
h
∗
)
−
R
(
h
^
)
]
+
E
[
R
(
h
I
)
−
R
(
h
^
)
]
\mathbb{E}[R(h_I)-R(\hat h)]=\mathbb{E}[R(h^*)-R(\hat h)]+\mathbb{E}[R(h_I)-R(\hat h)]
E[R(hI)−R(h^)]=E[R(h∗)−R(h^)]+E[R(hI)−R(h^)]
ε
a
p
p
(
H
)
=
E
[
R
(
h
∗
)
−
R
(
h
^
)
]
\varepsilon _{app}(\boldsymbol{H})=\mathbb{E}[R(h^*)-R(\hat h)]
εapp(H)=E[R(h∗)−R(h^)]
ε
e
s
t
(
H
,
I
)
=
E
[
R
(
h
∗
)
−
R
(
h
^
)
]
\varepsilon _{est}(\boldsymbol{H},I)=\mathbb{E}[R(h^*)-R(\hat h)]
εest(H,I)=E[R(h∗)−R(h^)]
其中,期望值与随机选择的 D t r a i n D_{train} Dtrain有关。近似误差 ε a p p ( H ) \varepsilon _{app}(\boldsymbol{H}) εapp(H)度量的是 H \boldsymbol{H} H中的函数如何接近最优假设 h ^ \hat h h^,估计误差 ε e s t ( H , I ) \varepsilon _{est}(\boldsymbol{H},I) εest(H,I)则度量 H \boldsymbol{H} H中最小化经验风险 R I ( h ) R_I(h) RI(h)而不是期望风险 R ( h ) R(h) R(h)的影响。
总误差受假设空间 H \boldsymbol{H} H和样本个数 I I I的影响。换句话说,学习减少总误差可以从以下几个方面入手:(i)提供 D t r a i n D_{train} Dtrain的数据;(ii)确定 H \boldsymbol{H} H的模型;(iii)搜索适合 D t r a i n D_{train} Dtrain的最优 h I ∈ H h_I\in \boldsymbol{H} hI∈H的算法。
不可靠的经验风险最小化
一般来说, ε e s t ( H , I ) \varepsilon _{est}(\boldsymbol{H},I) εest(H,I)可以通过扩充样本量来降低。因此,当有足够的训练数据和监督信息(即 I I I很大)时,经验风险最小化 h I h_I hI可以为 H \boldsymbol{H} H中的 h ′ s h's h′s提供一个很好的近似 R ( h I ) R(h_I) R(hI)来达到可能的最佳 R ( h ∗ ) R(h^*) R(h∗)。
然而在FSL中,可用的examples数量很少。经验风险 R I ( h ) R_I(h) RI(h)可能远不能作为预期风险 R ( h ) R(h) R(h)的一个很好的逼近,由此产生的经验风险最小化的 h I h_I hI会过拟合。
优化方法分类
先验知识是提高FSL效果的必需信息,根据先验知识的使用方法,现有的FSL方法可以分为以下几类:
数据
利用先验知识增广训练集数据。最常见比如利用平移、旋转、镜像、缩放、裁剪等人工手段进行样本扩充。
从训练集变换出新的样本
该策略是通过将每个 ( x i , y i ) ∈ D t r a i n (x_i,y_i)\in D_{train} (xi,yi)∈Dtrain转化为几个具有变异的样本来扩充 D t r a i n D_{train} Dtrain。
从弱标注或无标注数据集中变换出新的样本
例如,为 D t r a i n D_{train} Dtrain中的每个样本学习一个样本支持向量机(SVM),然后用这个SVM来预测来自弱标记数据集的样本标签,再将具有目标标签的示例添加到 D t r a i n D_{train} Dtrain。
从相似数据集中变换出新的样本
该策略通过聚合和适应来自类似但更大的数据集的输入输出来增强 D t r a i n D_{train} Dtrain。
但是,相似数据集中的样本毕竟与目标FSL类有不同,直接将聚集的样本扩充到 D t r a i n D_{train} Dtrain可能会产生误导。因此,提出了生成对抗网络(generative adversarial network,GAN)。GAN能从一个包含许多样本的数据集中生成不可区分的合成标识牌 x ~ \tilde{x} x~。
GAN有两个生成器,一个将少量类的样本映射到大规模类,另一个将大规模类的样本映射到少量类(以弥补GAN训练中样本的不足)。
讨论与总结
数据增广来解决FSL问题的缺点是,数据增广的手段通常是为每个数据集量身定制,很难直接应用到其他数据集。最近,AutoAugment被提出来解决这个问题,它可以自动学习深度网络训练的增强策略。
模型
基于模型的FSL方法是利用先验知识缩小假设空间 H \boldsymbol{H} H,来使 h ∗ ∈ H h*\in \boldsymbol{H} h∗∈H尽可能接近 h ^ \hat h h^。但是,对于真实环境下的复杂问题,一个过小的 H \boldsymbol{H} H很难找到一个好的假设 h h h,FSL也需要一个足够大的 H \boldsymbol{H} H。模型方法是通过 E E E中的先验知识将 H \boldsymbol{H} H约束到更小的假设空间 H ~ \tilde \boldsymbol{H} H~来进行学习。
多任务学习
多任务学习通过利用任务一般信息和任务特定信息同时学习多个相关任务。
假设我们有 C C C个相关任务 T 1 , … … , T C T_1,……,T_C T1,……,TC,其中一些样本量很少,而有些样本量很大,每个任务 T c T_c Tc有一个相应的数据集 D c = { D t r a i n c , D t e s t c } D_c=\left\{D_{train}^c,D_{test}^c\right\} Dc={Dtrainc,Dtestc}。在这 C C C个任务中,我们将少样本的任务认作目标任务,其他的作为源任务。多任务学习从多个 D t r a i n c D_{train}^c Dtrainc中获取每个任务 T c T_c Tc的参数 θ c \theta_c θc。这些任务是共同学习的,任务 T c T_c Tc的预测模型 h c h_c hc的参数 θ c \theta_c θc受到其他任务的约束。根据任务参数的约束方式,可以将这种策略的方法分为(i)参数共享(ii)参数绑定。
(i)参数共享
该策略直接在任务之间共享一些参数(共享通用信息的前几层,学习不同的最终层)。目标任务可以只更新其特定于任务的层,而源任务可以更新共享层和特定于任务的层。
(ii)参数绑定
该策略激励不同的任务的参数趋同。一种常用的方法是正则化参数。
嵌入学习
嵌入学习将每个样本 x i ∈ X ⊆ R d x_i\in \boldsymbol{X}\subseteq \mathbb{R}^d xi∈X⊆Rd嵌入一个低维的 z i ∈ Z ⊆ R m z_i\in \boldsymbol{Z}\subseteq \mathbb{R}^m zi∈Z⊆Rm,这样一来,相似的样本就比较接近,而相似度低的样本就更容易被区分开。在低维的 Z \boldsymbol{Z} Z中可以构建一个更小的假设空间 H ~ \tilde \boldsymbol{H} H~,因此需要的训练样本数量也就更少。嵌入函数主要从先验知识中学习,另外可以使用 D t r a i n D_{train} Dtrain中的任务特定的信息。
嵌入学习有以下几个关键组成:
(i)一个函数
f
f
f,将测试样本
x
t
e
s
t
∈
D
t
e
s
t
x_{test}\in D_{test}
xtest∈Dtest嵌入到
Z
\boldsymbol{Z}
Z,
(ii)一个函数
g
g
g,将训练样本
x
i
∈
D
t
r
a
i
n
x_i \in D_{train}
xi∈Dtrain嵌入到
Z
\boldsymbol{Z}
Z,
(iii)一个相似度函数
s
(
⋅
,
⋅
)
s(\cdot,\cdot)
s(⋅,⋅),用于衡量
Z
\boldsymbol{Z}
Z中
f
(
t
e
s
t
)
f(test)
f(test)和
g
(
x
i
)
g(x_i)
g(xi)的相似度。
测试样本 x t e s t x_{test} xtest被分配给类 x i x_i xi,类 x i x_i xi是根据 s s s算出的 Z \boldsymbol{Z} Z中嵌入 g ( x i ) g(x_i) g(xi)最接近于 f ( t e s t ) f(test) f(test)的。虽然可以对 x i x_i xi和x_{test}使用一个共同的嵌入函数,但分别使用两个嵌入函数的准确率更高。
根据不同任务的嵌入函数
f
f
f和
g
g
g的参数是否不同,可以将这类的FSL方法分类为:
(i)任务特定的嵌入模型;
(ii)任务不变的嵌入模型;
(iii)混合嵌入模型。
(i)任务特定的嵌入模型;
任务特定的嵌入方法仅使用来自该任务的信息来学习为每个任务定制的嵌入函数。比如,使用任务 T c T_c Tc的少样本数据 D t r a i n c D_{train}^c Dtrainc, D t r a i n c D_{train}^c Dtrainc样本中所有的成对排名都被列举为样本对。训练样本的数量也因此增加,嵌入函数在仅用任务特定信息的情况下也能学习。
(ii)任务不变的嵌入模型
任务不变的嵌入方法从一个包含有各种输出的足够样本的大规模数据集学习一个通用的嵌入函数,然后直接使用这个函数在少样本的 D t r a i n D_{train} Dtrain。
尽管任务不变的嵌入不需要使用少样本的 D t r a i n D_{train} Dtrain更新嵌入模型参数,这类方法中有很多在训练嵌入模型时模拟少镜头场景。假设我们有训练集 { D c } \left\{D_c\right\} {Dc},每个训练集有 N N N类。在每个 { D c } \left\{D_c\right\} {Dc}中,仅从 N N N个类中提取 U U U的样本用于训练。通过最大化剩余 N − U N-U N−U类的性能来优化嵌入模型。因此,所学习的模型对于少样本任务具有很好的泛化效果。
(iii)混合嵌入模型
尽管任务不变嵌入方法可以以较低的计算成本应用于新任务,但它们并不利用当前任务的特定知识。当任务专用性是 D t r a i n D_{train} Dtrain只有少数样本(如罕见情况下的学习)时,简单地应用任务不变嵌入函数可能并不合适。为了解决这一问题,混合嵌入模型利用 D t r a i n D_{train} Dtrain中的任务特定信息,利用先验知识学习通用任务不变嵌入模型。这是通过学习一个函数来实现的,该函数将从 D t r a i n D_{train} Dtrain中提取的信息作为输入,并返回一个嵌入,作为 f { ⋅ } f\left\{\cdot\right\} f{⋅}的参数。
基于外部存储的学习
基于外部存储的学习从
D
t
r
a
i
n
D_{train}
Dtrain中提取知识,将其保存在外部存储中。每个新的样本
x
t
e
s
t
x_{test}
xtest用从内存中提取的内容的加权平均值表示。这就限制了
x
t
e
s
t
x_{test}
xtest只能用内存中的内容来表示,从而从本质上缩小了
H
\boldsymbol{H}
H。
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20210706155149329.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjcwODMwMQ==,size_16,color_FFFFFF,t_70
讨论与总结
当存在相似任务或辅助任务时,可以使用多任务学习来约束少样本任务的 H \boldsymbol{H} H。但是注意需要对所有任务进行联合训练。因此,当一个新的小样本任务加入时,需要对整个多任务模型进行再次训练。而且, D D D和 D c D_c Dc的大小不能太接近,否则少样本任务可能会多样本的任务淹没。
嵌入学习方法可以用在存在一个包含多类样本的大数据集的时候,这些方法将样本映射到一个良好的嵌入空间,在这个嵌入空间中不同类别的样本可以很好地分离,因此需要一个较小的 H ~ \tilde \boldsymbol{H} H~。但是嵌入学习方法在少样本任务与其他任务关联性较低时效果可能不佳,而且,如何弥补通用的和任务特定的信息很重要。
基于外部存储的学习方法需要一个存储网络,通过使用精心设计的更新规则,可以有选择地保护内存插槽。这个方法的弱点在于它会导致额外的空间占用和计算开销,这些开销会随着内存大小的增加而增加。因此,当前外部内存的大小是有限的。
算法
算法是在假设空间 H \boldsymbol{H} H中搜索最优假设 h ∗ h^* h∗的参数 θ \theta θ的方法,在第 t t t次迭代时, θ t = θ t − 1 + Δ t − 1 \theta_t=\theta_{t-1}+\Delta_{t-1} θt=θt−1+Δt−1。例如,对于常用的随机梯度下降法(SGD)及其变体, θ \theta θ更新为: θ t = θ t − 1 − α t l ( h ( x t ; θ t − 1 ) , y t ) \theta_t=\theta_{t-1}-\alpha_t\boldsymbol{l}(h(x_t;\theta_{t-1}),y_t) θt=θt−1−αtl(h(xt;θt−1),yt)
其中, α t \alpha_t αt是步长。当 θ \theta θ初始化在 θ 0 \theta_0 θ0时, θ t = θ 0 + ∑ i = 1 t Δ θ i − 1 \theta_t=\theta_0+\sum_{i=1}^{t} \Delta\theta_{i-1} θt=θ0+∑i=1tΔθi−1。
当监督信息丰富时,有足够的的训练样本来更新 θ \theta θ,并通过交叉验证来找到合适的步长 α \alpha α。然而在FSL中由于所提供的少样本 D t r a i n D_{train} Dtrain不够大,所以得到的经验风险最小值是不可靠的。
算法类的方法使用先验知识来影响获取 θ \theta θ的方式,或者通过(i)提供一个好的初始化参数 θ 0 \theta_0 θ0,或(ii)直接学习一个优化器来输出搜索步骤。关于先验知识对搜索策略的影响,我们将这部分方法分为三类:
(1)改进现有的参数。使用从其他任务学到的初始 θ 0 \theta_0 θ0,然后使用 D t r a i n D_{train} Dtrain进行更新;
(2)改进元学习参数。通过一系列任务元学习获得初始 θ 0 \theta_0 θ0,这些任务来自与少样本任务相同的任务分布,然后使用 D t r a i n D_{train} Dtrain进一步地学习改进。
(3)学习优化器。这种策略学习一个元学习器作为优化器,直接为每个学习器输出搜索步骤,如改变搜索策略或步长。
改进现有参数
该策略将从相关任务中学习到的预训练模型的 θ 0 \theta_0 θ0作为初始化参数,通过 D t r a i n D_{train} Dtrain使其适应 θ \theta θ。假设是 θ 0 \theta_0 θ0捕获了大尺度数据的一些结构。因此,通过一些迭代,它可以适应于 D D D。
(1)利用正则化现有参数进行微调
这种策略通过正则化对少样本任务进行微调,例如,使用一个前景分割的大数据集来调整一个使用ImageNet训练的用于图像分类的预训练CNN网络。对于少样本的 D t r a i n D_{train} Dtrain,简单地通过梯度下降微调 θ 0 \theta_0 θ0可能会导致过拟合。因此,如何在不过度拟合的情况下使 θ 0 \theta_0 θ0适应 D t r a i n D_{train} Dtrain是一个关键的设计问题。
使用正则化微调 θ 0 \theta_0 θ0来防止过拟合。同样可以分为以下几种:
(i)提前停止。它需要从 D t r a i n D_{train} Dtrain中分离验证集来监控训练过程,当验证集的性能没有提高时,学习停止;
(ii)选择性更新 θ 0 \theta_0 θ0。只更新了 θ 0 \theta_0 θ0的一部分,以避免过拟合。例如,给定一组预训练滤波器,只学习与滤波器相乘的强度参数。
(iii)同步更新 θ 0 \theta_0 θ0的相关部分。可以将 θ 0 \theta_0 θ0的元素分组(例如深度神经网络中的神经元),并使用相同的更新信息联合更新每一组。
(iiii)使用模型回归网络,模型回归网络步骤了任务不可知的变换,它将在少量样本上训练获得参数值映射到大量样本上训练得到的参数值。
(2)聚合一组参数
有时开始时缺少合适的 θ 0 \theta_0 θ0,相反我们有许多从相关任务中学到的模型,例如,在人脸识别中,我们可能已经有了眼睛、鼻子和耳朵的识别模型。因此,可以将这些模型参数聚合成一个合适的模型,然后直接使用或由 D t r i a n D_{trian} Dtrian进行细化。
正如在数据那一章讨论的,从未标注数据集和相似标注数据集中获取的样本可以用来增强少样本的 D t r a i n D_{train} Dtrain。与直接使用样本不同,下面的方法使用从这些数据集预训练得到的模型,问题在于如何使用 D t r a i n D_{train} Dtrain将其调整为对新任务有效。
(i)未标注数据集。尽管没有监督信息,相似样本仍然可以被分类到一起。因此,可以对未标记数据进行预处理,很好地对样本进行聚类和分离。然后使用神经网络用少样本 D t r a i n D_{train} Dtrain来适应新的任务。
(ii)相似数据集。通过利用来自相似类的样本和分类器来执行少样本对象分类。首先,它用新类的特性来替换这些相似类中样本的特性。然后重用学习到的分类器,只针对新类调整分类阈值,使用 D t r i a n D_{trian} Dtrian学习结合从相似数据集中学习到现有参数。
(3)用新参数微调现有参数
预训练的 θ 0 \theta_0 θ0不足以完全编码新的FSL任务。因此,需要一个额外的参数 δ \delta δ来表达 D t r a i n D_{train} Dtrain的特性。具体而言,该策略将模型参数扩展为 θ = { θ 0 , δ } \theta=\left\{ \theta_0, \delta \right\} θ={θ0,δ},在学习 δ \delta δ的时候微调 θ 0 \theta_0 θ0。
例如,利用预训练好的CNN的下层进行特征嵌入,并使用 D t r a i n D_{train} Dtrain对嵌入的特征学习线性分类器。
改进元学习参数
改进元学习参数的方法是利用元学习来优化元学习参数 θ 0 \theta_0 θ0,元学习根据学习器的性能不断优化 θ 0 \theta_0 θ0。
元学习得到的 θ 0 \theta_0 θ0通常用梯度下降法加以改进,典型的方法是模型不可知论元学习(MAML)。
学习优化器
元学习参数 θ 0 \theta_0 θ0作为数据 D D D在 T P ( T ) T~P(T) T P(T)范围内的良好初始化,通过一些有效的梯度下降步骤将其调整到任务特定的参数 ϕ \phi ϕ。
与此相反,学习优化器的方法不是使用梯度下降,而是学习一个优化器,可以直接输出更新值。这样就不需要调整步长 α \alpha α或寻找搜索方向,因为学习算法会自动完成这些工作。
讨论与总结
通过使用已有的 θ 0 \theta_0 θ0作为初始化值,改进现有参数的方法可以降低在 H \boldsymbol{H} H中搜索最优解的压力。学习的重点是优化现有参数,然而由于 θ 0 \theta_0 θ0是从不同于当前任务中学习到的,这种策略可能会牺牲精度来换取速度。
另外两种策略依赖元学习理论(说实话没太看懂)。通过从一组相关任务中学习,元学习得到的参数 θ 0 \theta_0 θ0可以接近新任务 T t T_t Tt的任务特定参数 ϕ t \phi _t ϕt。通过元学习法学习搜索步骤可以直接指导搜索算法。
换句话说,元学习器是作为一个优化器,但是,一些重要的问题,比如如何跨不同粒度进行元学习(比如动物的粗粒度分类和狗的细粒度分类)或不同的数据源(比如图像和文本)仍然尚未完全解决。