GNN图神经网络详述-02

本文做为第2部分,主要根据原始论文介绍几篇基础的工做,主要包括GNN,GCN及变体,DCNN,Tree-LSTM,包括模型的详解和模型训练,以及模型评价。html

1. The Graph Neural Network Model

这篇论文是第一个提出Graph Neural Network模型的论文,它将神经网络使用在图结构数据上,并细述了神经网络模型告终构组成、计算方法、优化算法、流程实现等等。论文后面还对模型的复杂度进行了评估,以及在现实任务上进行了实验和比较(比较算法为NL、L、FNN)。该报告暂时主要关注模型设计部分和实验结果部分,忽略复杂性评估部分node

图领域应用

对于图领域问题,假设函数 τ \tau 是将一个图 G G 和图中的一个节点 n n 转化为一个实值向量的函数
τ ( G , n ) R m \tau(G,n)\in{R^m} 那么监督学习的任务就在于从已知样本中学习获得这样的函数。python

图领域的应用主要能够分为两种类型:专一于图的应用(graph-focused)和专一于节点的应用(node-focused)。对于graph-focused的应用,函数 τ \tau 和具体的节点无关,(即 τ ( G ) \tau(G) ),训练时,在一个图的数据集中进行分类或回归。对于node-focused的应用, τ \tau 函数依赖于具体的节点 n n ,即 τ ( G , n ) \tau(G,n) ,以下:
在这里插入图片描述web

  • (a) 是一个化学分子结构,可以使用图 G G 进行表示,函数 τ ( G ) \tau(G) 可能用于估计这种化学分子对人体有害的几率,所以,咱们并不关注分子中具体的原子(至关于节点),因此属于graph-focused应用。
  • (b) 是一张城堡的图片,图片中的每一种结构都由节点表示,函数 τ ( G , n ) \tau(G,n) 可能用于预测每个节点是否属于城堡(图中的黑点)。这种类型属于node-focused应用。

GNN模型详述

GNN模型基于信息传播机制,每个节点经过相互交换信息来更新本身的节点状态,直到达到某一个稳定值,GNN的输出就是在每一个节点处,根据当前节点状态分别计算输出。算法

有以下定义:json

  • 一个图 G G 表示为一对 ( N , E ) (\boldsymbol{N}, \boldsymbol{E}) ,其中, N \boldsymbol{N} 表示节点集合, E \boldsymbol{E} 表示边集。网络

  • n e [ n ] ne[n] 表示节点 n n 的邻居节点集合app

  • c o [ n ] co[n] 表示以 n n 节点为顶点的全部边集合框架

  • l n R l N \boldsymbol{l}_{n} \in \mathbb{R}^{l_{N}} 表示节点 n n 的特征向量ide

  • l ( n 1 , n 2 ) R l E \boldsymbol{l}_{\left(n_{1}, n_{2}\right)} \in \mathbb{R}^{l_{E}} 表示边 ( n 1 , n 2 ) (n_1,n_2) 的特征向量

  • l \boldsymbol{l} 表示全部特征向量叠在一块儿的向量

:原论文里面 l \boldsymbol{l} 表示label,但论文中的label指的是features of objects related to nodes and features of the relationships between the objects,也就是相关特征,因此这里一概使用特征向量翻译。

论文将图分为positional graph和nonpositional graph,对于positional graph,对于每个节点 n n ,都会给该节点的邻居节点 u u 赋予一个position值 ν n ( u ) \nu_{n}(u) ,该函数称为injective function, ν n : n e [ n ] { 1 , N } \nu_{n} : \mathrm{ne}[n] \rightarrow\{1, \ldots|\mathbf{N}|\}

假设存在一个图-节点对的集合 D = G × N \mathcal{D}=\mathcal{G} \times \mathcal{N} G \mathcal{G} 表示图的集合, N \mathcal{N} 表示节点集合,图领域问题能够表示成一个有以下数据集的监督学习框架
L = { ( G i , n i , j , t i , j ) G i = ( N i , E i ) G ; n i , j N i ; t i , j R m , 1 i p , 1 j q i } \mathcal{L}=\left\{\left(\boldsymbol{G}_{i}, n_{i, j}, \boldsymbol{t}_{i, j}\right)| \boldsymbol{G}_{i}=\left(\boldsymbol{N}_{i}, \boldsymbol{E}_{i}\right) \in \mathcal{G}\right.;n_{i, j} \in \boldsymbol{N}_{i} ; \boldsymbol{t}_{i, j} \in \mathbb{R}^{m}, 1 \leq i \leq p, 1 \leq j \leq q_{i} \} 其中, n i , j N i n_{i, j} \in \boldsymbol{N}_{i} 表示集合 N i N \boldsymbol{N}_{i} \in \mathcal{N} 中的第 j j 个节点, t i , j \boldsymbol{t}_{i, j} 表示节点 n i j n_{ij} 的指望目标(即标签)。

节点 n n 的状态用 x n R s \boldsymbol{x}_{n} \in \mathbb{R}^{s} 表示,该节点的输出用 o n \boldsymbol{o}_{\boldsymbol{n}} 表示, f w f_{\boldsymbol{w}} local transition function g w g_{\boldsymbol{w}} local output function,那么 x n \boldsymbol{x}_{n} o n \boldsymbol{o}_{\boldsymbol{n}} 的更新方式以下
x n = f w ( l n , l c o [ n ] , x n e [ n ] , l n e [ n ] ) o n = g w ( x n , l n ) \begin{array}{l}{\boldsymbol{x}_{n}=f_{\boldsymbol{w}}\left(\boldsymbol{l}_{n}, \boldsymbol{l}_{\mathrm{co}[n]}, \boldsymbol{x}_{\mathrm{ne}[n]}, \boldsymbol{l}_{\mathrm{ne}\left[n\right]}\right)} \\ {\boldsymbol{o}_{n}=g_{\boldsymbol{w}}\left(\boldsymbol{x}_{n}, \boldsymbol{l}_{n}\right)}\end{array} 其中, l n , l co [ n ] , x n e [ n ] , l n e [ n ] \boldsymbol{l}_{n}, \boldsymbol{l}_{\operatorname{co}[n]}, \boldsymbol{x}_{\mathrm{ne}[n]}, \boldsymbol{l}_{\mathrm{ne}[n]} 分别表示节点 n n 的特征向量、与节点 n n 相连的边的特征向量、节点 n n 邻居节点的状态向量、节点 n n 邻居节点的特征向量。

假设 x , o , l , l N \boldsymbol{x}, \boldsymbol{o}, \boldsymbol{l}, \boldsymbol{l}_{N} 分别为全部的状态、全部的输出、全部的特征向量、全部节点的特征向量的叠加起来的向量,那么上面函数能够写成以下形式
x = F w ( x , l ) o = G w ( x , l N ) \begin{array}{l}{\boldsymbol{x}=F_{\boldsymbol{w}}(\boldsymbol{x}, \boldsymbol{l})} \\ {\boldsymbol{o}=\boldsymbol{G}_{\boldsymbol{w}}\left(\boldsymbol{x}, \boldsymbol{l}_{\boldsymbol{N}}\right)}\end{array} 其中, F w F_{\boldsymbol{w}} global transition function G w G_{\boldsymbol{w}} global output function,分别是 f w f_{\boldsymbol{w}} g w g_{\boldsymbol{w}} 的叠加形式。

