基本信息
- 标题:Prototype Propagation Networks (PPN) for Weakly-supervised Few-shot Learning on Category Graph
- 年份:2019
- 期刊:Proceedings of the Twenty-Eighth International Joint Conference on Artificial Intelligence (IJCAI-19)
- 标签:Few-shot Learning,prototype
- 数据:WS-ImageNet-Pure和WS-ImageNet-mix
创新点
引入了弱监督信息,去做Few-shot Learning。
创新点来源
针对小样本问题,元学习从不同的tasks中提取公共知识,从而快速适应新的task。然而,现有方法都没有完全探索弱监督信息(容易收集到)。
主要内容
Weakly-Supervised Few-Shot Learning
在Weakly-Supervised Few-Shot Learning中,有两类数据:被标注为fine-class的few-shot data $\cal X$和被标注为coarse-class的weakly-labeled data ${\cal X}^w$。每一个$x \in {\cal X}$被标注为fine-class label $y \in {\cal Y}$,每一个$x \in {\cal X}^w$被标注为coarse-class label $y^w \in {\cal Y}^w$。我们假设存在一个类别图表示fine classes和coarse classes之间的关系。这是一个有向无环图$({\rm DAG}) {\cal G}=({\cal Y} \cup {\cal Y}^w, E)$,其中每一个节点$y \in {\cal Y} \cup {\cal Y}^w$表示一个类别,每一条边 $z \rightarrow y \in E$表示父类$z$到子类$y$的一个连接。类别图的一个例子如下图所示,few-shot类别$\cal Y$是叶子节点,弱监督类别是few-shot类别的父节点(直接连接)和祖先节点(可到达)。如Tractor的父类是Farm Machine ,祖先包含有Farm Machine和Machine。一个孩子类能同时属于多个父类,如Organ有两个父类“Wind Instrument”和“Keyboard Instrument” 。
for Weakly-supervised Few-shot Learning on Category Graph/image-20200406112348570.png)
在Few-shot Learning设置中,从task分布中抽取训练的task,即$T \sim {\cal T}$,并且假设测试task也从相同的分布抽取。值得注意的是,用来训练的类别和用于测试的类别是不相交的子集。正如上图所示,用于训练的类别和用于测试的类别是没有重合的,但是我们允许他们分享相同的父类。由于finer-class label可以提供更多关于目标few-shot classes的信息,但是获取这些信息的成本更高,因此我们假设,当类变得更finer时,弱标记的数据量会以指数方式减少。
训练目标是“Learning to learn”的风险最小化:
其中,每一个task $T$定义在子类${\cal Y}^T \subseteq {\cal Y} \cup {\cal Y}^w$上,${\cal D}^T$是data-label pair $(x,y), y\in {\cal Y}^T$的分布。${\rm Pr}(y|x;w(T; \Theta))$ 是由模型$w(T;\Theta)$产生的task $T$ 的似然函数,其中$\Theta$是meta-learner 参数能够被从${\cal T}$生成的所有task共享。
在我们方法中,${\rm Pr}(y|x;w(T; \Theta))$ 由KNN的soft-version得到,其中$w(T; \Theta)$是task $T$ 的最近邻候选样本(即KNN的支撑集),$\Theta$ 定义为产生支撑集的机制。跟prototypical network类似,支撑集$w(T; \Theta)$由原型 $P_{ {\cal Y}^T } \overset{\Delta} = \{P_y \in {\cal R}^d:y \in {\cal Y}^T \}$组成,每一个类别$y \in {\cal Y}^T$ 对应一个原型。给定一个数据点$x$,首先计算它的表征 $f(x) \in {\cal R}^d$,其中$f(\cdot)$是CNN,参数是$\Theta ^{cnn}$,然后${\rm Pr}(y|x;w(T; \Theta)) = {\rm Pr}(y|x;P_{ {\cal Y}^T })$等于下式:
其中,$P_{ {\cal Y}^T }$为一组原型(一个类别对应一个原型),$P_y$和$P_z$为其中的一个原型。这个式子给出,当一组原型$P_{ {\cal Y}^T }$(由$w(T; \Theta)$决定如何生成)和输入$x$,那么该输入属于第$y$类的概率。
上面这段话有点绕口,感觉怎么翻译都不太对,我个人理解是$w(T; \Theta)$产生了一系列的原型$P_{ {\cal Y}^T }$。然后给定一个样本$x$,由$f(\cdot)$计算出相应的特征向量$f(x)$,利用公式(2)预测出对应的类别。
在下面,我们将介绍对于任何一个task $T \sim {\cal T}$ 如何使用prototype propagation产生$P_{ {\cal Y}^T}$。
Prototype propagation
在PPN中,每一个训练task $T$ 均是在子图${\cal G}_i \subseteq {\cal G}$上的level-wise分类任务。也就是说分类任务是定义在${\cal Y}^T={\cal Y}^{ {\cal G}_i^j}$上的,其中${\cal G}_i^j$ 是子图${\cal G}_i$的level-$j$,${\cal Y}^{ {\cal G}_i^j}$是类别${\cal G}_i^j$上的类别集合。
Prototype propagation定义在子图${\cal G}_i$上,包含的类别为${\cal Y}^{ {\cal G}_i}$。给定相应的属于第$y \in {\cal Y}^{ {\cal G}_i}$类的训练数据${\cal X}^y$,第$y$类的原型初始化为样本$x \in {\cal X}^y$的特征$f(x)$的平均值。
对于${\cal G}_i$上类别$y$的父类$z$,通过衡量$y$与$z$相似性的边权重$a(P_y^0,P_z^0)$传播$P_z^0$到类$y$。通过如下式子聚合所有来自父类的信息(从上到下一层一层的聚集)
其中, ${\cal P}_y^{ {\cal G}_i}$为$y$在子图${\cal G}_i$的所有父类。边权重$a(P_y^0,P_z^0)$是可以通过dot-product attention学习到的。
其中,$g(\cdot)$和$h(\cdot)$为应用在原型上的可学习变换,参数为$\Theta ^{att}$。例如线性变换$g(p)=W_gp$,$h(q)=W_hq$。然后最终的原型由$P_y^0$和$P_y^+$加权平均得到,权重系数$\lambda \in [0,1]$,即
对于子图${\cal G}_i$上的每一个分类task $T$,$P_y$被应用在公式(2)中产生似然概率。公式(1)中的似然最大化,旨在对$f(\cdot)$中的$\Theta ^{cnn}$和attention机制中的$\Theta ^{att}$同时进行优化。
Level-wise Training of PPN on Subgraphs
元学习的目标是学习由公式(3)-(6)定义在few-shot task上的传播机制。在每一次迭代时,随机选取few-shot classes的子集,并包含所有的父类和子图${\cal G}_i$上的边${\cal G}$。训练task $T$从每一层${\cal G}_i^j \sim {\cal G}_i$ 采样,其上的分类任务是作用在${\cal Y}^T={\cal Y}^{ {\cal G}_i^j}$上的。公式(1)中元学习可以定义为:
其中,${\cal D}^{ {\cal G}_i^j}$是类别${\cal Y}^{ {\cal G}_i^j}$上样本对$(x,y)$的数据分布。因此,在训练过程中,每个类的分类错误被反向传播到其父类的原型中,这些原型将被更新以提高finer classes的验证精度,并在之后传播以生成few-shot类的原型。因此,coarse class的weakly-labeled data将有助于叶节点类的Few-shot Learning tasks。
下面算法给出了完整的层次训练过程:
for Weakly-supervised Few-shot Learning on Category Graph/image-20200406144820241.png)
这个算法主要包含两步:
- 第9-11行的prototype propagation,它在抽样子图${\cal G}_i$的类原型之上构建计算图
- 第12-16行的level-wise training,它通过每一个level上的分类任务更新$\Theta ^{cnn}$和$\Theta ^{att}$
在prototype propagation过程中,每一个类别的prototype都聚合来自它父类prototype的信息。为了提高计算效率,我们并不会每次都初始化$P_y^0$,相反的,我们每$m$步更新一下所有类$y \in {\cal Y} \cup {\cal Y}^w$的$P_y^0$。
算法的整体流程图如下:
for Weakly-supervised Few-shot Learning on Category Graph/image-20200406152751200.png)
Meta-Test: Apply PPN to New Tasks
在测试过程中,我们有两组测试设置,区别在于测试过程中是否使用弱监督信息,即weakly-labeled数据和与新类的连接是否可见。
第一个设置:测试过程中有弱监督监督信息的模型为PPN+;第二个设置:无弱监督信息的模型为PPN。换句话说,对于PPN+模型,图3中的每一个测试类与其他类之间的边(即图3中黄色的边)是在测试过程中已知的。PPN更具有挑战性,但是能够应用在很多领域。
首先,我们需要想清楚一个问题,测试过程中叶子节点的类别的原型是不知道的。我们需要通过其与父类的连接关系、父类的原型、测试task的支撑集来完成叶子节点原型的估计。然后对于测试task中的查询集,利用公式(2)求出对应类标即可。然后我们接着讨论。
在第二个设置中,我们仍然能够利用到训练阶段获得的原型(父类以及祖先的原型),使用它们来进行测试类别的prototype propagation。特别的,对不可见测试类$y$(对应的样本为${\cal X}^y$),我们从训练过程中得到的所有原型$P_y^0$中得到最相近的$K$个,并将这$K$个原型对应的类别作为图${\cal G}$上节点$g$的父类。这些父类原型将通过目录图上的传播算法给测试类提供弱监督信息。
在两个设置中,在由$y$和它父类${\cal P}_y^{\cal G}$组成的子图应用公式(3)-(6)中的prototype propagation,产生最终的原型$P_{y}$。在应用公式时,需要知道它的父类,以及父类的原型。在PPN+中,覆盖训练类别和测试类别的分级是已知的,所以每一个测试类的的父类来自训练类或者weakly-labeled测试类。当父类$y’ \in {\cal P}_y^G$在训练类别中,则直接使用训练过程中缓存的原型$P_{y’}^0$,否则,使用公式(3) 和 属于该类$y’$的弱监督样本产生$P_{y’}^0$。在第二种设置中,连接测试类的边都是未知的,并使用KNN预测得到,我们假定$y$的所有父类均来自训练类别,直接使用训练过程中缓存的父类缓存即可。
实验结果
for Weakly-supervised Few-shot Learning on Category Graph/image-20200406161301452.png)
for Weakly-supervised Few-shot Learning on Category Graph/image-20200406161312334.png)
for Weakly-supervised Few-shot Learning on Category Graph/image-20200406161326983.png)
缺点
需要弱监督信息,对于一般的任务不是很通用。