图神经网络09-经典GCN论文解读与代码复现

技术

论文名称:SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS

1 论文简介

picture.image

图半监督分类问题:只有一小部分或者节点的子集存在标签,比如通过引用构建构建的文献分类,这种问题我们可以定义为基于图的半监督学习。

传统做法基本为图的正则化处理,比如 Laplacian regularization ,损失函数形式如下:

picture.image

picture.image

Eq 1 假设图中具有连接边的节点标签是一样的,这种假设一定程度上限制了模型。

2 FAST APPROXIMATE CONVOLUTIONS ON GRAPHS

picture.image

reference:zhangxwww.github.io/pos

本文提出了layer-wise propagation (也就是layer by layer training)的GCN:

picture.image

其中,:

(1) picture.image 是一个可训练的参数矩阵;

(2) picture.image

(3) picture.image

图上的spectral convolutions 被定义为输入 picture.image 傅里叶变换的乘积:

picture.image

其中 picture.image 。由于计算矩阵特征分解复杂度非常高,作者借助切比雪夫多项式进行近似:

picture.image

其中 picture.image ,为切比雪夫多项式的系数。

切比雪夫多项式定义为:

picture.image

考虑到 picture.image ,有:

picture.image

其中 picture.image

这就是原式的K阶近似,只考虑到了每个结点的K阶邻点。本文令 picture.image

同时,作者将 picture.image ,这个近似是因为作者认为网络可以通过学到的scale适应这个变化。这样就得到了下面的式子:

picture.image

更进一步令 picture.image ,有:

picture.image

注意到 picture.image 内,对于深度网络来说可能会发生梯度消失/爆炸的情况。作者介绍了一个trick,来避免这种情况的发生:

picture.image

其中 picture.image

因此通过下式就可以将C个通道的输入 picture.image 转化为F维的输出:

picture.image

其中 picture.image

3 SEMI-SUPERVISED NODE CLASSIFICATION

picture.image

模型定义为以下形式:

picture.image

计算所有带有标签的样本的交叉熵:

picture.image

4 实验结果

picture.image

数据集:

picture.image

实验结果:

picture.image

我们可以看到GCN比传统的节点分类算法(例如DeepWalk)效果高出了好多。

Pytorch实现:github.com/tkipf/pygcn

Tensorflow实现:github.com/tkipf/gcn

5 代码实现

GCN 层的实现:


            
  **import**  math  **import**  torch  **from**  torch.nn.parameter   **import**  Parameter  **from**  torch.nn.modules.module   **import**  Module  **class**    **GraphConvolution** (Module):  
    """    Simple GCN layer, similar to https://arxiv.org/abs/1609.02907    """  
  
      **def**  __init__(self, in_features, out_features, bias  **=** True):  
        super(GraphConvolution, self)  **.** __init__()  
        self  **.** in_features   **=**  in_features  
        self  **.** out_features   **=**  out_features  
        self  **.** weight   **=**  Parameter(torch  **.** FloatTensor(in_features, out_features))  
          **if**  bias:  
            self  **.** bias   **=**  Parameter(torch  **.** FloatTensor(out_features))  
          **else** :  
            self  **.** register_parameter('bias', None)  
        self  **.** reset_parameters()  
  
      **def**    **reset\_parameters** (self):  
        stdv   **=**  1.   **/**  math  **.** sqrt(self  **.** weight  **.** size(1))  
        self  **.** weight  **.** data  **.** uniform_(  **-** stdv, stdv)  
          **if**  self  **.** bias   **is**    **not**  None:  
            self  **.** bias  **.** data  **.** uniform_(  **-** stdv, stdv)  
  
      **def**    **forward** (self, input, adj):  
        support   **=**  torch  **.** mm(input, self  **.** weight)  
        output   **=**  torch  **.** spmm(adj, support)  
          **if**  self  **.** bias   **is**    **not**  None:  
              **return**  output   **+**  self  **.** bias  
          **else** :  
              **return**  output  
  
      **def**  __repr__(self):  
          **return**  self  **.** __class__  **.** __name__   **+**  ' (' \                 **+**  str(self  **.** in_features)   **+**  ' -> ' \                 **+**  str(self  **.** out_features)   **+**  ')'
        

两层GCN模型的实现


            
import torch.nn as nn  
import torch.nn.functional as F  
from pygcn.layers import GraphConvolution  
  
  
class GCN(nn.Module):  
    def __init__(self, nfeat, nhid, nclass, dropout):  
        super(GCN, self).__init__()  
  
        self.gc1 = GraphConvolution(nfeat, nhid)  
        self.gc2 = GraphConvolution(nhid, nclass)  
        self.dropout = dropout  
  
    def forward(self, x, adj):  
        x = F.relu(self.gc1(x, adj))  
        x = F.dropout(x, self.dropout, training=self.training)  
        x = self.gc2(x, adj)  
        return F.log_softmax(x, dim=1)
        

完成训练代码以及数据集下载可以参考Pytorch实现:github.com/tkipf/pygcn

6 参考文献

picture.image

picture.image

提示:点击“阅读原文”获取所有连接内容

大家加左图进入微信群;右图有QQ学习交流群

picture.image

picture.image

picture.image

发现“在看”和“赞”了吗,戳我试试吧

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
基于 Ray 的大模型离线推理
大模型离线推理,是指在具有数十亿或数万亿参数的大规模模型上进行分布式推理的过程。相较于常规模型推理,在模型切分、数据处理和数据流、提升 GPU 利用率方面面临了很大挑战。本次分享将介绍如何利用 Ray 及云原生优势助力大模型离线推理。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论