根据Banach的不动点理论,假设 F w F_{\boldsymbol{w}} 是一个压缩映射函数,那么式子有惟一不动点解,并且能够经过迭代方式逼近该不动点
x ( t + 1 ) = F w ( x ( t ) , l ) \boldsymbol{x}(t+1)=F_{\boldsymbol{w}}(\boldsymbol{x}(t), \boldsymbol{l}) 其中, x ( t ) \boldsymbol{x}(t) 表示 x \boldsymbol{x} 在第 t t 个迭代时刻的值,对于任意初值,迭代的偏差是以指数速度减少的,使用迭代的形式写出状态和输出的更新表达式为
x n ( t + 1 ) = f w ( l n , l c o [ n ] , x n e [ n ] ( t ) , l n e [ n ] ) o n ( t ) = g w ( x n ( t ) , l n ) , n N \begin{aligned} \boldsymbol{x}_{n}(t+1) &=f_{\boldsymbol{w}}\left(\boldsymbol{l}_{n}, \boldsymbol{l}_{\mathrm{co}[n]}, \boldsymbol{x}_{\mathrm{ne}[n]}(t), \boldsymbol{l}_{\mathrm{ne}[n]}\right) \\ \boldsymbol{o}_{n}(t) &=g_{\boldsymbol{w}}\left(\boldsymbol{x}_{n}(t), \boldsymbol{l}_{n}\right), \quad n \in \boldsymbol{N} \end{aligned} GNN的信息传播流图以及等效的网络结构以下图所示

在这里插入图片描述根据上图所示,顶端的图是原始的Graph,中间的图表示状态向量和输出向量的计算流图,最下面的图表示将更新流程迭代 T T 次,并展开以后获得等效网络图。

网络的学习算法设计

GNN的学习就是估计参数 w \boldsymbol{w} ,使得函数 φ w \varphi_{\boldsymbol{w}} 可以近似估计训练集
L = { ( G i , n i , j , t i , j ) G i = ( N i , E i ) G ; n i , j N i ; t i , j R m , 1 i p , 1 j q i } \mathcal{L}=\left\{\left(\boldsymbol{G}_{i}, n_{i, j}, \boldsymbol{t}_{i, j}\right)| \boldsymbol{G}_{i}=\left(\boldsymbol{N}_{i}, \boldsymbol{E}_{i}\right) \in \mathcal{G}\right.;n_{i, j} \in \boldsymbol{N}_{i} ; \boldsymbol{t}_{i, j} \in \mathbb{R}^{m}, 1 \leq i \leq p, 1 \leq j \leq q_{i} \} 其中, q i q_i 表示在图 G i G_{i} 中监督学习的节点个数,对于graph-focused的任务,须要增长一个特殊的节点,该节点用来做为目标节点,这样,graph-focused任务和node-focused任务都能统一到节点预测任务上,学习目标能够是最小化以下二次损失函数
e w = i = 1 p j = 1 q i ( t i , j φ w ( G i , n i , j ) ) 2 e_{\boldsymbol{w}}=\sum_{i=1}^{p} \sum_{j=1}^{q_{i}}\left(\boldsymbol{t}_{i, j}-\varphi_{\boldsymbol{w}}\left(\boldsymbol{G}_{i}, n_{i, j}\right)\right)^{2} 优化算法基于随机梯度降低的策略,优化步骤按照以下几步进行

  • 按照迭代方程迭代 T T 次获得 x n ( t ) x_{n}(t) ,此时接近不动点解: x ( T ) x \boldsymbol{x}(T) \approx \boldsymbol{x}
  • 计算参数权重的梯度 e w ( T ) / w \partial e_{\boldsymbol{w}}(T) / \partial \boldsymbol{w}
  • 使用该梯度来更新权重 w \boldsymbol{w}

这里假设函数 F w F_{\boldsymbol{w}} 是压缩映射函数,保证最终可以收敛到不动点。另外,这里的梯度的计算使用backpropagation-through-time algorithm

为了代表前面的方法是可行的,论文接着证实了两个结论


理论1(可微性):令 F w F_{\boldsymbol{w}} G w G_{\boldsymbol{w}} 分别是global transition function和global output function,若是 F w ( x , l ) F_{\boldsymbol{w}}(\boldsymbol{x}, \boldsymbol{l}) G w ( x , l N ) G_{\boldsymbol{w}}\left(\boldsymbol{x}, \boldsymbol{l}_{\boldsymbol{N}}\right) 对于 x \boldsymbol{x} w \boldsymbol{w} 是连续可微的,那么 φ w \varphi_{\boldsymbol{w}} w \boldsymbol{w} 也是连续可微的。

理论2(反向传播):令 F w F_{\boldsymbol{w}} G w G_{\boldsymbol{w}} 分别是global transition function和global output function,若是 F w ( x , l ) F_{\boldsymbol{w}}(\boldsymbol{x}, \boldsymbol{l}) G w ( x , l N ) G_{\boldsymbol{w}}\left(\boldsymbol{x}, \boldsymbol{l}_{\boldsymbol{N}}\right) 对于 x \boldsymbol{x} w \boldsymbol{w} 是连续可微的。令 z ( t ) \boldsymbol{z}(t) 定义为
z ( t ) = z ( t + 1 ) F w x ( x , l ) + e w o G w x ( x , l N ) z(t)=z(t+1) \cdot \frac{\partial F_{w}}{\partial x}(x, l)+\frac{\partial e_{w}}{\partial o} \cdot \frac{\partial G_{w}}{\partial x}\left(x, l_{N}\right)
那么,序列 z ( T ) , z ( T 1 ) , \boldsymbol{z}(T), \boldsymbol{z}(T-1), \ldots 收敛到一个向量, z = lim t z ( t ) z=\lim _{t \rightarrow-\infty} z(t) ,而且收敛速度为指数级收敛以及与初值 z ( T ) \boldsymbol{z}(T) 无关,另外,还存在
e w w = e w o G w w ( x , l N ) + z F w w ( x , l ) \frac{\partial e_{w}}{\partial \boldsymbol{w}}=\frac{\partial e_{\boldsymbol{w}}}{\partial \boldsymbol{o}} \cdot \frac{\partial G_{\boldsymbol{w}}}{\partial \boldsymbol{w}}\left(\boldsymbol{x}, \boldsymbol{l}_{N}\right)+\boldsymbol{z} \cdot \frac{\partial F_{\boldsymbol{w}}}{\partial \boldsymbol{w}}(\boldsymbol{x}, \boldsymbol{l})
其中, x \boldsymbol{x} 是GNN的稳定状态。

算法流程以下
在这里插入图片描述
FORWARD用于迭代计算出收敛点,BACKWARD用于计算梯度。

Transition和Output函数实现

