论文笔记 – Task-specific Few-shot learning

1 任务描述

以往的度量学习,是利用全部的训练数据来计算 support set 和 query set 的 embedding $f(·)$ 和 $g(·)$。这相当于在全部训练数据之中寻找方便分类的关键特征,将这些关键特征的维度作为度量空间的基。

但是这样 general 的特征提取,对于分类是最好的吗?[3] 中给出这样一个例子:如果要区分猫、狗、鸟,那么最好的特征是“有无翅膀”,如果要区分飞机和鸟,那么最好的特征是“有无羽毛”。可以看到,在不同的 task 中,关键特征是不同的。而我们的小样本学习的 episode 其实就是一个 task,在这个 task 里,我们应该关注对当前 N-way 最关键的特征,传统的 ProtoNet 等,都没考虑 task-specific 的问题。

2 CTM [1]

这篇文章的笔记详见这里。大致流程如下:

  1. 通过 concentrator 得到 prototype(实际上是卷积得到图片特征,再把每一 way 平均,得到 $N$ 个 feature, 每个 feature 为 $m_2$,大小不重要)。
  2. projector 就先把 feature 都拼起来,得到相当于一个类别的 $Nm_2$ 个 feature,先卷积将 $Nm_2$ 降到 $m_3$,然后在这个维度上 softmax,相当于 attention 挑选这一类最重要的特征,得到一个 mask。
  3. reshaper 是把图片也搞成 mask 的长和宽,这样就可以在图上直接按位乘,提取关键特征。

这篇文章的想法其实就可以简化为,在一个 task 得到的全部特征表示($N$ 类,每类 $m_2$ 个)之间做 attention。这里其实就感觉到有点蹊跷了,如果是在 $N$ 个 proto 之间 attn,那么这就是直观地寻找 task-specific feature,但是他把所有 feature 都摊开,再 attention,这怎么能 attention 成功呢?

看到知乎上很多人对这篇文章的质疑,发现代码里,直接用了在 Imagenet 上预训练好的模型?这篇文章结果是不靠谱的。

3 TapNet [2]

这篇文章的要寻找一个映射 $M$,将类别的 reference vector $\phi_k$ 和样本经过 embedding 之后的表示 $f_\theta(\hat{x}_x)$ 通过这个映射,转换到一个 task specific 空间。这里 $\phi_k$ 是每个 task 公用的,表示里面一类的特征。怎么寻找 $M$ 呢?分成如下几步:

  1. 更新修正后的 $\phi_k$:$\tilde{\phi}_k = \phi_k – \dfrac{1}{N_c – 1}\sum_{l\ne k}\phi_l$。即用原来的类别特征,减去这个 task 的公共特征
  2. 更新 $\phi_k$ 的错误:$\epsilon_k = \dfrac{\tilde{\phi}_k}{\|\tilde{\phi}_k\|} – \dfrac{c_k}{\|c_k\|}$,
  3. 作者认为,好的度量空间应该让类别特征和 proto 在里面尽量接近,即 $\epsilon_k\rightarrow 0$,即 $M\epsilon = 0$。
  4. 怎么求这个解空间呢?作者对错误矩阵使用 SVD 分解,取右奇异矩阵的 $N_c + 1$ 到 $N_c + D$ 列,就是一个解。

整个算法流程如下图所示

这篇文章还是没太看明白,回来得看看别人复现的代码

这篇文章的笔记可以参考这里

4 ATL-Net [3]

TBD

Ref

[1] Hongyan Li, et.al, “Finding Task-Relevant Features for Few-Shot Learning by Category Traversal”, CVPR 2019 [2] Sung Whan Yoon, “TapNet: Neural Network Augmented with Task-Adaptive Projection for Few-Shot Learning”, ICML 2019 [3] Chuanqi Dong, “Learning Task-aware Local Representations for Few-shot Learning”, IJCAI 2020

Leave a Comment

电子邮件地址不会被公开。