Meta-Learning for Semi-Supervised Few-Shot Classification. (用于半监督少样本分类的元学习)

1. 摘要

在少样本分类中,我们关注于学习一个可以用很少的标记数据训练一个分类器的算法。最近的少样本分类任务以使用元学习为主要特征。元学习中一个算法对应的一个参数化模型在表示不同分类任务的 episode (剧集,情节) 上面定义和训练,每一个 episode 中有自己的少量标记样本的训练集和对应的测试集。本文中,我们把这种少样本分类的范式推广到一种新的场景:每个 episode 中未标记的数据也是可用的。 我们考虑两种场景:

  1. 每个 episode 中未标记的样本属于本 episode 中的类,也就是说在这个 episode 中,虽然这些未标记的样本的具体 label 未知,但是我们知道它肯定属于这个 episode 中类别的某一个。(最简单的示例,这个 episode 我们分类鸡鸭鱼,这些未标记的样本具体属于哪一个不知,但是肯定是鸡鸭鱼中的某一个)
  2. 一个更具有挑战性的情况:这个 episode 中的未标记样本可能根本就不属于这个 episode 中的任意一类。(最简单的示例,这个 episode 我们分类鸡鸭鱼,某个未标记的样本可能是猪)

为了解决上述两种场景的问题,我们对原型网络(Prototypical Networks)进行了扩展,使其在产生原型的时候具有使用未标记样本的能力。这个模型在 episode 上以端到端的形式进行训练,成功学习利用未标记的样本。

本文还有一大贡献就是对 ImageNet 进行了一种新的切割,包含大量的类别,并且具有层级结构。

本文实际就是对 Meta-Learning 进行了半监督的扩展,正如期望那样,半监督可以提升少样本分类的性能。另外上文中的 episode 我个人更喜欢理解为 task,为了与之前论文一致,后文都使用 task(任务)。元学习的方法很多,作者选择的是对原型网络进行扩展,因此而且可以看成属于 meta-learning 中的度量学习 (Metric Learning)。