在GNN中,函数 g w g_{\boldsymbol{w}} 不须要知足特定的约束,直接使用多层前馈神经网络,对于函数 f w f_{\boldsymbol{w}} ,则须要着重考虑,由于 f w f_{\boldsymbol{w}} 须要知足压缩映射的条件,并且与不动点计算相关。下面提出两种神经网络和不一样的策略来知足这些需求

  1. Linear(nonpositional) GNN

    对于节点 n n 状态的计算,将 f w f_{\boldsymbol{w}} 改为以下形式
    x n = u  ne  n ] h w ( l n , l ( n , u ) , x u , l u ) , n N \boldsymbol{x}_{n}=\sum_{u \in \text { ne } | n ]} h_{\boldsymbol{w}}\left(\boldsymbol{l}_{n}, \boldsymbol{l}_{(n, u)}, \boldsymbol{x}_{u}, \boldsymbol{l}_{u}\right), \quad n \in \boldsymbol{N} 至关因而对节点 n n 的每个邻居节点使用 h w h_{\boldsymbol{w}} ,并将获得的值求和来做为节点 n n 的状态。

    由此,对上式中的函数 h w h_{\boldsymbol{w}} 按照以下方式实现
    h w ( l n , l ( n , a ) , x u , l u ) = A n , u x u + b n h_{\boldsymbol{w}}\left(\boldsymbol{l}_{n}, \boldsymbol{l}_{(n, \mathfrak{a})}, \boldsymbol{x}_{u}, \boldsymbol{l}_{u}\right) = \boldsymbol{A}_{n, u} \boldsymbol{x}_{u}+\boldsymbol{b}_{n} 其中,向量 b n R s \boldsymbol{b}_{n} \in \mathbb{R}^{s} ,矩阵 A n , u R s × s \boldsymbol{A}_{n, u} \in \mathbb{R}^{s \times s} 定义为两个前向神经网络的输出。更确切地说,令产生矩阵 A n , u \boldsymbol{A}_{n, u} 的网络为transition network,产生向量 b n \boldsymbol{b}_{n} 的网络为forcing network

    transition network表示为 ϕ w \phi_{\boldsymbol{w}}
    ϕ w : R 2 l N + l E R s 2 \phi_{\boldsymbol{w}} : \mathbb{R}^{2 l_{N}+l_{E}} \rightarrow \mathbb{R}^{s^{2}}
    forcing network表示为 ρ w \rho_{\boldsymbol{w}}
    ρ w : R l N R s \rho_{\boldsymbol{w}} : \mathbb{R}^{l_{N}} \rightarrow \mathbb{R}^{s} 由此,能够定义 A n , u \boldsymbol{A}_{n, u} b n \boldsymbol{b}_{n}
    A n , u = μ s ne [ u ] Ξ b w = ρ w ( l n ) \begin{aligned} \boldsymbol{A}_{\boldsymbol{n}, \boldsymbol{u}} &=\frac{\mu}{s|\operatorname{ne}[u]|} \cdot \boldsymbol{\Xi} \\ \boldsymbol{b}_{\boldsymbol{w}} &=\rho_{\boldsymbol{w}}\left(\boldsymbol{l}_{n}\right) \end{aligned} 其中, μ ( 0 , 1 ) \mu \in(0,1) Ξ = resize ( ϕ w ( l n , l ( n , u ) , l u ) ) \Xi=\operatorname{resize}\left(\phi_{\boldsymbol{w}}\left(\boldsymbol{l}_{n}, \boldsymbol{l}_{(n, u)}, \boldsymbol{l}_{u}\right)\right) resize ( ) \text{resize}(\cdot) 表示将 s 2 s^2 维的向量整理(reshape)成 s × s s\times{s} 的矩阵,也就是说,将transition network的输出整理成方形矩阵,而后乘以一个系数就获得 A n , u \boldsymbol{A}_{n, u} b n \boldsymbol{b}_{n} 就是forcing network的输出。

    在这里,假定 ϕ w ( l n , l ( n , u ) , l u ) 1 s \left\|\phi_{\boldsymbol{w}}\left(\boldsymbol{l}_{n}, \boldsymbol{l}_{(\boldsymbol{n}, \boldsymbol{u})}, \boldsymbol{l}_{u}\right)\right\|_{1} \leq \boldsymbol{s} ,这个能够经过设定transition function的激活函数来知足,好比设定激活函数为 t a n h ( ) tanh() 。在这种状况下, F w ( x , l ) = A x + b F_{\boldsymbol{w}}(\boldsymbol{x}, \boldsymbol{l})=\boldsymbol{A} \boldsymbol{x}+\boldsymbol{b} A \boldsymbol{A} b \boldsymbol{b} 分别是 A n , u \boldsymbol{A}_{n, u} 的块矩阵形式和 b n \boldsymbol{b}_{n} 的堆叠形式,经过简单的代数运算可得
    F w x 1 = A 1 max u N ( n ne [ u ] A n , u 1 ) max u N ( μ s ne [ u ] n n e [ u ] Ξ 1 ) μ \begin{aligned}\left\|\frac{\partial F_{\boldsymbol{w}}}{\partial \boldsymbol{x}}\right\|_{1} &=\|\boldsymbol{A}\|_{1} \leq \max _{u \in \boldsymbol{N}}\left(\sum_{n \in \operatorname{ne}[u]}\left\|\boldsymbol{A}_{n, u}\right\|_{1}\right) \\ & \leq \max _{u \in N}\left(\frac{\mu}{s|\operatorname{ne}[u]|} \cdot \sum_{n \in \mathrm{ne}[u]}\|\mathbf{\Xi}\|_{1}\right) \leq \mu \end{aligned}
    该式表示 F w F_{\boldsymbol{w}} 对于任意的参数 w \boldsymbol{w} 是一个压缩映射。

    矩阵 M M 的1-norm定义为
    M 1 = max j i m i , j \|M\|_{1}=\max _{j} \sum_{i}\left|m_{i, j}\right|

  2. Nonelinear(nonpositional) GNN:在这个结构中, h w h_{\boldsymbol{w}} 经过多层前馈网络实现,可是,并非全部的参数 w \boldsymbol{w} 都会被使用,由于一样须要保证 F w F_{\boldsymbol{w}} 是一个压缩映射函数,这个能够经过惩罚项来实现
    e w = i = 1 p j = 1 q i ( t i , j φ w ( G i , n i , j ) ) 2 + β L ( F w x ) e_{\boldsymbol{w}}=\sum_{i=1}^{p} \sum_{j=1}^{q_{i}}\left(\boldsymbol{t}_{i, j}-\varphi_{\boldsymbol{w}}\left(\boldsymbol{G}_{i}, n_{i, j}\right)\right)^{2}+\beta L\left(\left\|\frac{\partial F_{\boldsymbol{w}}}{\partial \boldsymbol{x}}\right\|\right) 其中,惩罚项 L ( y ) L(y) y > μ y>\mu 时为 ( y μ ) 2 (y-\mu)^2 ,在 y μ y\le{\mu} 时为0,参数 μ ( 0 , 1 ) \mu\in(0,1) 定义为但愿的 F w F_{\boldsymbol{w}} 的压缩系数。

实验结果

论文将GNN模型在三个任务上进行了实验:子图匹配(subgraph matching)任务,诱变(mutagenesis)任务和网页排序(web page ranking)任务。在这些任务上使用linear和nonlinear的模型测试,其中nonlinear模型中的激活函数使用sigmoid函数。

子图匹配任务为在一个大图 G G 上找到给定的子图 S S (标记出属于子图的节点),也就是说,函数 τ \tau 必须学习到,若是 n i , j n_{i,j} 属于子图 G G ,那么 τ ( G i , n i , j ) = 1 \tau(G_i,n_{i,j})=1 ,不然, τ ( G i , n i , j ) = 1 \tau(G_i,n_{i,j})=-1 。实验结果中,nonlinear模型的效果要好于linear模型的效果,两个模型都要比FNN模型效果更好。

诱变问题任务是对化学分子进行分类,识别出诱变化合物,采用二分类方法。实验结果是nonlinear效果较好,但不是最好。

网页排序任务是学会网页排序。实验代表虽然训练集只包含50个网页,可是仍然没有产生过拟合的现象。

模型实现

