这里是记录我参加百度飞桨的深度学习的图神经网络7日打卡训练营的一些学习心得
Paddle Graph Learning (PGL)是一个基于PaddlePaddle的高效易用的图学习框架。在最新发布的PGL中引入了异构图的支持,新增MetaPath采样支持异构图表示学习,新增异构图Message Passing机制支持基于消息传递的异构图算法,利用新增的异构图接口,能轻松搭建前沿的异构图学习算法。而且,在最新发布的PGL中,同时也增加了分布式图存储以及一些分布式图学习训练算法,例如,分布式deep walk和分布式graphsage。
高效性——支持Scatter-Gather及LodTensor消息传递
易用性——原生支持异构图
规模性——支持分布式图存储以及分布式学习算法
丰富性——覆盖业界大部分图学习网络
一、图学习初印象
图学习概述、入门路线
作业:安装环境,跑通 example 代码。
二、图游走类模型
DeepWalk、node2vec、metapath2vec、metapath2vec 变种模型
实践:DeepWalk代码解析
作业:以填空的方式完成 node2vec 模型复现
三、图神经网络算法(一)
GCN、GAT、消息传递机制
实践:GCN代码解析
作业:以填空的方式完成 GAT 模型复现
四、图神经网络算法(二)
图采样技术、图聚合技术
实践:讲解 GraphSage 代码
作业:以填空的方式完成GraphSage模型复现
五、图神经网络进阶模型讲解
ERNIESage、UniMP
实践:ERNIESage代码讲解
大作业:完成比赛
六、新冠疫苗项目拔高实战,助力疫情防控!
斯坦福CS224W课程:http://cs224w.stanford.edu
图学习库 PGL:https://github.com/PaddlePaddle/PG
Part1 什么是图
图的两个基本元素:点、边
图是一种统一描述复杂事物的语言
常见的图:社交网络、推荐系统、化学分子结构…
Part2 什么是图学习
图学习: Graph Learning。深度学习中的一个子领域,强调处理的数据对象为图。
与一般深度学习的区别:能够方便地处理不规则数据(树、图),同时也可以处理规则数据(如图像)。
Part3 图学习的应用
我们可以把图学习的应用分为节点级别任务、边级别任务、图级别任务。 课程中介绍了以下几种任务。
图游走类算法:通过在图上的游走,获得多个节点序列,再利用 Skip Gram 模型训练得到节点表示(详情点击查看)
图神经网络算法(一)(二):端到端模型,利用消息传递机制实现。(详情点击查看)
知识图谱嵌入算法:专门用于知识图谱的相关算法。(自行查阅)
本次比赛选用的数据集为arXiv论文引用网络——ogbn-arixv数据集的子集。ogbn-arixv数据集由大量的学术论文组成,论文之间的引用关系形成一张巨大的有向图,每一条有向边表示一篇论文引用另一篇论文,每一个节点提供100维简单的词向量作为节点特征。在论文引用网络中,我们已对训练集对应节点做了论文类别标注处理。本次任务希望参赛者通过已有的节点类别以及论文之间的引用关系,预测未知节点的论文类别。(比赛链接)
#主要的配置文件如下
from easydict import EasyDict as edict
config = {
"model_name": "ResGAT",
"num_layers": 3,
"dropout": 0.1,
"learning_rate": 0.001,
"weight_decay": 0.0005,
"edge_dropout": 0.00,
}
config = edict(config
模型定义文件:
class ResGAT(object):
"""Implement of ResGAT"""
def __init__(self, config, num_class):
self.num_class = num_class
self.num_layers = config.get("num_layers", 1)
self.num_heads = config.get("num_heads", 8)
self.hidden_size = config.get("hidden_size", 8)
self.feat_dropout = config.get("feat_drop", 0.6)
self.attn_dropout = config.get("attn_drop", 0.6)
self.edge_dropout = config.get("edge_dropout", 0.0)
def forward(self, graph_wrapper, feature, phase):
# feature [num_nodes, 100]
if phase == "train":
edge_dropout = self.edge_dropout
else:
edge_dropout = 0
feature = L.fc(feature, size=self.hidden_size * self.num_heads, name="init_feature")
for i in range(self.num_layers):
ngw = pgl.sample.edge_drop(graph_wrapper, edge_dropout)
res_feature = feature
# res_feature [num_nodes, hidden_size * n_heads]
feature = conv.gat(ngw,
feature,
self.hidden_size,
activation=None,
name="gat_layer_%s" % i,
num_heads=self.num_heads,
feat_drop=self.feat_dropout,
attn_drop=self.attn_dropout)
# feature [num_nodes, num_heads * hidden_size]
feature = res_feature + feature
# [num_nodes, num_heads * hidden_size] + [ num_nodes, hidden_size * n_heads]
feature = L.relu(feature)
feature = L.layer_norm(feature, name="ln_%s" % i)
ngw = pgl.sample.edge_drop(graph_wrapper, edge_dropout)
feature = conv.gat(ngw,
feature,
self.num_class,
num_heads=1,
activation=None,
feat_drop=self.feat_dropout,
attn_drop=self.attn_dropout,
name="output")
return feature
(1)、Predict then Propagate: Graph Neural Networks meet Personalized PageRank (https://arxiv.org/abs/1810.05997)
(2)、Simple and Deep Graph Convolutional Networks (https://arxiv.org/abs/2007.02133)
(3)、Masked Label Prediction: Unified Message Passing Model for Semi-Supervised Classification (https://arxiv.org/abs/2009.03509)
(4)、Combining Label Propagation and Simple Models Out-performs Graph Neural Networks (https://arxiv.org/abs/2010.13993)
(1)、模型后劲比较足,可以使用更多的epoch数,如2000
(2)、如果"edge_dropout"不为0,可能出现训练到后面Acc=0的情况
经过了这次7日打卡营的活动让我对图神经网络领域有了比较深入的了解.也希望以后可以有更多类似的机会可以学习到更多深度学习的内容,也希望飞桨可以越来越好.最后附上飞桨与PGL的github链接