GNN学习 GNN增强和训练

GNN学习 GNN增强和训练

1.图增强

分为结构增强和特征增强

原始的图数据可能并不适合直接用于GNN

特征层面:

  • 输入图可能缺少特征

结构层面:

  • 图过于稀疏,导致信息传递效率低
  • 图过于稠密,导致信息传递代价太高
  • 图可能太大,导致GPU装不下

输入图很难是恰好适宜embedding的最优计算图

图增强方法

图特征增强

  • 缺少图特征,就进行特征增强

图结构增强

  • 图过于稀疏:增加虚拟节点或边
  • 图过于稠密:在信息传递时抽样邻居
  • 图太大:在计算embedding时抽样子图

图特征增强

存在的问题:

输入的图不含有节点的特征

解决方法

1.constant

我们可以给每个节点分配常数特征

2.onehot

给每个节点分配唯一的ID,将ID转换为独热编码向量的形式

为什么需要特征增强·

因为GNN很难学到特定图结构的问题

常见的节点特征有:

  • 节点度数
  • 聚集系数
  • PageRank
  • 中心性

图结构增强

1.添加虚拟节点或虚拟边

为了增强稀疏图

1.添加虚拟边

例子:在二部图的两跳就能达到节点添加虚拟边

一个好处就是在由作者-论文组成的二部图中,可以增加合作作者已经同作者论文之间的连接

2.添加虚拟节点

可以添加一个虚拟节点,这个虚拟节点与图上所有节点连接,这样会导致所有节点的最长距离变成2,这样稀疏图上的信息传递的速度就能大幅提升

2.对邻居节点采样

也就是在传递信息时,不使用一个节点的全部邻居,而改为抽样一部分邻居,缺点是可能会损失一些重要信息,不过我们可以每次抽样不同的邻居来增强模型的健壮性

2.GNN训练

GNN训练的主要流程:

输入图->用GNN训练->得到节点的embedding->Prediction head->得到最终的预测

pCLRiLD.png

Prediction Head

prediction head有不同的粒度

  • 节点级别
  • 边级别
  • 图级别

节点级别

可以直接用节点嵌入来进行预测

假设我们最后得到的节点嵌入是d维的,我们需要做k维的预测

  • 分类:在k个类别里面做分类
  • 回归:在k个目标里做回归

\(\hat{y_v}=Head_{node}(h_v^L)=W^Hh_v^L\)

\(W_H\in \mathbb{R}^{k*d}, h_v^L \in \mathbb{R^d}\)以及\(\hat{y_v}\in\mathbb{R}^k\)

边级别

也是用节点嵌入来进行预测

假设也是进行k路预测

\(\hat{y}_{uv}=Head_{edge}(h_u^L,h_v^L)\)

那么这个Head该怎么选呢

1.采用连接层和线性层

\(\hat{y}_{uv}=Linear(Concat(h_u^L,h_v^L))\)

Linear层可以将2d维的embedding映射到k维的embedding

2.采用点积

\(\hat{y}_{uv}=(h_u^L)^Th_v^L\)

不过这个只适用于1路预测

如果想要做k路预测,我们可以对其进行扩展

pCLfJx0.png

图级别

假设进行k路预测

\(\hat{y}_{G}=Head_{graph}(\{h_v^l\in \mathbb{R}^d,\forall v\in G\})\)

Head跟AGG很相似,可以是Mean,Max或者Sum

如果想要比较不同大小的图,Mean方法可能会比较好

如果关心图的大小等信息,Sum方法可能会比较好

但是在大图上采用Global Pooling方法会有信息丢失的问题

为了解决这个问题,我们采用分层(hierarchical)的global pooling

分层的聚合所有节点的embedding

预测结果和标签

ground-truth的来源

  • 有监督问题的标签
  • 无监督问题的信号

有监督学习:直接给出标签

无监督学习:使用图自身的信号

但是有时候这两种的分别比较模糊,无监督学习任务中也有你有有监督的任务,比如训练GNN预测节点的cluster coefficient

有监督学习

节点标签:比如论文属于哪一个学科

边标签:比如交易是否有欺诈行为

图标签:分子是药的概率

建议无监督学习任务归类到这三种粒度下的标签预测任务,比如聚类可以看作节点粒度上的节点属于哪一类的预测任务

无监督学习

没有外部标签时,用图自身的信号来作为有监督学习的标签

节点级别:计算节点的一些统计量,cluster coefficient,PageRank等

边级别:预测两个节点之间是否有边

图级别:计算图统计量,比如预测两个图是否同构

一些评价指标:

Accuracy:

\(\frac{TP+TN}{|Dataset|}\)

Precision:

\(\frac{TP}{TP+FP}\)

Recall:

\(\frac{TP}{TP+FN}\)

F1-score:

\(2*\frac{P*R}{P+R}\)

也就是P和R的调和平均数

ROC Curve

就是TPR和FPR之间的权衡

TPR=Recall

FPR=\(\frac{FP}{FP+TN}\)

AUC就是ROC曲线下的面积

AUC越大越好,AUC=0.5说明是随机分类器,1是完美分类器

训练的一些细节

测试集的划分方式需要注意

图神经网络数据集比较特殊,因为每一个数据点是一个节点,数据点不是独立的

解决方法:

1. Transductive setting

输入的图在所有划分中都可见,只是切分节点的标签

也就是在计算embedding时使用整个图,在训练的时候使用节点1,2的标签

2. inductive setting

去掉划分的数据集之间的连接,得到许多互相无关的图,这样不同划分之间的节点就不会互相影响

区别和联系

transductive setting

  • 测试集,训练集和验证集都在同一张图上
  • 全图在所有划分中可见
  • 适用于节点和边预测任务

inductive setting

  • 测试集,训练集和验证集都在不同的图上,整个数据集由多个图构成
  • 每个划分只能看到划分内的图,最后的模
  • 型可以泛化到没见过的图上
  • 适用于节点,边和图预测任务

三种不同任务

1.节点分类任务

一个看到全图结构,一个需要切分图

2.图预测任务

只适用于inductive setting,将不同的图划分到不同的split中

3.连接预测任务

是一个无监督任务,需要自行建立标签,自主切分数据集

切分数据集时需要切两次

第一步需要将边分为信息传递边(message edges)和要预测的边(supervision edges),将数据给GNN时只留下信息传递边

第二步才切分数据集

选择一:Inductive link prediction split

每种图都有两种边,message edges和supervision edges

pCOUd2j.png

选择二:transductive link prediction split

在一张图上进行切分

在训练时留出验证集和测试集的边

在训练时也要留出supervision edges

在训练时,用training message edges来预测training supervision edges

在验证时,用training message edges和training supervision edges来预测validation edges

在测试时,用training message edges,training supervision edges和validation edges来预测test edges

pCOUWRJ.png

总的来说,这个划分是划分出了四种边

  • training message edges
  • training supervision edges
  • validation edges
  • test edges
posted @ 2023-07-24 10:06  ANewPro  阅读(182)  评论(0编辑  收藏  举报