在模拟的节点分类任务上实现该论文的GNN模型。

  • 任务要求为输入一个graph,该graph的全部节点都有标签,而后对部分节点进行训练,在验证阶段使用另一部分节点进行验证。输入的数据图以下图:

在这里插入图片描述
其中,该graph总共有18个节点,分别是 { n 1 , n 2 , . . . , n 18 } \{n1,n2,...,n18\} ,不一样颜色的节点表示不一样的节点类别。模拟的问题中节点类别有三类,分别用 { 0 , 1 , 2 } \{0,1,2\} 表示,在训练阶段,使用节点 { n 1 , n 2 , n 3 , n 7 , n 8 , n 9 , n 13 , n 14 , n 15 } \{n1,n2,n3,n7,n8,n9,n13,n14,n15\} 进行训练,至关于每一类取出三个节点训练,其他的节点用于在验证阶段进行验证。

输入的数据为(node,label)列表和(node1, node2)边列表,表示以下

# (node, label)集
N = [("n{}".format(i), 0) for i in range(1,7)] + \
    [("n{}".format(i), 1) for i in range(7,13)] + \
    [("n{}".format(i), 2) for i in range(13,19)]
# 边集
E = [("n1","n2"), ("n1","n3"), ("n1","n5"),
     ("n2","n4"),
     ("n3","n6"), ("n3","n9"),
     ("n4","n5"), ("n4","n6"), ("n4","n8"),
     ("n5","n14"),
     ("n7","n8"), ("n7","n9"), ("n7","n11"),
     ("n8","n10"), ("n8","n11"), ("n8", "n12"),
     ("n9","n10"), ("n9","n14"),
     ("n10","n12"),
     ("n11","n18"),
     ("n13","n15"), ("n13","n16"), ("n13","n18"),
     ("n14","n16"), ("n14","n18"),
     ("n15","n16"), ("n15","n18"),
     ("n17","n18")]

N N 为节点集合, E E 为边集合。

  • 模型部分使用论文的linear函数来设计 f w f_w g w g_w ,并且,这两个函数在graph全部的节点上进行共享。模型部分实现了 Ξ \Xi ρ \rho 函数,以及完整的forward传播部分,以下简化代码:

    # 实现Xi函数,输入一个batch的相邻节点特征向量对ln,返回是s*s的A矩阵
    # ln是特征向量维度,s为状态向量维度
    # Input : (N, 2*ln)
    # Output : (N, S, S)
    class Xi(nn.Module):
        def __init__(self, ln, s):
            ...
        def forward(self, X):
            ...
    
    # 实现Rou函数
    # Input : (N, ln)
    # Output : (N, S)
    class Rou(nn.Module):
        def __init__(self, ln, s):
            ...
        def forward(self, X):
            ...
    
    # 实现Hw函数
    # Input : (N, 2 * ln) 
    # 每一行都是一个节点特征向量和该节点的某一个邻接向量concat
    # 获得的向量
    # Input : (N, s)
    # 对应中心节点的状态向量
    # Input : (N, )
    # 对应中心节点的度的向量
    # Output : (N, s)
    class Hw(nn.Module):
        def __init__(self, ln, s, mu=0.9):
            ...
        def forward(self, X, H, dg_list):
            ...
    
    class AggrSum(nn.Module):
        def __init__(self, node_num):
            ...
        
        def forward(self, H, X_node):
            ...
    
    # 实现GNN模型
    class OriLinearGNN(nn.Module):
        def __init__(self, node_num, feat_dim, stat_dim, T):
            ...
        # Input : 
        # X_Node : (N, )
        # X_Neis : (N, )
        # H : (N, s)
        # dg_list: (N, )
        def forward(self, X_Node, X_Neis, dg_list):
            ...
            for t in range(self.T):
                # (V, s) -> (N, s)
                H = torch.index_select(self.node_states, 0, X_Node)
                # (N, s) -> (N, s)
                H = self.Hw(X, H, dg_list)
                # (N, s) -> (V, s)
                self.node_states = self.Aggr(H, X_Node)
    # print(H[1])
            ...

    能够看出,在模型训练阶段,每次forward,都会直接循环计算T次 f w f_w 函数计算不动点,而后再计算output。

  • 模型训练部分按照常规的分类模型进行训练,采用Adam优化器,学习率保持为0.01,权重衰减为0.01,使用交叉熵做为损失函数,模型训练部分代码以下

    # 用于计算accuracy
    def CalAccuracy(output, label):
        ...
    
    # 开始训练模型
    def train(node_list, edge_list, label_list, T, ndict_path="./node_dict.json"):
        # 生成node-index字典
        ...
    
        # 如今须要生成两个向量
        # 第一个向量相似于
        # [0, 0, 0, 1, 1, ..., 18, 18]
        # 其中的值表示节点的索引,连续相同索引的个数为该节点的度
        # 第二个向量相似于
        # [1, 2, 4, 1, 4, ..., 11, 13]
        # 与第一个向量一一对应,表示第一个向量节点的邻居节点
    
        # 首先统计获得节点的度
        ...
        
        # 而后生成两个向量
        ...
        # 生成度向量
        ...
        # 准备训练集和测试集
        train_node_list = [0,1,2,6,7,8,12,13,14]
        train_node_label = [0,0,0,1,1,1,2,2,2]
        test_node_list = [3,4,5,9,10,11,15,16,17]
        test_node_label = [0,0,0,1,1,1,2,2,2]
        
        # 开始训练
        model = OriLinearGNN(node_num=len(node_list),
                             feat_dim=2,
                             stat_dim=2,
                             T=T)
        optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=0.01)
        criterion = nn.CrossEntropyLoss(size_average=True)
        
        min_loss = float('inf')
        node_inds_tensor = Variable(torch.Tensor(node_inds).long())
        node_neis_tensor = Variable(torch.Tensor(node_neis).long())
        train_label = Variable(torch.Tensor(train_node_label).long())
        for ep in range(500):
            # 运行模型获得结果
            res = model(node_inds_tensor, node_neis_tensor, dg_list) # (V, 3)
            train_res = torch.index_select(res, 0, torch.Tensor(train_node_list).long())
            test_res = torch.index_select(res, 0, torch.Tensor(test_node_list).long())
            loss = criterion(input=train_res,
                             target=train_label)
            loss_val = loss.item()
            train_acc = CalAccuracy(train_res.cpu().detach().numpy(), np.array(train_node_label))
            test_acc = CalAccuracy(test_res.cpu().detach().numpy(), np.array(test_node_label))
            # 更新梯度
            optimizer.zero_grad()
            loss.backward(retain_graph=True)
            optimizer.step()
    
            if loss_val < min_loss:
                min_loss = loss_val
            print("==> [Epoch {}] : loss {:.4f}, min_loss {:.4f}, train_acc {:.3f}, test_acc {:.3f}".format(ep, loss_val, min_loss, train_acc, test_acc))
  • 模型的训练和评估结果以下图:
    在这里插入图片描述
    第一条曲线为训练loss曲线,第二条曲线为训练的acc曲线,第三条曲线为评估的acc曲线,能够看出,训练的loss很快达到了最低0.56左右,而准确率达到了1.0,基本已通过拟合,而验证集的准确率一直很低,最高在第500个epoch处上升到0.667,约为 2 3 \frac{2}{3} 左右。

2. Graph Convolutional Networks

图卷积的演变

