[2018][ICLR]FEW-SHOT LEARNING WITH GRAPH NEURAL NETWORKS 论文笔记

code https://github.com/vgsatorras/few-shot-gnn.git

paper  https://arxiv.org/pdf/1711.04043.pdf

论文的原理可以直接看论文或者博客,这里主要记录论文中一些含糊的细节

setting

    分为 few-shot setting,semi-supervised setting 和 active learning setting

    few-shot setting 就是数据都是有 label 的,而 semi-supervised setting 就是部分有,部分没有(可以设定每个训练样本,也就是一个图多少个没有label),而active learning setting 也是部分有部分没有,只不过在中间可以询问一个unlabel 数据的真实label(代码这个通过两个卷积层来选择哪个数据)。

但是我觉得这个semi-supervised的setting没有什么意义,因为每次都是从抽取的n_way个类中抽取unlabel数据,真实情况的unlabel你根本不知道哪个类别,怎么知道属于不属于这n_way个类。active learning setting也一样。

基本思想

        目标是将标签信息从有监督样本上传播到的无标签的query数据上。这种信息传递方式可以被规范化为一种图模型预测值到标签值之间的后验推理。

数据特征的表示

     图的顶点是以 [label, image_embedding] 表示成一个向量,label 是 one hot 形式,image_embedding 是图片经过一个卷积神经网络提取的特征(代码中的Embedding网络)。对于unlabel数据,label是用全零填充(文章中是说是用单纯形上均匀采样代替,不过代码中不是这么写的)。

    所以一个 batch 的大小是 [batch_size, (n_way * n_shot + 1), image_channel, image_h, image_w],每个样本是一个图,包含  n_way * n_shot 个supported 样本,和一个 query 样本(代码中将这个样本放在最前,label 设为全 0)。

[2018][ICLR]FEW-SHOT LEARNING WITH GRAPH NEURAL NETWORKS 论文笔记

计算流程

  • 先数load一个batch的数据,然后通过一个embedding网络,变成 [batch_size, (n_way * n_shot + 1), embed_size]的数据。
  • 然后经过一个网络计算变换一系列A (num_operator个变换矩阵,laplace变换就计算laplace矩阵,J2就再增加一个恒等变换)

[2018][ICLR]FEW-SHOT LEARNING WITH GRAPH NEURAL NETWORKS 论文笔记

  • 由上面公式计算出一系列变换矩阵后(可能只有一个),将数据和变换传给Graph Conv,Gc将这些变换作用于embedding后再经过一个全连接层和leaky_relu产生新的embedding(代码中是将它拼接在原embedding后),重复几次这样的过程(几个不同的变换计算网络和Graph Conv),如下图所示:

                     

[2018][ICLR]FEW-SHOT LEARNING WITH GRAPH NEURAL NETWORKS 论文笔记

[2018][ICLR]FEW-SHOT LEARNING WITH GRAPH NEURAL NETWORKS 论文笔记

图中进行两次变换的计算,经过两个Graph Conv网络(代码中默认是三次)。

最后得到一个输出,取每个样本的query数据的输出跟真实的label计算一个loss,反向传播。

 

补充

active learning setup中一点不同就是需要查询一个unlabel数据的标签。做法是在整个网络的中间补上label,比如上面在第二个Graph Conv后面。 选取的方法是在加一个attention,也就是经过softmax后用一个多项式分布采样。

 

其他细节可看代码。

文章方法主要就是用了图网络,没有什么特别的地方,效果比不上后来的方法。方法仅供参考