基于飞桨复现ICML顶会模型SGC,可实现超快速网络收敛

绮霰
• 阅读 909

【飞桨开发者说】尹梓琦,北京理工大学在读本科生,关注图深度学习,图挖掘算法和谱图理论

基于飞桨复现ICML顶会模型SGC,可实现超快速网络收敛

随着深度学习在欧几里得空间的成功应用,例如CNN,RNN等极大的提高了图像分类,序列预测等任务的效果,近期来图神经网路也开始蓬勃发展。图神经网络分为谱域和空域两大种类,谱域通过拉普拉斯算子对于图进行类微分处理,而空域通过信息传递的方式更新节点的embedding,均可以大幅度提高节点预测,链接预测,不规则图形分类等问题的效果。

在大规模图数据上训练图神经网络是一个大问题,计算代价过大,内存消耗过高均是制约图神经网络在大图训练的因素。而近期来,加速图训练、优化内存的论文不断出现。以GraphSage,FastGCN,VR-GCN,GraphSaint,Cluster-GCN,L-GCN,L2-GCN等系列模型被提出,并且得到了令人瞩目的结果。美中不足的是,他们仍然没有做到亿级别数据的训练,最大的数据集不过是百万节点,如果在亿级别数据上进行训练,时间和空间复杂度都会是一个极大的考验。

SGC-Simplifying graph convolutional network 成为了最合适的替代品,在当今大图计算仍然没有一个最优且快的model的时候,在效果上退而求其次是不可避免的。SGC在训练效果上和原始GCN持平,但是在速度上有这不可比拟的优势,而且空间复杂度极小,具有在大图上训练的潜力。

本文使用了飞桨图学习框架PGL,同时调用了多个Paddle API,包括全连接层和数据读入以及优化函数。Paddle的优化函数具有出色的性能,加快了训练速度,使得训练效果有了良好的表现。首先非常推荐在AI Studio上面直接进行复现,AI Studio是一个很出色的平台,同时对于优质作者有很强的算力支持,笔者是直接在AI Studio上面编辑复现的。当然,PGL也可以部署到本地,有意向在本地运行PGL的可以查询PGL在github上的官网,从而实现本地部署。PGL的两个特点在于高速性和模块性,你可以很快的调动许多已有的module,而不需要底层实现,就可以完成一些论文的复现。

复现实现的难点往往在于特征的预处理,对于没有预处理的特征,直接上模型可能效果非常的差,甚至不如多层感知机,但是在预处理之后,往往能够达到论文的精确度和速度,笔者在复现的时候尝试过直接把存入的data输入至模型,但是效果非常差,大概只有50%左右的ACC,不如多层感知机。但是在经过一系列预处理后,可以直接复现论文水平。

本模型的特点在于模型简单,速度快,但精确度只是略好于多层感知机,稍逊于其他模型。但是在工业应用上,已经拥有了极高的价值。这里我们其实并没有调用PGL的库函数,例如GCN等。因为我们的模型很简单,并不需要调用已有模型,同时已有模型由于兼容性等原因会降低速度,所以我主要应用的是Paddle里面的nn.fc和decay_adam优化器,前者是全连接层,后者是有衰减值的adam优化器。笔者认为这两个函数,尤其是后者大大加速了训练。其次我们还使用了PGL的图训练框架来加速训练,也达到了很好的效果。笔者认为,上面三个函数是PGL+Paddle模型远远快于Pytorch的原因。

论文模型理解

-

在原始GCN上被分为多步完成的图卷积操作SGC通过一步就完成,同时得到了相同的效果,可以看出其优势。

基于飞桨复现ICML顶会模型SGC,可实现超快速网络收敛

SGC最大的创新在于省去了激活函数,从而使得多个参数合成一个,减小了时间复杂度和空间复杂度。

基于飞桨复现ICML顶会模型SGC,可实现超快速网络收敛

论文模型复现过程