按照图傅里叶变换的性质,能够获得以下图卷积的定义
( f h ) G = Φ diag [ h ^ ( λ 1 ) , , h ^ ( λ n ) ] Φ T f (\boldsymbol{f} * \boldsymbol{h})_{\mathcal{G}}=\boldsymbol{\Phi} \operatorname{diag}\left[\hat{h}\left(\lambda_{1}\right), \ldots, \hat{h}\left(\lambda_{n}\right)\right] \mathbf{\Phi}^{T} \boldsymbol{f} 其中

  • 对于图$ \boldsymbol{f} 的傅里叶变换为 \boldsymbol{\hat{f}}=\mathbf{\Phi}^{T} \boldsymbol{f}$

  • 对于卷积核的图傅里叶变换: h ^ = ( h ^ 1 , , h ^ n ) \hat{h}=\left(\hat{h}_{1}, \ldots, \hat{h}_{n}\right) ,其中
    h ^ k = h , ϕ k , k = 1 , 2 , n \hat{h}_{k}=\left\langle h, \phi_{k}\right\rangle, k=1,2 \ldots, n 按照矩阵形式就是 h ^ = Φ T h \hat{\boldsymbol{h}}=\mathbf{\Phi}^{T} \boldsymbol{h}

  • 对二者的傅里叶变换向量 f ^ R N × 1 \hat{f} \in \mathbb{R}^{N \times 1} h ^ R N × 1 \hat{h} \in \mathbb{R}^{N \times 1} 求element-wise乘积,等价于将 h \boldsymbol{h} 组织成对角矩阵,即 diag [ h ^ ( λ k ) ] R N × N \operatorname{diag}\left[\hat{h}\left(\lambda_{k}\right)\right] \in \mathbb{R}^{N \times N} ,而后再求 diag [ h ^ ( λ k ) ] \operatorname{diag}\left[\hat{h}\left(\lambda_{k}\right)\right] f \boldsymbol{f} 矩阵乘法。

  • 求上述结果的傅里叶逆变换,即左乘 Φ \mathbf{\Phi}

深度学习中的卷积就是要设计trainable的卷积核,从上式能够看出,就是要设计 diag [ h ^ ( λ 1 ) , , h ^ ( λ n ) ] \operatorname{diag}\left[\hat{h}\left(\lambda_{1}\right), \ldots, \hat{h}\left(\lambda_{n}\right)\right] ,由此,能够直接将其变为卷积核 diag [ θ 1 , , θ n ] \operatorname{diag}\left[\theta_{1}, \ldots, \theta_{n}\right] ,而不须要再将卷积核进行傅里叶变换,由此,至关于直接将变换后的参量进行学习。

第一代GCN

第一代GCN为
y output = σ ( Φ g θ Φ T x ) = σ ( Φ diag [ θ 1 , , θ n ] Φ T x ) \boldsymbol{y}_{\text {output}}=\sigma\left(\mathbf{\Phi} \boldsymbol{g}_{\theta} \mathbf{\Phi}^{T} \boldsymbol{x}\right)=\sigma\left(\boldsymbol{\Phi} \operatorname{diag}\left[\theta_{1}, \ldots, \theta_{n}\right] \mathbf{\Phi}^{T} \boldsymbol{x}\right)
其中, x \boldsymbol{x} 就是graph上对应每一个节点的feature构成的向量, x = ( x 1 , x 2 , , x n ) x=\left(x_{1}, x_{2}, \ldots, x_{n}\right) ,这里暂时对每一个节点都使用标量,而后通过激活以后,获得输出 y output \boldsymbol{y}_{\text {output}} ,以后传入下一层。

一些缺点:

  • 须要对拉普拉斯矩阵进行谱分解来求 Φ \mathbf{\Phi} ,在graph很大的时候复杂度很高。另外,还须要计算矩阵乘积,复杂度为 O ( n 2 ) O(n^2)
  • 卷积核参数为 n n ,当graph很大的时候, n n 会很大。
  • 卷积核的spatial localization很差。

第二代GCN

图傅里叶变换是关于特征值(至关于普通傅里叶变换的频率)的函数,也就是 F ( λ 1 ) , , F ( λ n ) F\left(\lambda_{1}\right), \ldots, F\left(\lambda_{n}\right) ,即 F ( Λ ) F(\mathbf{\Lambda}) ,所以,将卷积核 g θ \boldsymbol{g}_{\theta} 写成 g θ ( Λ ) \boldsymbol{g}_{\theta}(\Lambda) ,而后,将 g θ ( Λ ) \boldsymbol{g}_{\theta}(\Lambda) 定义为以下k阶多项式
g θ ( Λ ) k = 0 K θ k Λ k g_{\theta^{\prime}}(\mathbf{\Lambda}) \approx \sum_{k=0}^{K} \theta_{k}^{\prime} \mathbf{\Lambda}^{k} 将卷积公式带入,能够获得
g θ x Φ k = 0 K θ k Λ k Φ T x = k = 0 K θ k ( Φ Λ k Φ T ) x = k = 0 K θ k ( Φ Λ Φ T ) k x = k = 0 K θ k L k x \begin{aligned} g_{\theta^{\prime}} * x & \approx \Phi \sum_{k=0}^{K} \theta_{k}^{\prime} \mathbf{\Lambda}^{k} \mathbf{\Phi}^{T} \boldsymbol{x} \\ &=\sum_{k=0}^{K} \theta_{k}^{\prime}\left(\mathbf{\Phi} \mathbf{\Lambda}^{k} \mathbf{\Phi}^{T}\right) x \\ &=\sum_{k=0}^{K} \theta_{k}^{\prime}\left(\mathbf{\Phi} \mathbf{\Lambda} \mathbf{\Phi}^{T}\right)^{k} x \\ &=\sum_{k=0}^{K} \theta_{k}^{\prime} \boldsymbol{L}^{k} x \end{aligned}
能够看出,这一代的GCN不须要作特征分解了,能够直接对Laplacian矩阵作变换,经过事先将Laplacian矩阵求出来,以及 L k \boldsymbol{L}^{k} 求出来,前向传播的时候,就能够直接使用,复杂度为 O ( K n 2 ) O(Kn^2)

对于每一次Laplacian矩阵 L \boldsymbol{L} x \mathbf{x} 相乘,对于节点 n n ,至关于从邻居节点 n e [ n ] ne[n] 传递一次信息给节点 n n ,因为连续乘以了 k k 次Laplacian矩阵,那么至关于n节点的k-hop以内的节点可以传递信息给 n n 所以,实际上只利用了节点的K-Localized信息

另外,可使用切比雪夫展开式来近似 L k \boldsymbol{L}^{k} 任何k次多项式均可以使用切比雪夫展开式来近似,由此,引入切比雪夫多项式的 K K 阶截断得到 L k \boldsymbol{L}^{k} 近似,从而得到对 g θ ( Λ ) g_{\theta}(\mathbf{\Lambda}) 的近似
g θ ( Λ ) k = 0 K θ k T k ( Λ ~ ) g_{\theta^{\prime}}(\mathbf{\Lambda}) \approx \sum_{k=0}^{K} \theta_{k}^{\prime} T_{k}(\tilde{\mathbf{\Lambda}})
其中, Λ ~ = 2 λ max Λ I n \tilde{\mathbf{\Lambda}}=\frac{2}{\lambda_{\max }} \mathbf{\Lambda}-\boldsymbol{I}_{n} θ R K \boldsymbol{\theta}^{\prime} \in \mathbb{R}^{K} 为切比雪夫向量, θ k \theta_{k}^{\prime} 为第 k k 个份量,切比雪夫多项式 T k ( x ) T_{k}(x) 使用递归的方式进行定义: T k ( x ) = 2 x T k 1 ( x ) T k 2 ( x ) T_{k}(x)=2 x T_{k-1}(x)-T_{k-2}(x) ,其中, T 0 ( x ) = 1 , T 1 ( x ) = x T_{0}(x)=1, T_{1}(x)=x

