论文地址:Bag of Tricks for Node Classification with Graph Neural Networks

一.概述

本文作者总结了前人关于图上半监督节点分类任务的常用Tricks,另外还提出了将节点特征和节点标签组合来进行训练和更鲁棒的损失函数,结果表明作者的设计是有效的,可供参考。

二.背景

首先给出论文的符号表:

符号 说明
G=(V,E)G=(V,E)G=(V,E) 图,V={v1,...,vN}V=\{v_1,...,v_N\}V={v1​,...,vN​}为顶点集,EEE为边集
A\bold{A}A 邻接矩阵
DDD 度矩阵(对角阵)
X=(x1,...,xN)T\bold{X}=(x_1,...,x_N)^TX=(x1​,...,xN​)T 节点特征
Y=(y1,...,yN)T∈RN×C\bold{Y}=(y_1,...,y_N)^T \in \mathbb{R}^{N \times C}Y=(y1​,...,yN​)T∈RN×C 标签矩阵(one-hot),CCC为类别数
S=D−1/2AD−1/2\bold{S} = D^{-1/2}\bold{A}D^{-1/2}S=D−1/2AD−1/2 正则化后的邻接矩阵(对称)

作者以图中前MMM个节点作为训练集。

作者将数据集分为训练集和测试集。

标签传播算法

标签传播算法(Label Propagation Algorithm, LPA)的动机是相邻的节点可能具有相似的标签。LPA通过迭代计算如下公式:
Y(k+1)=λSY(k)+(1−λ)Y(0)Y^{(k+1)}=\lambda S Y^{(k)}+(1-\lambda) Y^{(0)} Y(k+1)=λSY(k)+(1−λ)Y(0)
来求解线性系统Y∗=(1−λ)(I−λS)−1YY^{*}=(1-\lambda)(I- \lambda S)^{-1} YY∗=(1−λ)(I−λS)−1Y 。其中Y(0)Y^{(0)}Y(0)是标签矩阵,训练集中节点的标签保持不变,但测试节点的标签全部填为0。从LPA的传播公式可以看出,LPA算法没能够利用节点的特征。

图神经网络

GNNs是深度学习在图上学习的范式,其中最有名的模型之一便是GCN,其传播规则如下:
X(l+1)=σ(D−12AD−12X(l)W(l))\boldsymbol{X}^{(l+1)}=\sigma\left(D^{-\frac{1}{2}} A D^{-\frac{1}{2}} X^{(l)} W^{(l)}\right) X(l+1)=σ(D−21​AD−21​X(l)W(l))
在GCN之后,各种图卷积神经网络开始涌现。与LPA算法不同的是,在推断测试节点的标签时,GNN并不显式利用训练节点的真实标签。

标签和特征传播的组合

既然单独使用标签传播或单独使用节点特征都能取得良好的性能,那将二者进行组合是有意义的。之前也有工作在这方面进行了探索,典型的工作便是C&S,但该方法不是端到端的。

三.半监督节点分类的Tricks

3.1 已经存在的Tricks

采样(Sampling):采样技术能使得GNN往大图上扩展。

数据增强(Data Augmentation):数据增强可以用来缓解过拟合和过平滑。

重正则化(Renormalization):GCN提出来的trick,即为图节点添加自环。

残差连接(Residual Connections):在GCN的传播规则中添加线性连接,即:
X(l+1)=σ(D~−12A~D~−12X(l)W0(l)+X(l)W1(l))X^{(l+1)}=\sigma\left(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} X^{(l)} W_{0}^{(l)}+X^{(l)} W_{1}^{(l)}\right) X(l+1)=σ(D~−21​A~D~−21​X(l)W0(l)​+X(l)W1(l)​)
在这种形势下,线性分量保留了激活经过众多传播层也能区分的节点表示,使得GCN的表达能力更强并能克服过平滑问题。

3.2 新的Tricks

3.2.1 标签的使用

标签作为输入(Label as Input):作者提出了一种新的采样技术,允许GNN模型将标签信息作为输入来学习标签之间的相互关系,下图展示的是该算法训练过程的伪代码:

从伪代码中可以看出,作者将训练集拆分为了两部分Dtrain L\mathcal{D}_{\text {train }}^{L}Dtrain L​和Dtrain U\mathcal{D}_{\text {train }}^{U}Dtrain U​。然后作者将Dtrain U\mathcal{D}_{\text {train }}^{U}Dtrain U​的标签设置为0(第3行),并预测其标签。具体来说就是在训练过程中Dtrain L\mathcal{D}_{\text {train }}^{L}Dtrain L​的输入包含特征和标签,而Dtrain U\mathcal{D}_{\text {train }}^{U}Dtrain U​的输入仅包含特征,然后以此来预测Dtrain U\mathcal{D}_{\text {train }}^{U}Dtrain U​的标签,并计算loss然后通过反向传播学习GNN的参数。在最终的推断中,训练集的所有标签都将作为输入。


标签重用增强(Augmentation with Label Reuse):作者进一步提出了标签重用,具体做法是将先前迭代的预测软标签来作为输入,这种情况下Dtrain U\mathcal{D}_{\text {train }}^{U}Dtrain U​中的节点的标签将不再是零值向量,而是上一次迭代的预测结果。(对应的是算法1中的5-8行)

3.2.2 用于分类的鲁棒损失函数

对于2分类任务,常见的loss函数为logistic loss。然而,logistic loss对异常值比较敏感,而非凸损失函数可能更稳健。为此,作者考虑削弱凸性条件,从而设计准凸损失以提高鲁棒性:
ϕρ−logit⁡(v):=ρ(ϕlogit⁡(v))\phi_{\rho-\operatorname{logit}}(v):=\rho\left(\phi_{\operatorname{logit}}(v)\right) ϕρ−logit​(v):=ρ(ϕlogit​(v))
其中ρ:R+→R+\rho: \mathbb{R}^{+} \rightarrow \mathbb{R}^{+}ρ:R+→R+是非单减函数,表1总结了ρ(⋅)\rho(\cdot)ρ(⋅) 的设计。

Loge Loss是作者提出的,其中ϵ\epsilonϵ 是可调参数,在论文中固定为1−log⁡21-\log 21−log2。Loge Loss也可以扩展到多分类任务,其对应的数学形式为:
ℓlog⁡e(y^,y)=log⁡(ϵ−log⁡exp⁡(y^class )∑i=1Cexp⁡(y^i))−log⁡ϵ\ell_{\log e}(\hat{\boldsymbol{y}}, \boldsymbol{y})=\log \left(\epsilon-\log \frac{\exp \left(\hat{y}_{\text {class }}\right)}{\sum_{i=1}^{C} \exp \left(\hat{y}_{i}\right)}\right)-\log \epsilon ℓloge​(y^​,y)=log(ϵ−log∑i=1C​exp(y^​i​)exp(y^​class ​)​)−logϵ
其中 y^\hat{\boldsymbol{y}}y^​和y\boldsymbol{y}y都是one-hot向量。

3.3 Trick的应用——GAT架构的调整

作者在GAT架构中加入了Residual Connections和Renormalization,得到如下形式:
X(l+1)=σ(D~−12A~attD~−12X(l)W0(l)+X(l)W1(l))X^{(l+1)}=\sigma\left(\tilde{D}^{-\frac{1}{2}} \tilde{A}_{a t t} \tilde{D}^{-\frac{1}{2}} X^{(l)} W_{0}^{(l)}+X^{(l)} W_{1}^{(l)}\right) X(l+1)=σ(D~−21​A~att​D~−21​X(l)W0(l)​+X(l)W1(l)​)
其中Aatt=DαA_{a t t}=D \alphaAatt​=Dα,αij(l)=exp⁡(LeakyReLU⁡(aT[W(l)xi(l)∥W(l)xj(l)]))∑r∈N(vi)exp⁡(LeakyReLU⁡(aT[W(l)xi(l)∥W(l)xr(l)]))\alpha_{i j}^{(l)}=\frac{\exp \left(\operatorname{LeakyReLU}\left(\boldsymbol{a}^{T}\left[W^{(l)} x_{i}^{(l)} \| W^{(l)} x_{j}^{(l)}\right]\right)\right)}{\sum_{r \in \mathcal{N}\left(v_{i}\right)} \exp \left(\operatorname{LeakyReLU}\left(\boldsymbol{a}^{T}\left[W^{(l)} x_{i}^{(l)} \| W^{(l)} x_{r}^{(l)}\right]\right)\right)}αij(l)​=∑r∈N(vi​)​exp(LeakyReLU(aT[W(l)xi(l)​∥W(l)xr(l)​]))exp(LeakyReLU(aT[W(l)xi(l)​∥W(l)xj(l)​]))​。