首先在AI Studio上安装PGL库函数和cython:

1.  !pip install pgl  
    
2.  !pip install cython 

这里对feature和adj矩阵都准备进行预处理,feature对行上进行归一化处理,adj通过degree准备进行normalization:

1.  import scipy.sparse as sp  
    

3.  degree=dataset.graph.indegree()  
    
4.  norm = np.zeros_like(degree, dtype="float32")  
    
5.  norm[degree > 0] = np.power(degree[degree > 0],-1.0)  
    
6.  dataset.graph.node_feat["norm"] = np.expand_dims(norm, -1)  
    
7.  def row_normalize(mx):  
    
8.      """Row-normalize sparse matrix"""  
    
9.      rowsum = np.array(mx.sum(1))  
    
10.      r_inv = np.power(rowsum, -1).flatten()  
    
11.      r_inv[np.isinf(r_inv)] = 0.  
    
12.      r_mat_inv = sp.diags(r_inv)  
    
13.      mx = r_mat_inv.dot(mx)  
    
14.      return mx  
    
15.  def aug_normalized_adjacency(adj):  
    
16.      adj = adj + sp.eye(adj.shape[0])  
    
17.      adj = sp.coo_matrix(adj)  
    
18.      row_sum = np.array(adj.sum(1))  
    
19.      d_inv_sqrt = np.power(row_sum, -0.5).flatten()  
    
20.      d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0.  
    
21.      d_mat_inv_sqrt = sp.diags(d_inv_sqrt)  
    
22.      return d_mat_inv_sqrt.dot(adj).dot(d_mat_inv_sqrt).tocoo() 

通过之前的到的信息,对于feature和adj进行归一化处理:

基于飞桨复现ICML顶会模型SGC,可实现超快速网络收敛

邻接矩阵的归一化方程:

1.  def pre_sgc(dataset,feature,norm=None):  
    
2.     """ 
    
3.   Implementation of Simplifying graph convolutional networks (SGC) 
    
4.   This is an implementation of the paper SEMI-SUPERVISED CLASSIFICATION 
    
5.   WITH Simplifying graph convolutional networks (https://arxiv.org/abs/1902.07153). 
    
6.   Args: 
    
7.   gw: Graph wrapper object (:code:`StaticGraphWrapper` or :code:`GraphWrapper`) 
    
8.   feature: A tensor with shape (num_nodes, feature_size). 
    
9.   output: The output size for sgc. 
    
10.   activation: The activation for the output 
    
11.   name: Gcn layer names. 
    
12.   norm: If :code:`norm` is not None, then the feature will be normalized. Norm must 
    
13.   be tensor with shape (num_nodes,) and dtype float32. 
    
14.   Return: 
    
15.   A tensor with shape (num_nodes, hidden_size) 
    
16.   """  
    
17.     num_nodes=np.shape(feature)[0]  
    
18.     adj=np.zeros((num_nodes,num_nodes))  
    
19.     #print(np.shape(dataset.graph.edges)) 
    
20.     for u in range(len(dataset.graph.edges)):  
    
21.         adj[dataset.graph.edges[u][0],dataset.graph.edges[u][1]]=adj[dataset.graph.edges[u][1],dataset.graph.edges[u][0]]=1  
    
22.     feature=dataset.graph.node_feat['words']  
    
23.     feature=row_normalize(feature)  
    
24.     if norm==True:  
    
25.         adj=aug_normalized_adjacency(adj)  
    
26.     for i in range(args.degree):  
    
27.         feature=adj.dot(feature)  
    
28.     return feature 

得到预处理的图算子:

基于飞桨复现ICML顶会模型SGC,可实现超快速网络收敛

这里的K我们在args中设置,degree为2。进行训练并且得到结果,红色是train而绿色是validation:

基于飞桨复现ICML顶会模型SGC,可实现超快速网络收敛