此时,带入到卷积公式
g θ x Φ k = 0 K θ k T k ( Λ ~ ) Φ T x k = 0 K θ k ( Φ T k ( Λ ~ ) Φ T ) x = k = 0 K θ k T k ( L ~ ) x \begin{aligned} \boldsymbol{g}_{\boldsymbol{\theta}^{\prime}} * \boldsymbol{x} & \approx \mathbf{\Phi} \sum_{k=0}^{K} \theta_{k}^{\prime} T_{k}(\tilde{\boldsymbol{\Lambda}}) \mathbf{\Phi}^{T} \boldsymbol{x} \\ &\approx \sum_{k=0}^{K} \theta_{k}^{\prime}\left(\mathbf{\Phi} T_{k}(\tilde{\mathbf{\Lambda}}) \mathbf{\Phi}^{T}\right) x \\ &=\sum_{k=0}^{K} \theta_{k}^{\prime} T_{k}(\tilde{\boldsymbol{L}}) \boldsymbol{x} \end{aligned} 其中, L ~ = 2 λ max L I n \tilde{\boldsymbol{L}}=\frac{2}{\lambda_{\max }} \boldsymbol{L}-\boldsymbol{I}_{n}

所以,能够获得输出为
y output = σ ( k = 0 K θ k T k ( L ~ ) x ) \boldsymbol{y}_{\text {output}}=\sigma\left(\sum_{k=0}^{K} \theta_{k}^{\prime} T_{k}(\tilde{\boldsymbol{L}}) \boldsymbol{x}\right)

第三代GCN

这一代GCN直接取切比雪夫多项式中 K = 1 K=1 ,此时模型是1阶近似

K = 1 K=1 λ max = 2 \lambda_{\max }=2 带入能够获得
g θ x θ 0 x + θ 1 ( L I n ) x = θ 0 x + θ 1 ( L I n ) x = θ 0 x θ 1 ( D 1 / 2 W D 1 / 2 ) x \begin{aligned} \boldsymbol{g}_{\boldsymbol{\theta}^{\prime}} * \boldsymbol{x} & \approx \boldsymbol{\theta}_{0}^{\prime} \boldsymbol{x}+\theta_{1}^{\prime}\left(\boldsymbol{L}-\boldsymbol{I}_{n}\right) \boldsymbol{x} \\ &=\boldsymbol{\theta}_{0}^{\prime} \boldsymbol{x}+\theta_{1}^{\prime}\left(\boldsymbol{L}-\boldsymbol{I}_{n}\right) \boldsymbol{x} \\ &=\theta_{0}^{\prime} \boldsymbol{x}-\theta_{1}^{\prime}\left(\boldsymbol{D}^{-1 / 2} \boldsymbol{W} \boldsymbol{D}^{-1 / 2}\right) \boldsymbol{x} \end{aligned}
其中,归一化拉普拉斯矩阵 L = D 1 / 2 ( D W ) D 1 / 2 = I n D 1 / 2 W D 1 / 2 \boldsymbol{L}=\boldsymbol{D}^{-1 / 2}(\boldsymbol{D}-\boldsymbol{W}) \boldsymbol{D}^{-1 / 2}=\boldsymbol{I}_{n}-\boldsymbol{D}^{-1 / 2} \boldsymbol{W} \boldsymbol{D}^{-1 / 2} 为了进一步简化,令 θ 0 = θ 1 \theta_{0}^{\prime}=-\theta_{1}^{\prime} ,此时只含有一个参数 θ \theta
g θ x = θ ( I n + D 1 / 2 W D 1 / 2 ) x g_{\theta^{\prime}} * x=\theta\left(I_{n}+D^{-1 / 2} W D^{-1 / 2}\right) x
因为 I n + D 1 / 2 W D 1 / 2 \boldsymbol{I}_{n}+\boldsymbol{D}^{-1 / 2} \boldsymbol{W} \boldsymbol{D}^{-1 / 2} 谱半径 [ 0 , 2 ] [0,2] 太大,使用归一化的trick
I n + D 1 / 2 W D 1 / 2 D ~ 1 / 2 W ~ D ~ 1 / 2 \boldsymbol{I}_{n}+\boldsymbol{D}^{-1 / 2} \boldsymbol{W} \boldsymbol{D}^{-1 / 2} \rightarrow \tilde{\boldsymbol{D}}^{-1 / 2} \tilde{\boldsymbol{W}} \tilde{\boldsymbol{D}}^{-1 / 2}
其中, W ~ = W + I n \tilde{\boldsymbol{W}}=\boldsymbol{W}+\boldsymbol{I}_{n} D ~ i j = Σ j W ~ i j \tilde{D}_{i j}=\Sigma_{j} \tilde{W}_{i j}

由此,带入卷积公式
g θ x R n × 1 = θ ( D ~ 1 / 2 W ~ D ~ 1 / 2 R n × n ) x R n × 1 \underbrace{g_{\theta^{\prime}} * x}_{\mathbb{R}^{n \times 1}}=\theta\left(\underbrace{\tilde{D}^{-1 / 2} \tilde{W} \tilde{D}^{-1 / 2}}_{\mathbb{R}^{n \times n}}\right) \underbrace{x}_{\mathbb{R}^{n \times 1}}
若是推广到多通道,至关于每个节点的信息是向量
x R N × 1 X R N × C x \in \mathbb{R}^{N \times 1} \rightarrow X \in \mathbb{R}^{N \times C}
其中, N N 是节点数量 C C 是通道数,或者称做表示节点的信息维度数 X \mathbf{X} 是节点的特征矩阵

相应的卷积核参数变化
θ R Θ R C × F \theta \in \mathbb{R} \rightarrow \Theta \in \mathbb{R}^{C \times F}
其中, F F 为卷积核数量。

那么卷积结果写成矩阵形式为
Z R N × F = D ~ 1 / 2 W ~ D ~ 1 / 2 R N × N X R N × C Θ R C × F \underbrace{Z}_{\mathbb{R}^{N \times F}}=\underbrace{\tilde{D}^{-1 / 2} \tilde{W} \tilde{D}^{-1 / 2}}_{\mathbb{R}^{N \times N}} \underbrace{X}_{\mathbb{R}^{N \times C}} \underbrace{\mathbf{\Theta}}_{\mathbb{R}^{C \times F}}
上述操做能够叠加多层,对上述输出激活一下,就能够做为下一层节点的特征矩阵

这一代GCN特色:

  • K = 1 K=1 ,至关于直接取邻域信息,相似于 3 × 3 3\times{3} 的卷积核。
  • 因为卷积核宽度减少,能够经过增长卷积层数来扩大感觉野,从而加强网络的表达能力。
  • 增长了参数约束,好比 λ max 2 \lambda_{\max } \approx 2 ,引入归一化操做。

论文模型