(推荐阅读以下链接,对理解本文很有帮助:
https://blog.csdn.net/weixin_37589575/article/details/92801610
https://blog.csdn.net/weixin_37589575/article/details/92768668)

2. 介绍

大量可用的标记数据使得深度学习方法在很多人工智能相关的任务上取得了巨大的成功,然而这也导致现在的深度学习模型陷入了一个问题:如果标记样本太少怎么办?具体而言,现在的深度学习模型擅长解决一个具有大量标记数据的单一任务,而可以解决各种具有很少标记样本的方法很少。另一方面,我们人类却可以快速学习新的类别,例如当我们参观一个热带国家见到一种新的水果的时候。这一人类智能和机器学习之间的巨大鸿沟为深度学习的发展提供了新的契机。

由于上述原因,最近越来越多的研究关注于少样本学习,他们考虑设计一种学习算法,专门用于在很少的训练数据问题上快速泛化。这里我们主要关注于少样本分类问题,分类问题假设每个类中仅仅包含很少的有标记样本。一种解决少样本问题的方法称为元学习 (Meta-Learning),元学习通过执行在由大量可用的标记数据上产生的大量各种分类任务上的迁移学习来对一个在训练时前所未见的类别分类任务上进行泛化。

已有大量的元学习方法提出,并且取得了很大的进步。然而,这些工作中对每个少样本学习任务进行了限制,本文从两个方法进行了推广:

  1. 每个任务中的训练集中有未标记的样本。这符合标准的半监督学习方式,但是常规的半监督没有 few-shot 以及推广到新的类这一限制。
  2. 一个更具有挑战性的情况:这个任务中的未标记样本可能根本就不属于这个任务中的任意一类。

Meta-Learning for Semi-Supervised Few-Shot Classification. (用于半监督少样本分类的元学习)_第1张图片
如图所示,这个图所示的就是一个 2-way 1-shot 的分类任务,但是和以前的任务有一些不同,我们加一些未标记的数据,这里虽然不再只有 2*1 = 2 个样本,但是我们标记的样本只有两个,未标记数据虽然在 support 集中,但是不计入我们 shot 数中。两种情况分别对应:

  1. 红色虚线中的金鱼和鲨鱼加入到我们的 support 中去,这 4 张图片虽然没有标记,但是如以前的半监督学习一样,可以提升性能。简单说,就是我们可以先预测这 4 张图片的类(虽然不一定准确),但是本质上可以增加我们的 support 样本,也就可以增加我们的 shot 数,显然 shot 越多,效果越好。
  2. 上一种情况太过于理想化,我们考虑另外一种更接近现实的情况,比如我们在所有的未标记集合中任意选 4 张。显而易见,我们可能选到狮子之类的图片,把他们放在 support 集中。问题出现了,我们如果先预测这个图片,然后使用它来训练我们的模型,有可能使准确率反而下降,因为这根本就是错误的信息。这种具有误导信息的样本我们称为干扰项(distractor)

本文的贡献:(1)第一篇在少样本学习任务上研究半监督的论文。(2)在常规的数据集 Omniglot 和 miniImageNet 进行实验,提供了问题定义和基准方法。(3)在具有干扰项和不具有干扰项的情况下进行了大量的实验,并且验证了半监督学习方式可以提升少样本分类任务的性能,扩展的原型网络比单纯的原型网络在此问题上表现更佳。

2. 背景

2.1 少样本学习:

本文的少样本学习方式是标准的方式。Meta-training classes: C train \mathcal{C}_{\text{train}} Ctrain,其中具有大量标记数据。但是我们的最终任务实在全新的类 Meta-testing classes: C test \mathcal{C}_{\text {test}} Ctest 上进行分类任务,并且 C test \mathcal{C}_{\text {test}} Ctest 中每个类只有很少的有标记样本。基于 episode 的范式就是使用 meta-training classes 中的大量样本模拟 meta-testing classes 上的少样本学习任务。具体而言,比如我们模拟 N N N-Way K K K-Shot 的任务。步骤如下:

  1. C train \mathcal{C}_{\text{train}} Ctrain 中随机抽取 N N N 个类
  2. 每个类采样 K K K 个样本,也就是一共 N ∗ K N*K NK 个样本作为我们的 support set: S = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N × K , y N × K ) } \mathcal{S}=\left\{\left(\boldsymbol{x}_{1}, y_{1}\right),\left(\boldsymbol{x}_{2}, y_{2}\right), \ldots,\left(\boldsymbol{x}_{N \times K}, y_{N \times K}\right)\right\} S={(x1,y1),(x2,y2),,(xN×K,yN×K)}
  3. 再随机采样另外 T T T 个样本作为我们的 query set: Q = { ( x 1 ∗ , y 1 ∗ ) , ( x 2 ∗ , y 2 ∗ ) , … , ( x T ∗ , y T ∗ ) } \mathcal{Q}=\left\{\left(\boldsymbol{x}_{1}^{*}, y_{1}^{*}\right),\left(\boldsymbol{x}_{2}^{*}, y_{2}^{*}\right), \ldots,\left(\boldsymbol{x}_{T}^{*}, y_{T}^{*}\right)\right\} Q={(x1,y1),(x2,y2),,(xT,yT)}

本质上来说,这就是一个 task,也就是一个 episode。我们常见的范式是在这个任务的 support set 上面进行训练,然后在 query 上进行测试。但是元学习不一样,元学习把这一整个任务看成一个 meta-training task,然后在大量类似的任务上学习,最后测试是在一个新的任务上面。新的任务之所以新,是因为里面的类是全新的,和所有的 meta-training 中的类别都不同。

问题设置参考上面提到的博客:
在这里插入图片描述
简单画了一个示意图,前面三个是三个 meta-training task (当然实际需要很多这样的 meta-training tasks 才能学到我们需要的先验知识),最后一个就是 meta-testing task。我们最后评价我们的 meta-learning 方法的好坏就是在红色标记部分上的 performance。

2.2 原型网络

原型网络简单且效果好。原型网络使用 support set 为每个类别提取原型,然后根据 query 中样本相对于各个原型的距离进行分类。具体而言,原型网络目的是学习一个 embedding 函数 h ( x ) h(\boldsymbol{x}) h(x),也就是一个参数化的神经网络,将样本映射到一个度量空间里面,其中相同类的距离近,不同类的距离远。原型网络的所有参数都在这个 embedding 函数中。
首先计算每个类的原型:直观的说,support set 中某个类所有样本的均值就是这个类的原型:例如类别 c c c 的原型 p c \boldsymbol{p}_{c} pc 计算如下:

p c = ∑ i h ( x i ) z i , c ∑ i z i , c , \boldsymbol{p}_{c}=\frac{\sum_{i} h\left(\boldsymbol{x}_{i}\right) z_{i, c}}{\sum_{i} z_{i, c}}, pc=izi,cih(xi)zi,c, where z i , c = 1 [ y i = c ] z_{i, c}=\mathbb{1}\left[y_{i}=c\right] zi,c=1[yi=c]

然后对 query 中某个新的样本 x ∗ x^{*} x 进行类别预测:直观的说,用相同的 h ( x ) h(\boldsymbol{x}) h(x) 映射到这个度量空间,离哪一个原型近,那么预测为该原型对应的类:例如 x ∗ x^{*} x 属于类别 c c c 的概率定义如下:

p ( c ∣ x ∗ , { p c } ) = exp ⁡ ( − ∥ h ( x ∗ ) − p c ∥ 2 2 ) ∑ c ′ exp ⁡ ( − ∥ h ( x ∗ ) − p c ′ ∥ 2 2 ) p\left(c | \boldsymbol{x}^{*},\left\{\boldsymbol{p}_{c}\right\}\right)=\frac{\exp \left(-\left\|h\left(\boldsymbol{x}^{*}\right)-\boldsymbol{p}_{c}\right\|_{2}^{2}\right)}{\sum_{c^{\prime}} \exp \left(-\left\|h\left(\boldsymbol{x}^{*}\right)-\boldsymbol{p}_{c^{\prime}}\right\|_{2}^{2}\right)} p(cx,{pc})=cexp(h(x)pc22)exp(h(x)pc22)

原型网络的训练策略是优化一个损失函数,这个损失函数是平均正确分类的负对数概率,如下:

− 1 T ∑ i log ⁡ p ( y i ∗ ∣ x i ∗ , { p c } ) -\frac{1}{T} \sum_{i} \log p\left(y_{i}^{*} | \boldsymbol{x}_{i}^{*},\left\{\boldsymbol{p}_{c}\right\}\right) T1ilogp(yixi,{pc})

训练过程就是迭代大量的 meta-training 任务,使用梯度下降更新参数。

最后的测试过程如下:对于新的任务新的类别 C test \mathcal{C}_{\text {test}} Ctest ,我们用 support 集中的少量样本产生原型,然后将 query 中的样本使用 h ( x ) h(\boldsymbol{x}) h(x) 映射过来,最后根据距离分类。预测类为最大概率其实就是最近距离:

y ^ = arg ⁡ max ⁡ c p ( c ∣ x ∗ , { p c } ) \hat{y}=\arg \max _{c} p\left(c | \boldsymbol{x}^{*},\left\{\boldsymbol{p}_{c}\right\}\right) y^=argmaxcp(cx,{pc})

3 半监督少样本学习

现在我们半监督一个任务中的 support 集合不仅包含之前的 S \mathcal{S} S 还有未标记的样本 R \mathcal{R} R R = { x ~ 1 , x ~ 2 , … , x ~ M } \mathcal{R}=\left\{\tilde{\boldsymbol{x}}_{1}, \tilde{\boldsymbol{x}}_{2}, \ldots, \tilde{\boldsymbol{x}}_{M}\right\} R={x~1,x~2,,x~M}
Meta-Learning for Semi-Supervised Few-Shot Classification. (用于半监督少样本分类的元学习)_第2张图片
文中给除了一个图示,其中左边的 Training 和 Testing 建议理解为 Meta-training 和 Meta-testing。这个任务其实是一个 3-way 1-shot 的任务。每个任务中虚线左边是这个任务训练的样本,不仅包含 S \mathcal{S} S,还有 R \mathcal{R} R。其中 + 号代表这个图片的类别是这个任务中的类别,而 - 号则不是,也就是前文中的干扰项 (是否为干扰项是未知的)。虚线右边就是每个任务的 query 。 我们期望在很多 Meta-training 任务上进行训练,最后在新的任务新的类别上,只给出虚线左边的示例,可以对右边示例进行好的分类。