作者还提出了其它变体,具体详见论文。

四.实验

数据集:Cora、Citeseer、Pubmed、ogbn-arxiv、ogbn-porteins、 ogbn-products、Reddit。数据集的特征如下所示:

表3报告了使用label as input和label reuse的性能,从结果可以看到作者设计的有效性。另外,将作者的方法与C&S结合可以进一步提升性能。

表4对比了不同损失函数的性能,实验中每个模型使用相同的超参数进行训练,仅改变损失函数。从结果可以看出作者设计的Loge Loss在大多数数据集上都表现良好。

五.结语

在本文的最后给大家安利一个开箱即用的GNN Tricks库:gtrick,里面集成了GNN的多种Tricks,还有使用示例,其安装命令为:

pip install gtrick

欢迎感兴趣的小伙伴自行探索。

《Bag of Tricks for Node Classification with Graph Neural Networks》阅读笔记相关推荐

  1. trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

    一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...

  2. VoxelNet阅读笔记

    作者:Tom Hardy Date:2020-02-11 来源:VoxelNet阅读笔记

  3. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  4. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  5. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  6. “CoreCLR is now Open Source”阅读笔记

    英文原文:CoreCLR is now Open Source 阅读笔记如下: CoreCLR是.NET Core的执行引擎,功能包括GC(Garbage Collection), JIT(将CIL代 ...

  7. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  8. 05《软件需求模式》阅读笔记

    剩下的两个阅读笔记写第二部分.各类需求模式,共八个领域和它的需求模式,这一次写前四个. 基础需求模式,它是所有种类的系统都可能需要的一些东西.系统间接口需求模式使用系统间接口需求模式定义被定义的系统和 ...

  9. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  10. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

最新文章

  1. easyui 页面加载闪现问题 解决方法
  2. 解决plt.savefig存的图是空白的
  3. 【生活】 戴尔XPS 插上耳机之后,说话没声音,麦克风失效 window10 系统
  4. 31.1 inforMATION_SCHEMA aCcess syntax
  5. Spring Enable* 注解
  6. 小米总参php面试题_php面试题之二——Javascript(基础部分)
  7. 如何扩展/删除swap分区
  8. vsto mysql_VSTO–Visio | 学步园
  9. ACL2020 | SongNet(格式可控的文本生成)
  10. 在JS中的数字存储问题
  11. java设计模式--设配器adapter
  12. 诗歌(2)—定风波(莫听)
  13. xshell 的快捷键 复制是 Ctrl+Insert,粘贴是 ShIft+Insert。刚才发现可以设置成 ctrl+C 和 ctrl+V
  14. 考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之第五课线性方程组
  15. cms可视化编辑php,AyaCMS与We7CMS可视化编辑模板功能对比
  16. FP-growth算法以及代码实现
  17. Vue中使用turf.js
  18. href与src的区别
  19. SOLIDWORKS-D:\SW\SolidWorks_Flexnet_Server/启动server_install
  20. 最流行的Android组件、工具、框架大全

热门文章

  1. 彻底删除git历史记录中的文件
  2. java常用开发286个英语单词汇总
  3. mybatis-paginator分页工具的使用简述
  4. 体系化认识微服务之三:微服务总体技术架构
  5. 全面提升体系化数据管理能力 | OceanBase 发布全新3.X工具家族
  6. 国产salesforce-------标准对象机能介绍
  7. 一切成功源于积累——20140927 认识货币——欧元
  8. 如何使excel的图表实现自动更新月和周?
  9. 微信朋友圈点赞的测试点
  10. Linux下安装Emacs