论文采用两层的GCN,用来在graph上进行半监督的节点分类任务,邻接矩阵为 A A ,首先计算出 A ^ = D ~ 1 2 A ~ D ~ 1 2 \hat{A}=\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} ,由此,前向网络模型形式以下
Z = f ( X , A ) = softmax ( A ^ ReLU ( A ^ X W ( 0 ) ) W ( 1 ) ) Z=f(X, A)=\operatorname{softmax}\left(\hat{A} \operatorname{ReLU}\left(\hat{A} X W^{(0)}\right) W^{(1)}\right)
其中, W ( 0 ) R C × H W^{(0)} \in \mathbb{R}^{C \times H} 为输入层到隐藏层的权重矩阵,隐藏层的特征维度为 H H W ( 1 ) R H × F W^{(1)} \in \mathbb{R}^{H \times F} 为隐藏层到输出层的权重矩阵,softmax激活函数定义为 softmax ( x i ) = 1 Z exp ( x i ) \operatorname{softmax}\left(x_{i}\right)=\frac{1}{\mathcal{Z}} \exp \left(x_{i}\right) Z = i exp ( x i ) \mathcal{Z}=\sum_{i} \exp \left(x_{i}\right) ,至关于对每一列作softmax,由此,获得交叉熵损失函数
L = l Y L f = 1 F Y l f ln Z l f \mathcal{L}=-\sum_{l \in \mathcal{Y}_{L}} \sum_{f=1}^{F} Y_{l f} \ln Z_{l f}
其中, Y L \mathcal{Y}_{L} 为带有标签的节点集合。

在这里插入图片描述
上图中左图为GCN图示,输入为 C C 个通道,输出为 F F 个通道, Y 1 Y_1 Y 2 Y_2 为节点标签。右图为在一数据集上进行训练获得的隐藏层激活值通过t-SNE降维可视化后的结果,能够看出聚类效果较好。

实验结果

论文在以下几个任务中进行实验

  • 在citation network中进行半监督的document classification。
  • 在从knowledge graph中提取的bipartite graph中进行半监督的entity classification

实验数听说明以下
在这里插入图片描述
前三个Dataset是citation network数据集,节点表示文档,边表示引用的链接,label rate表示用来有监督训练的节点数量占总节点数量比例,第四个Dataset是bipartite graph数据集。

结果以下:
在这里插入图片描述

能够看出,在比较的几种算法中,论文GCN的在准确率和时间上都最好。

3. DCNN

该模型对每个节点(或边、或图)采用H个hop的矩阵进行表示,每个hop都表示该邻近范围的邻近信息,由此,对于局部信息的获取效果比较好,获得的节点的representation的表示能力很强。

DCNN模型详述

假设有以下定义

  • 一个graph数据集 G = { G t t 1 T } \mathcal{G}=\left\{G_{t} | t \in 1 \ldots T\right\}
  • graph定义为 G t = ( V t , E t ) G_{t}=\left(V_{t}, E_{t}\right) ,其中, V t V_t 为节点集合, E t E_t 为边集合
  • 全部节点的特征矩阵定义为 X t X_t ,大小为 N t × F N_t\times{F} ,其中, N t N_t 为图 G t G_t 的节点个数, F F 为节点特征维度
  • 边信息 E t E_t 定义为 N t × N t N_t\times{}N_t 的邻接矩阵 A t A_t ,由此能够计算出节点度(degree)归一化的转移几率矩阵 P t P_t ,表示从 i i 节点转移到 j j 节点的几率。

对于graph来讲没有任何限制,graph能够是带权重的或不带权重的,有向的或无向的。

模型的目标为预测 Y Y ,也就是预测每个图的节点标签,或者边的标签,或者每个图的标签,在每一种状况中,模型输入部分带有标签的数据集合,而后预测剩下的数据的标签

DCNN模型输入图 G \mathcal{G} ,返回硬分类预测值 Y Y 或者条件分布几率 P ( Y X ) \mathbb{P}(Y|X) 。该模型将每个预测的目标对象(节点、边或图)转化为一个diffusion-convolutional representation,大小为 H × F H\times{}F H H 表示扩散的hops。所以,对于节点分类任务,图 t t 的confusion-convolutional representation为大小为 N t × H × F N_t\times{H}\times{F} 的张量,表示为 Z t Z_t ,对于图分类任务,张量 Z t Z_t 为大小为 H × F H\times{F} 的矩阵,对于边分类任务,张量 Z t Z_t 为大小为 M t × H × F M_t\times{H}\times{F} 的矩阵。示意图以下

在这里插入图片描述
对于节点分类任务,假设 P t P_t^* P t P_t 的power series,大小为 N t × H × N t N_t\times{H}\times{N_t} ,那么对于图 t t 的节点 i i ,第 j j 个hop,第 k k 维特征值 Z t i j k Z_{tijk} 计算公式为
Z t i j k = f ( W j k c l = 1 N t P t i j l X t l k ) Z_{t i j k}=f\left(W_{j k}^{c} \cdot \sum_{l=1}^{N_{t}} P_{t i j l}^{*} X_{t l k}\right)
使用矩阵表示为
Z t = f ( W c P t X t ) Z_{t}=f\left(W^{c} \odot P_{t}^{*} X_{t}\right)
其中 \odot 表示element-wise multiplication,因为模型只考虑 H H 跳的参数,即参数量为 O ( H × F ) O(H\times{F}) 使得diffusion-convolutional representation不受输入大小的限制

在计算出 Z Z 以后,过一层全链接获得输出 Y Y ,使用 Y ^ \hat{Y} 表示硬分类预测结果,使用 P ( Y X ) \mathbb{P}(Y|X) 表示预测几率,计算方式以下
Y ^ = arg max ( f ( W d Z ) ) \hat{Y}=\arg \max \left(f\left(W^{d} \odot Z\right)\right)

P ( Y X ) = softmax ( f ( W d Z ) ) \mathbb{P}(Y | X)=\operatorname{softmax}\left(f\left(W^{d} \odot Z\right)\right)

对于图分类任务,直接采用全部节点表示的均值做为graph的representation
Z t = f ( W c 1 N t T P t X t / N t ) Z_{t}=f\left(W^{c} \odot 1_{N_{t}}^{T} P_{t}^{*} X_{t} / N_{t}\right)
其中, 1 N t 1_{N_t} 是全为1的 N t × 1 N_t\times{1} 的向量。

对于边分类任务,经过将每一条边转化为一个节点来进行训练和预测,这个节点与原来的边对应的首尾节点相连,转化后的图的邻接矩阵 A t A_t' 能够直接从原来的邻接矩阵 A t A_t 增长一个incidence matrix获得
A t = ( A t B t T B t 0 ) A_{t}^{\prime}=\left(\begin{array}{cc}{A_{t}} & {B_{t}^{T}} \\ {B_{t}} & {0}\end{array}\right)
以后,使用 A t A_t' 来计算 P t P_t' ,并用来替换 P t P_t 来进行分类。

对于模型训练,使用梯度降低法,并采用early-stop方式获得最终模型。

实验结果

节点分类任务的实验数据集使用Cora和Pubmed数据集,包含scientific papers(至关于node)、citations(至关于edge)和subjects(至关于label)。实验评估标准使用分类准确率以及F1值。

节点分类的实验结果以下

在这里插入图片描述

能够看出使用各类评估标准,DCNN效果都是最好的。

图分类任务的实验结果以下

在这里插入图片描述
能够看出,在不一样数据集上,DCNN在图分类任务上并无明显表现出很好的效果。

优缺点

优势

  • 节点分类准确率很高
  • 灵活性
  • 快速