3.1 半监督原型网络:

原本的原型网络并没有特别指明某一种方法来利用无标签数据。因此我们提出了多种扩展。首先给出原型 p c \boldsymbol{p}_{c} pc 的基本定义,然后在给出如果使用为标记数据 R \mathcal{R} R 产生提炼的原型 p ~ c \tilde{\boldsymbol{p}}_{c} p~c 的过程。一旦提炼的原型得到,我们的训练过程和测试过程就类似了,训练过程中的损失函数中的 p c \boldsymbol{p}_{c} pc 改为 p ~ c \tilde{\boldsymbol{p}}_{c} p~c。分类的时候找到也是最近的 p ~ c \tilde{\boldsymbol{p}}_{c} p~c 而不是最近的 p c \boldsymbol{p}_{c} pc
Meta-Learning for Semi-Supervised Few-Shot Classification. (用于半监督少样本分类的元学习)_第3张图片
左边是未利用未标记数据之前的原型,有色实线边框是 S \mathcal{S} S,虚线边框是 R \mathcal{R} R,而白色实线边框是 Q \mathcal{Q} Q。利用未标记数据提炼新的原型,也就是黑色实心点位置变化。

3.1.1 soft k-means 原型网络:

p ~ c = ∑ i h ( x i ) z i , c + ∑ j h ( x ~ j ) z ~ j , c ∑ i z i , c + ∑ j z ~ j , c , \tilde{\boldsymbol{p}}_{c}=\frac{\sum_{i} h\left(\boldsymbol{x}_{i}\right) z_{i, c}+\sum_{j} h\left(\tilde{\boldsymbol{x}}_{j}\right) \tilde{z}_{j, c}}{\sum_{i} z_{i, c}+\sum_{j} \tilde{z}_{j, c}}, p~c=izi,c+jz~j,cih(xi)zi,c+jh(x~j)z~j,c, where z ~ j , c = exp ⁡ ( − ∥ h ( x ~ j ) − p c ∥ 2 2 ) ∑ c ′ exp ⁡ ( − ∥ h ( x ~ j ) − p c ′ ∥ 2 2 ) \tilde{z}_{j, c}=\frac{\exp \left(-\left\|h\left(\tilde{\boldsymbol{x}}_{j}\right)-\boldsymbol{p}_{c}\right\|_{2}^{2}\right)}{\sum_{c^{\prime}} \exp \left(-\left\|h\left(\tilde{\boldsymbol{x}}_{j}\right)-\boldsymbol{p}_{c^{\prime}}\right\|_{2}^{2}\right)} z~j,c=cexp(h(x~j)pc22)exp(h(x~j)pc22)

首先利用原先的原型为每个无标记数据分配一个属于各个类别的概率。然后在计算提炼后的新的原型的时候把这一概率考虑进去。

3.1.2 soft k-means 和干扰项簇的原型网络:

3.1.1 的方法具有一个隐含假设,就是所有的无标记数据属于这个任务中的某一个类别,但这与我们考虑的第二种问题不符合。因为干扰项会严重损害后面的预测推断过程以及提炼过程。因此我们需要排除这些干扰项的影响。我们假设干扰项的簇以原点为中心:

p c = { ∑ i h ( x i ) z i , c ∑ i z i , c  for  c = 1 … N 0  for  c = N + 1 \boldsymbol{p}_{c}=\left\{\begin{array}{ll}{\frac{\sum_{i} h\left(\boldsymbol{x}_{i}\right) z_{i, c}}{\sum_{i} z_{i, c}}} & {\text { for } c=1 \ldots N} \\ {\mathbf{0}} & {\text { for } c=N+1}\end{array}\right. pc={izi,cih(xi)zi,c0 for c=1N for c=N+1

N 个类别原型的计算不变,干扰项原型在原点。

z ~ j , c = exp ⁡ ( − 1 r c 2 ∥ x ~ j − p c ∥ 2 2 − A ( r c ) ) ∑ c ′ exp ⁡ ( − 1 r c 2 ∥ x ~ j − p c ′ ∥ 2 2 − A ( r c ′ ) ) , \tilde{z}_{j, c}=\frac{\exp \left(-\frac{1}{r_{c}^{2}}\left\|\tilde{\boldsymbol{x}}_{j}-\boldsymbol{p}_{c}\right\|_{2}^{2}-A\left(r_{c}\right)\right)}{\sum_{c^{\prime}} \exp \left(-\frac{1}{r_{c}^{2}}\left\|\tilde{\boldsymbol{x}}_{j}-\boldsymbol{p}_{c^{\prime}}\right\|_{2}^{2}-A\left(r_{c^{\prime}}\right)\right)}, z~j,c=cexp(rc21x~jpc22A(rc))exp(rc21x~jpc22A(rc)), where A ( r ) = 1 2 log ⁡ ( 2 π ) + log ⁡ ( r ) A(r)=\frac{1}{2} \log (2 \pi)+\log (r) A(r)=21log(2π)+log(r)

其中 r c r_{c} rc 是我们引入的长度尺量来表示簇内距离的变化,特别是对于干扰簇。

3.1.3 soft k-means 和 masking 的原型网络:

首先计算样本 x ~ j \tilde{\boldsymbol{x}}_{j} x~j p c \boldsymbol{p}_{c} pc 之间的正则化距离 d ~ j , c \tilde{d}_{j, c} d~j,c :

d ~ j , c = d j , c 1 M ∑ j d j , c , \tilde{d}_{j, c}=\frac{d_{j, c}}{\frac{1}{M} \sum_{j} d_{j, c}}, d~j,c=M1jdj,cdj,c, where d j , c = ∥ h ( x ~ j ) − p c ∥ 2 2 d_{j, c}=\left\|h\left(\tilde{\boldsymbol{x}}_{j}\right)-\boldsymbol{p}_{c}\right\|_{2}^{2} dj,c=h(x~j)pc22

然后为每个原型估计自己的 thresholds 和 slopes,估计的过程是通过送到一个小的神经网络中得到的:

[ β c , γ c ] = MLP ⁡ ( [ min ⁡ j ( d ~ j , c ) , max ⁡ j ( d ~ j , c ) , var ⁡ j ( d ~ j , c ) , skew ⁡ ( d ~ j , c ) , kurt ⁡ j ( d ~ j , c ) ] ) \left[\beta_{c}, \gamma_{c}\right]=\operatorname{MLP}\left(\left[\min _{j}\left(\tilde{d}_{j, c}\right), \max _{j}\left(\tilde{d}_{j, c}\right), \operatorname{var}_{j}\left(\tilde{d}_{j, c}\right), \operatorname{skew}\left(\tilde{d}_{j, c}\right), \operatorname{kurt}_{j}\left(\tilde{d}_{j, c}\right)\right]\right) [βc,γc]=MLP([minj(d~j,c),maxj(d~j,c),varj(d~j,c),skew(d~j,c),kurtj(d~j,c)])

masks m j , c m_{j, c} mj,c 计算如下:

p ~ c = ∑ i h ( x i ) z i , c + ∑ j h ( x ~ j ) z ~ j , c m j , c ∑ i z i , c + ∑ j z ~ j , c m j , c , \tilde{\boldsymbol{p}}_{c}=\frac{\sum_{i} h\left(\boldsymbol{x}_{i}\right) z_{i, c}+\sum_{j} h\left(\tilde{\boldsymbol{x}}_{j}\right) \tilde{z}_{j, c} m_{j, c}}{\sum_{i} z_{i, c}+\sum_{j} \tilde{z}_{j, c} m_{j, c}}, p~c=izi,c+jz~j,cmj,cih(xi)zi,c+jh(x~j)z~j,cmj,c, where m j , c = σ ( − γ c ( d ~ j , c − β c ) ) m_{j, c}=\sigma\left(-\gamma_{c}\left(\tilde{d}_{j, c}-\beta_{c}\right)\right) mj,c=σ(γc(d~j,cβc))

4. 其他

实验,结论,相关工作以及 ImageNet 的新的划分等请参考原论文。

5. 论文链接

《Meta-Learning for Semi-Supervised Few-Shot Classification》:https://arxiv.org/pdf/1803.00676.pdf

你可能感兴趣的:(Meta-learning)