论文信息

论文标题:Graph Auto-Encoder via Neighborhood Wasserstein Reconstruction
论文作者:Shaked Brody, Uri Alon, Eran Yahav
论文来源:2022,ICLR
论文地址:download 
论文代码:download

1 Abstract

  提出了一种新的图自编码器,其中 Encoder 为普通的 GAE,而 Decoder 实现了特征重建、度重建,以及一种基于 2-Wasserstein distance 的邻居重建。

2 Introduction

  

  两种典型的 GAE :

    • GAE(Kipf & Welling, 2016)使用简单的重建链接结构,导致无法区分像 (2, 4) 和 (3, 5)这样的点;
    • GraphWave (Donnat et al., 2018) 面向结构的嵌入模型不考虑节点特征和空间接近度,无法区分像 (0, 1), (2, 4) 和 (3,5) 的节点对;

  本文提出的 新框架为 Neighborhood Wasserstein Reconstruction Graph Auto-Encoder (NWR-GAE),将重构损失分解为三个部分,即 节点度、邻居表示分布和节点特征。

  其中最重要的是重建邻居分布,由于在 k-hop 消息传递后,在节点 v 的表示中编码的信息来源本质上来自于 vkhop 邻域(Fig.2)。因此,节点 v 的良好表示应该捕获其 k 跳邻域中所有节点的特征信息,这与下游任务是无关的。

  

Optimal-transport (OT) losses

  考虑两个分布之间的距离:当两个分布有非重叠的部分时,f 散度家族存在非连续的问题。

  Suppose we have two probability distributions, P and Q :

 

  (x,y)P,x=0 and yU(0,1)(x,y)Q,x=θ,0θ1 and yU(0,1)

  

  When θ0

 

    DKL(PQ)=x=0,yU(0,1)1log10=+


    DKL(QP)=x=0,yU(0,1)1log10=+


    DJS(P,Q)=12(x=0,yU(0,1)1log11/2+x=0,yU(0,1)1log11/2)=log2
   

    W(P,Q)=|θ|

 

  But when θ=0, two distributions are fully overlapped:

 

    DKL(PQ)=DKL(QP)=DJS(P,Q)=0

 

    W(P,Q)=0=|θ|

  可以使用 最优传输 OT 的 2-Wasserstein distance 衡量两个分布之间的距离,在这里,给出一个基于 2-Wasserstein distance 的常用的 OT 损失:

  Definition 2.1. Let P, Q denote two probability distributions with finite second moment defined on ZRm . The 2-Wasserstein distance between P and Q defined on Z, ZRm is the solution to the optimal mass transportation problem with 2 transport cost (Villani, 2008):

    W2(P,Q)=(infγΓ(P,Q)Z×ZZZ22dγ(Z,Z))1/2

  where Γ(P,Q) contains all joint distributions of (Z,Z) with marginals P and Q respectively.

3 Methods

  预先定义 :

    • Encoder:ϕ
    • Decoder:ψ

  Encoder 可以是任何基于消息传递的 GNNs,Decoder 可以分成三部分:ψ=(ψs,ψp,ψd)

3.1 Neighborhood peconstruction principle

  本文只考虑 1-hop 邻域重建。用 H(0) 代表 X 初始特征矩阵,对于每个节点 vV 被 GNN Enocoder 编码后 ,其节点表示  hv(1) 从 hv(0) 及其邻居表示 HNv(0)={hu(0)uNv} 。本文主要目的是重构来自 hv(0) 和 HNv(0) 的信息,因此有

    minϕ,ψvVM((hv(0),HNv(0)),ψ(hv(1))) s.t. hv(1)=ϕ(hv(0),HNv(0)),vV(2)

  其中,M(,) 定义了重建损失,M 可分为两部分,分别测量自 特征重建 邻域重建

    M((hv(0),HNv(0)),ψ(hv(1)))=Ms(hv(0),ψ(hv(1)))+Mn(HNv(0),ψ(hv(1)))(3)

  对于特征重建,及其特征重建损失函数Ms

    Ms(hv(0),ψ(hv(1)))=hv(0)ψs(hv(1))2(4)

代码中:

  feature_losses = self.feature_loss_func(h0, self.feature_decoder(gij))

其实 h0 代表原始特征矩阵 X,而 gij 是经过四层的 GCN encoder 得到的隐表示,然后使用一个 FNN 的 feature_decoder 将 gij 的维度映射成和  X 一样大。

   Mn 被分为度重建和 邻居重建,对于节点 v,邻域信息被表示为 i.i.d .的经验实现从 Pv(0) 中采样 dv 元素,其中 Pv(0)1dvuNvδhu(0)。具体来说,采用

    Mn(HNv(0),ψ(hv(1)))=(dvψd(hv(1)))2+W22(Pv(0),ψp(1)(hv(1)))(5)