缺点

  • 内存占用大:DCNN创建在密集的张量计算上,须要存储大量的张量,须要 O ( N t 2 H ) O(N_t^2H) 的空间复杂度。
  • 长距离信息传播不足:模型对于局部的信息获取较好,可是远距离的信息传播不足。

4. Tree-LSTM

序列型的LSTM模型扩展到树型的LSTM模型,简称Tree-LSTM,并根据孩子节点是否有序,论文提出了两个模型变体,Child-Sum Tree-LSTM模型和N-ary Tree-LSTM模型。和序列型的LSTM模型的主要不一样点在于,序列型的LSTM从前一时刻获取隐藏状态 h t h_t ,而树型的LSTM从其全部的孩子节点获取隐藏状态。

模型详解

Tree-LSTM模型对于每个孩子节点都会产生一个“遗忘门” f j k f_{jk} ,这个使得模型可以从全部的孩子节点选择性地获取信息和结合信息

Child-Sum Tree-LSTMs

该模型的更新方程以下
h ~ j = k C ( j ) h k i j = σ ( W ( i ) x j + U ( i ) h ~ j + b ( i ) ) f j k = σ ( W ( f ) x j + U ( f ) h k + b ( f ) ) o j = σ ( W ( o ) x j + U ( o ) h ~ j + b ( o ) ) u j = tanh ( W ( u ) x j + U ( u ) h ~ j + b ( u ) ) c j = i j u j + k C ( j ) f j k c k h j = o j tanh ( c j ) \begin{aligned} \tilde{h}_{j} &=\sum_{k \in C(j)} h_{k} \\ i_{j} &=\sigma\left(W^{(i)} x_{j}+U^{(i)} \tilde{h}_{j}+b^{(i)}\right) \\ f_{j k} &=\sigma\left(W^{(f)} x_{j}+U^{(f)} h_{k}+b^{(f)}\right) \\ o_{j} &=\sigma\left(W^{(o)} x_{j}+U^{(o)} \tilde{h}_{j}+b^{(o)}\right) \\ u_{j} &=\tanh \left(W^{(u)} x_{j}+U^{(u)} \tilde{h}_{j}+b^{(u)}\right) \\ c_{j} &=i_{j} \odot u_{j}+\sum_{k \in C(j)} f_{j k} \odot c_{k} \\ h_{j} &=o_{j} \odot \tanh \left(c_{j}\right) \end{aligned} 其中, C ( j ) C(j) 表示 j j 节点的邻居节点的个数, h k h_k 表示节点 k k 的隐藏状态, i j i_j 表示节点 j j 的”输入门“, f j k f_{jk} 表示节点 j j 的邻居节点 k k 的“遗忘门“, o j o_j 表示节点 j j 的”输出门“。

这里的关键点在于第三个公式的 f j k f_{jk} ,这个模型对节点 j j 的每一个邻居节点 k k 都计算了对应的”遗忘门“向量,而后在第六行中计算 c j c_j 时对邻居节点的信息进行”遗忘“和组合。

因为该模型是对全部的孩子节点求和,因此这个模型对于节点顺序不敏感的,适合于孩子节点无序的状况。

N-ary Tree-LSTMs

假如一个树的最大分支数为 N N (即孩子节点最多为 N N 个),并且孩子节点是有序的,对于节点 j j ,对于该节点的第 k k 个孩子节点的隐藏状态和记忆单元分别用 h j k h_{jk} c j k c_{jk} 表示。模型的方程以下
i j = σ ( W ( i ) x j + = 1 N U ( i ) h j + b ( i ) ) f j k = σ ( W ( f ) x j + = 1 N U k ( f ) h j + b ( f ) ) o j = σ ( W ( o ) x j + = 1 N U ( o ) h j + b ( o ) ) u j = tanh ( W ( u ) x j + = 1 N U ( a ) h j + b ( a ) ) c j = i j u j + = 1 N f j c j h j = o j tanh ( c j ) \begin{aligned} i_{j} &=\sigma\left(W^{(i)} x_{j}+\sum_{\ell=1}^{N} U_{\ell}^{(i)} h_{j \ell}+b^{(i)}\right) \\ f_{j k} &=\sigma\left(W^{(f)} x_{j}+\sum_{\ell=1}^{N} U_{k \ell}^{(f)} h_{j \ell}+b^{(f)}\right) \\ o_{j} &=\sigma\left(W^{(o)} x_{j}+\sum_{\ell=1}^{N} U_{\ell}^{(o)} h_{j \ell}+b^{(o)}\right) \\ u_{j} &=\tanh \left(W^{(u)} x_{j}+\sum_{\ell=1}^{N} U_{\ell}^{(a)} h_{j \ell}+b^{(a)}\right) \\ c_{j} &=i_{j} \odot u_{j}+\sum_{\ell=1}^{N} f_{j \ell} \odot c_{j \ell} \\ h_{j} &=o_{j} \odot \tanh \left(c_{j}\right) \end{aligned} 值得注意的是该模型为每一个孩子节点都单独地设置了参数 U l U_{l}

模型训练

分类任务

分类任务定义为在类别集 Y \mathcal{Y} 中预测出正确的标签 y ^ \hat{y} ,对于每个节点 j j ,使用一个softmax分类器来预测节点标签 y ^ j \hat{y}_j ,分类器取每一个节点的隐藏状态 h j h_j 做为输入
p ^ θ ( y { x } j ) = softmax ( W ( s ) h j + b ( s ) ) y ^ j = arg max y p ^ θ ( y { x } j ) \begin{aligned} \hat{p}_{\theta}\left(y |\{x\}_{j}\right) &=\operatorname{softmax}\left(W^{(s)} h_{j}+b^{(s)}\right) \\ \hat{y}_{j} &=\arg \max _{y} \hat{p}_{\theta}\left(y |\{x\}_{j}\right) \end{aligned} 损失函数使用negative log-likelihood
J ( θ ) = 1 m k = 1 m log p ^ θ ( y ( k ) { x } ( k ) ) + λ 2 θ 2 2 J(\theta)=-\frac{1}{m} \sum_{k=1}^{m} \log \hat{p}_{\theta}\left(y^{(k)} |\{x\}^{(k)}\right)+\frac{\lambda}{2}\|\theta\|_{2}^{2} 其中, m m 是带有标签的节点数量, λ \lambda L 2 L2 是正则化超参。

语义相关性任务

该任务给定一个句子对(sentence pair),模型须要预测出一个范围在 [ 1 , K ] [1,K] 之间的实数值,这个值越高,表示类似度越高。

论文首先对每个句子产生一个representation,两个句子的表示分别用 h L h_L h R h_R 表示,获得这两个representation以后,从distance和angle两个方面考虑,使用神经网络来获得 ( h L , h R ) (h_L,h_R) 类似度:
h × = h L h R h + = h L h R h s = σ ( W ( × ) h × + W ( + ) h + + b ( h ) ) p ^ θ = softmax ( W ( p ) h s + b ( p ) ) y ^ = r T p ^ θ \begin{aligned} h_{ \times} &=h_{L} \odot h_{R} \\ h_{+} &=\left|h_{L}-h_{R}\right| \\ h_{s} &=\sigma\left(W^{( \times)} h_{ \times}+W^{(+)} h_{+}+b^{(h)}\right) \\ \hat{p}_{\theta} &=\operatorname{softmax}\left(W^{(p)} h_{s}+b^{(p)}\right) \\ \hat{y} &=r^{T} \hat{p}_{\theta} \end{aligned}