门控图神经网络(GGNN)及代码分析

门控图神经网络GGNN及代码分析

基本概念

GGNN是一种基于GRU的经典的空间域message passing的模型

问题描述

一个图 G = (V, E), 节点v ∈ V中存储D维向量,边e ∈ E中存储D × D维矩阵, 目的是构建网络GGNN。
实现每一次参数更新时,每个节点既接受相邻节点的信息,又向相邻节点发送信息。

主要贡献

基于GRU提出了GGNN,利用RNN类似原理实现了信息在graph中的传递。
在这里插入图片描述

传播模型

在这里插入图片描述
在这里插入图片描述

输出模型

在这里插入图片描述

来源论文
Gated Graph Sequence Neural Networks,ICLR 2016
链接:https://arxiv.org/abs/1511.05493
官方实现(Lua):https://github.com/yujiali/ggnn
第三方实现(pytorch):https://github.com/calebmah/ggnn.pytorch
GRU概念详见:https://blog.csdn.net/lthirdonel/article/details/88945257

代码分析

只看论文确实让人觉得玄学,特别是annotation部分,很迷
结合代码来看就好很多,这里例举的是@JamesChuanggg的pytorch实现ggnn.pytorch,这个实现的代码相比于官方版本来说,容易读很多

1.annotation
annotation = np.zeros([n_nodes, n_annotation_dim])
annotation[target[1]-1][0] = 1	

核心实现就是上面这个,除了表达到达关系部分用了1,其他padding成了0

2.每一个时间步的实现
class Propogator(nn.Module):
    """
    Gated Propogator for GGNN
    Using LSTM gating mechanism
    """
    def __init__(self, state_dim, n_node, n_edge_types):
        ## 初始化参照源代码
    def forward(self, state_in, state_out, state_cur, A):
        # 入边向量和出边向量
        A_in = A[:, :, :self.n_node*self.n_edge_types]
        A_out = A[:, :, self.n_node*self.n_edge_types:]

        # 入边向量和出边向量分别和图做计算
        a_in = torch.bmm(A_in, state_in)
        a_out = torch.bmm(A_out, state_out)
        a = torch.cat((a_in, a_out, state_cur), 2)

        # 类GRU部分
        r = self.reset_gate(a)
        z = self.update_gate(a)
        joined_input = torch.cat((a_in, a_out, r * state_cur), 2)
        h_hat = self.tansform(joined_input)

        output = (1 - z) * state_cur + z * h_hat

        return output
3.网络结构
class GGNN(nn.Module):
    """
    Gated Graph Sequence Neural Networks (GGNN)
    Mode: SelectNode
    Implementation based on https://arxiv.org/abs/1511.05493
    """
    def __init__(self, opt):
        # 初始化参考源代码
    def forward(self, prop_state, annotation, A):
        # prop_state:论文中的h
        # annotation:节点标注
        # A:图
        for i_step in range(self.n_steps):
            # 对于每一个时间步循环
            in_states = []
            out_states = []
            for i in range(self.n_edge_types):
                # 对输入特征做两个分支的全连接,得到入边特征,和出边特征
                # 每一种边都要计算一次
                in_states.append(self.in_fcs[i](prop_state))
                out_states.append(self.out_fcs[i](prop_state))
            # 将所有种类的边得到的特征连接起来
            in_states = torch.stack(in_states).transpose(0, 1).contiguous()
            in_states = in_states.view(-1, self.n_node*self.n_edge_types, self.state_dim)
            out_states = torch.stack(out_states).transpose(0, 1).contiguous()
            out_states = out_states.view(-1, self.n_node*self.n_edge_types, self.state_dim)

            # 用门控图模块更新h
            prop_state = self.propogator(in_states, out_states, prop_state, A)

        join_state = torch.cat((prop_state, annotation), 2)

        output = self.out(join_state)
        output = output.sum(2)

        return output

  • 21
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
GGNN是一种神经网络模型,是用于处理带有动态结构的问题的一种复杂模型。PyTorch是一个开源的机器学习库,它能够为形计算提供强大的支持,因此我们可以用PyTorch来实现GGNN模型。 GGNN模型的核心是使用门控递归神经网络(GRU)来更新节点状态,其递归方式类似于循环神经网络(RNN),只是它的输入和输出不仅仅是当前时刻的状态,还包括形结构信息。为了处理形数据,GGNN模型使用卷积操作来将节点和边属性编码为张量,并将这些张量视为网络的输入。 使用PyTorch实现GGNN模型的步骤如下: 1. 定义形结构:根据实际问题定义节点数量和边的类型、权重等。 2. 数据预处理:将数据处理为合适的格式,使之能够在PyTorch中进行操作。这通常涉及到数据编码和分批。 3. 构建模型:实现 GGNN 的模型结构,包括隐藏状态的初始化、门控递归神经网络(GRU)的计算、更新形结构信息等。 4. 模型训练:在一组训练数据和目标数据上训练 GGNN 模型,使得模型在形结构数据中具有较好的表现。 5. 模型测试:在提供测试数据的情况下测试模型的表现,考察其准确性和有效性。 总的来说,PyTorch为我们提供了快速、灵活、高性能的工具,在处理形数据问题和实现复杂模型时都具有很强的潜力。当然,实现 GGNN 模型也需要根据实际需要进行一些优化和参数调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值