我们对比Pytorch的官方复现,要达到同样的效果,Pytorch需要100-150轮训练,我们利用PGL和Paddle可以在50轮甚至30轮达到收敛,速度极快!

正如之前开头所说的那样,我们需要的其实是工业应用图神经网络,而时间复杂度和空间复杂度往往是我们重点考虑的,Paddle在速度上的高效是其作为深度学习平台的优点,同时他的接口也是简单易懂,所以才可以迅速并简单的复现一篇论文。

到这里使用PGL+Paddle复现论文就结束了,最后给出论文地址:

https://arxiv.org/pdf/1902.07...

点赞
收藏
评论区
推荐文章
深度学习技术开发与应用
关键点1.强化学习的发展历程2.马尔可夫决策过程3.动态规划4.无模型预测学习5.无模型控制学习6.价值函数逼近7.策略梯度方法8.深度强化学习DQN算法系列9.深度策略梯度DDPG,PPO等第一天9:0012:0014:0017:00一、强化学习概述1.强化学习介绍2.强化学习与其它机器学习的不同3.强化学习发展历史4.强化学习典
Wesley13 Wesley13
3年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Wesley13 Wesley13
3年前
PPDB——飞桨开发者技术小白
PPDE——飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者技术专家,是飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者技术专家的荣誉认证体系,由飞桨(https://www.oschina.net/action/visit/a
Stella981 Stella981
3年前
AI Studio过于靠谱,真香啊,快来学习飞桨吧
还在犹豫要不要学习飞桨(https://www.oschina.net/action/visit/ad?id1185)吗?关注公众号:飞桨(https://www.oschina.net/action/visit/ad?id1185)PPDB,和我们一起学习飞桨(https://www.oschina.net/action/visit
Stella981 Stella981
3年前
CPU推理性能提高数十倍,旷视天元计算图、MatMul优化深度解读
  机器之心发布  机器之心编辑部  !(http://dingyue.ws.126.net/2020/0806/6a6e4896j00qemtzy001ad000p000aop.jpg)本文针对旷视天元深度学习框架在推理优化过程中所涉及的计算图优化与MatMul优化进行深度解读。  背景及引言  在深度学
卷积神经网络模型发展及应用
卷积神经网络模型发展及应用转载地址:http://fcst.ceaj.org/CN/abstract/abstract2521.shtml深度学习是机器学习和人工智能研究的最新趋势,作为一个十余年来快速发展的崭新领域,越来越受到研究者的关注。卷积神经网络(CNN)模型是深度学习模型中最重要的一种经典结构,其性能在近年来深度学习任务上逐步提高。由于可以自动学
深度学习与图神经网络研修
深度学习与图神经网络研修时间2022年10月13日—2022年10月17日直播特色:1、采用深入浅出的方法,结合实例并配以大量代码练习,重点讲解深度学习框架模型、科学算法、训练过程技巧。2、能够把握深度学习的技术发展趋势,可以熟练掌握深度学习核心技术、实践技巧,同时针对工作中存在的疑难问题进行分析讲解和专题讨论,有效的提升学员解决复杂问题的能力;3
深度学习与图神经网络学习分享:CNN经典网络之-ResNet
深度学习与图神经网络学习分享:CNN经典网络之ResNetresnet又叫深度残差网络图像识别准确率很高,主要作者是国人哦深度网络的退化问题深度网络难以训练,梯度消失,梯度爆炸,老生常谈,不多说!深度网络的退化问题(htt
晴雯 晴雯
2年前
PyCharm CE 的安装与使用
是一个python库,也是一个基于python的深度学习框架。它由清华大学计算机系教授、博士生导师胡浩老师开发。它支持多线程,采用了并行计算的技术,实现了深度学习算法的加速。另外,它支持基于图的模型,并在此基础上提供了多种模型库和数据集。首先,我们需要准备
绮霰
绮霰
Lv1
醉卧沙场君莫笑,古来征战几人回?
文章
5
粉丝
0
获赞
0