Generalizing to k-hop neighborhood reconstruction

  

  本文期望 hv(k) 直接重构 HNv(i)   i<k1。具体来说,对于每个节点 vV,使用重构损失

  M((hv(0),{HNv(i)0ik1}),ψ(hv(k)))=Ms(hv(0),ψ(hv(k)))+i=0k1Mn(HNv(i),ψ(hv(k)))=λshv(0)ψs(hv(k))2+λd(dvψd(hv(k)))2+i=0k1W22(Pv(i),ψp(i)(hv(k)))(6)

  其中 ψs 是解码初始特征,ψd 是度解码,ψp(i)0ik1 是解码 i 层邻域表示分布 Pv(i)(:≜1dvuNvδhu(i))λsλd 为非负性超参数。因此,k 跳邻域重建的全部目标是

    minϕ,ψvVM((hv(0),{HNv(i1)1ik}),ψ(hv(k))) s.t. H(i)=ϕ(i)(H(i1)),1ik(7)

  其中,ϕ={ϕ(i)1ik} 包括 k 个GNN层,MEq.6 中定义。

  这一小节,公式写的很迷,你只需要知道期望 hv(k) 直接重构 HNv(i)   i<k1 ,后面我会用说人话的方式解读。

3.2 Decoding distributions——Decoders ψp(i),0ik1

  Note :上述图说的其实是使用 第 k 的节点 v 的节点表示hv(k)重建邻域 HNv(k1)

  

    ψp(i)(hv(k))=FNNp(i)(ξ),ξN(μv,Σv) where μv=FNNμ(hv(k)),Σv=diag(exp(FNNσ(hv(k))))(8)

上代码悟:

复制代码
self.m = torch.distributions.Normal(torch.zeros(sample_size, hidden_dim),torch.ones(sample_size, hidden_dim)) 
self.mlp_mean = nn.Linear(hidden_dim, hidden_dim)
self.mlp_sigma = nn.Linear(hidden_dim, hidden_dim)

sampled_embeddings_list, mark_len_list = self.sample_neighbors(neighbor_indexes, neighbor_dict, to_layer)    #从第 k-1 层采样节点的5个邻居节点,未满五个的使用 0 填充特征矩阵
for i, neighbor_embeddings1 in enumerate(sampled_embeddings_list):
    # Generating h^k_v, reparameterization trick
    index = neighbor_indexes[i]
    mask_len1 = mark_len_list[i]
    mean = from_layer[index].repeat(self.sample_size, 1)      #[5,512]   ,获取第 k 层的 节点 v 的表示
    mean = self.mlp_mean(mean)                                #[5,512]   ,线性变换
    sigma = from_layer[index].repeat(self.sample_size, 1)   #[5,512]   ,获取第 k 层的 节点 v 的表示
    sigma = self.mlp_sigma(sigma)                        #[5,512]   ,线性变换
    std_z = self.m.sample().to(device)                  # [5,512]  ,每个元素为均值为0,标准差为1 的正态分布生成
    var = mean + sigma.exp() * std_z                  # [5,512]      正态分布处理生成的邻居表示集合
    nhij = FNN_generator(var, device)                 #[5,512]  ,前馈神经网络线性变换
    generated_neighbors = nhij
复制代码

  接着就去计算 节点 v 的邻域 和生成的邻域之间的 2-Wasserstein distance ,这里的代码我没看懂,好难过啊。

3.3 Further discussion-Decoders ψsψd and Encoder ϕ

3.3.1 degree_decoder​

  重构节点度的解码器 ψd 是一个 FNN+ReLU 激活函数,使其值非负。

    ψd(hv(k))=exp(FNNd(hv(k)))(9)

度解码器代码:

复制代码
self.degree_decoder = FNN(hidden_dim, hidden_dim, 1, 4)

# FNN
class FNN(nn.Module):
    def __init__(self, in_features, hidden, out_features, layer_num):
        super(FNN, self).__init__()
        self.linear1 = MLP(layer_num, in_features, hidden, out_features)
        self.linear2 = nn.Linear(out_features, out_features)
    def forward(self, embedding):
        x = self.linear1(embedding)
        x = self.linear2(F.relu(x))
        return x

def degree_decoding(self, node_embeddings):
    degree_logits = F.relu(self.degree_decoder(node_embeddings))
    return degree_logits
View Code
复制代码

度重构采用的损失函数 MSE loss

self.degree_loss_func = nn.MSELoss()

3.3.2 feature_decoder​

  重构初始特征 hv(0) 的解码器 ψs 是一个 FNN。 

    ψs(hv(k))=FNNs(hv(k))(9)

特征解码器代码:

复制代码
self.feature_decoder = FNN(hidden_dim, hidden_dim, in_dim, 3)

# FNN
class FNN(nn.Module):
    def __init__(self, in_features, hidden, out_features, layer_num):
        super(FNN, self).__init__()
        self.linear1 = MLP(layer_num, in_features, hidden, out_features)
        self.linear2 = nn.Linear(out_features, out_features)
    def forward(self, embedding):
        x = self.linear1(embedding)
        x = self.linear2(F.relu(x))
        return x
View Code
复制代码

特征重构采用的损失函数 MSE loss

self.feature_loss_func = nn.MSELoss()

3.3.3 Encoder

  Encoder 可以为 GINConv、GraphConv、SAGEConv layer, 考虑到本实验堆叠了多层 GNNs layer,所以很容易造成过平滑,故,这里采用 PairNorm 缓解过平滑存在的问题。 

  {hv(0)vV}= pair-norm ({xvWvV})where W is a learnable parameter matrix. (10)

Encoder 代码:

复制代码
if GNN_name == "GCN":
    self.graphconv1 = GraphConv(in_dim, hidden_dim)            #[1433,512]
    self.graphconv2 = GraphConv(hidden_dim, hidden_dim)         #[512,512]
    self.graphconv3 = GraphConv(hidden_dim, hidden_dim)        #[512,512]
    self.graphconv4 = GraphConv(hidden_dim, hidden_dim)       #[512,512]

self.norm = PairNorm(norm_mode, norm_scale)

def forward_encoder(self, g, h):
    # K-layer Encoder
    # Apply graph convolution and activation, pair-norm to avoid trivial solution
    h0 = h
    l1 = self.graphconv1(g, h0)
    l1_norm = torch.relu(self.norm(l1))
    l2 = self.graphconv2(g, l1_norm)
    l2_norm = torch.relu(self.norm(l2))
    l3 = self.graphconv3(g, l2)
    l3_norm = torch.relu(l3)
    l4 = self.graphconv4(g, l1_norm) # 5 layers
    return l4, l3_norm, l2_norm, l1_norm, h0

class PairNorm(nn.Module):
    ...
    def forward(self, x):
        if self.mode == 'None':
            return x
        col_mean = x.mean(dim=0)
        if self.mode == 'PN':
            x = x - col_mean
            rownorm_mean = (1e-6 + x.pow(2).sum(dim=1).mean()).sqrt()
            x = self.scale * x / rownorm_mean
        if self.mode == 'PN-SI':
            x = x - col_mean
            rownorm_individual = (1e-6 + x.pow(2).sum(dim=1, keepdim=True)).sqrt()
            x = self.scale * x / rownorm_individual
        if self.mode == 'PN-SCS':
            rownorm_individual = (1e-6 + x.pow(2).sum(dim=1, keepdim=True)).sqrt()
            x = self.scale * x / rownorm_individual - col_mean
        return x
View Code
复制代码

4 Experiments

   我们设计实验来评估 NWR-GAE,重点关注以下研究问题:RQ1:与最先进的无监督图嵌入基线相比,NWR-GAE在基于结构角色的合成数据集上表现如何?RQ2:NWR-GAE及其消融如何与不同类型的真实世界图形数据集上的基线进行比较?RQ3:嵌入尺寸 d 和采样尺寸 q 等主要模型参数对NWR-GAE的影响是什么?

4.1 Experimental setup

4.1.1 Datasets

  Synthetic datasets

  Real-world graph Datasets

4.1.2 Baselines

  1) Random walk based (DeepWalk, node2vec)
  2) Structural role based (RoleX, struc2vec, GraphWave)
  3) Graph auto-encoder based (GAE, VGAE, ARGVA)
  4) Contrastive learning based (DGI, GraphCL, MVGRL)

4.1.3 Evaluation metrics

  • Homogeneity: conditional entropy of ground-truth among predicting clusters.
  • Completeness: ratio of nodes with the same ground-truth labels assigned to the same cluster.
  • Silhouette score: intra-cluster distance vs. inter-cluster distance.

4.2 Performance on synthetic datasets(RQ1)

  

4.3 Performance on real-world datasets(RQ2)

  

4.4 In-depth analysis of NWR-GAE

  

5 Conclusion

  在这项工作中,我们解决了现有的无监督图表示方法的局限性,并提出了第一个能够正确地捕获图中节点的接近性、结构和特征信息的模型,并在低维嵌入空间中对其进行区分编码的模型。该模型在合成和真实基准数据集上进行了广泛的测试,结果有力地支持了其声称的优势。由于它是通用的,有效的,而且在概念上也很容易理解,我们相信它有潜力作为无监督图表示学习的实际方法。在未来,它将有望看到其在不同领域的应用研究,以及仔细分析其鲁棒性和隐私性等潜在问题。

 

posted @   别关注我了,私信我吧  阅读(1170)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2021-08-20 Alex网络结构
2020-08-20 451. 根据字符出现频率排序
2020-08-20 剑指 Offer 40. 最小的k个数
2020-08-20 list使用详解
2020-08-20 STL---priority_queue
2020-08-20 1046. 最后一块石头的重量
Live2D
点击右上角即可分享
微信分享提示