tensorflow实现GNN的max aggregator

本文介绍了如何利用TensorFlow实现图神经网络(GNN)中的Max Aggregator。作者首先给出了一个简易版的实现,通过邻接矩阵和特征矩阵计算每个点邻居特征的最大值,但由于空间复杂度为O(N^3),导致显存占用过大。随后,作者提出改进方案,将空间复杂度降低到O(|E|*|V|),实际应用中优化后约为O(N^2)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

笔者想要实现GNN中的max aggregator,要求如下:
输入:1. 邻接矩阵A∈{0,1}N×NA\in\{0,1\}^{N\times N}A{0,1}N×N,2. 各点特征矩阵X∈RN×CX\in R^{N\times C}XRN×C
输出:每个点的邻居(点iii和点jjj是邻居⇔A[i,j]=1\Leftrightarrow A[i,j]=1A[i,j]=1)特征值的最大值M∈RN×CM\in R^{N\times C}MRN×C
其中点数NNN未知,特征维数CCC可知。

笔者首先实现了一个简易版本,将XXX堆积NNN个,对应于邻接矩阵展开后的NNN行,点乘提取相应特征后取各点对应的最大值,代码如下:

output_shape = X.get_shape()
node_num = tf.shape(X)[0]

flat_A = tf.reshape(A,[-1,1])
tiled_X = tf.tile(X,[node_num,1],name='tiled_flat_X')
flat_X_dot_A = tf.reshape(tiled_X*flat_A - 1e4*(1-flat_A),[node_num,node_num,-1])
output_X = tf.reduce_max(flat_X_dot_A,axis=1,keepdims=False)

output_X.set_shape(output_shape)
return output_X

上诉代码中tile命令强制使用了O(N3)O(N^3)O(N3)的空间,占用极大显存,而且没有tf的优化空间。

将提取邻居特征的步骤从点乘换成gather,配合while_loop也可实现功能,而最大空间复杂度降为O(∣E∣∣V∣)O(|E| |V|)O(EV),实测tf优化后约为O(N2)O(N^2)O(N2),代码如下:

def _maximum_neighborhood(self,index,A,X,out):
    with tf.name_scope(self.name_scope):
        neigh = tf.boolean_mask(X,A[index])
        max_neigh = tf.reduce_max(neigh,keepdims=True,axis=0)
        out = tf.concat([out,max_neigh],axis=0)
    return out
def __call__(self,A,X):
    '''
    input arguments:
        A is the graph adjacency matrix of type tf.Tensor and of shape [N,N]
        X is the node attributes matrix of type tf.Tensor and of shape [N,C]
        , where N is the number of nodes and C is the channel number of node attributes
    output arguments:
        aggregated new node attributes X' of type tf.Tensor and of shape [N,C]
    '''
    with tf.name_scope(self.name_scope):
        output_shape = X.get_shape()
        node_num = tf.shape(X)[0]
        output_dim = int(output_shape[-1])

        output_X = tf.zeros([0,output_dim])
        _,_,_,output_X = tf.while_loop(lambda index,A,X,out: index<node_num,\
                      lambda index,A,X,out: [index+1,A,X,self._maximum_neighborhood(index,A,X,out)],\
                      loop_vars = [tf.zeros([],tf.int32),A,X,output_X],\
                      shape_invariants = [tf.TensorShape([]),A.get_shape(),X.get_shape(),tf.TensorShape([None,output_dim])])
                      
        output_X.set_shape(output_shape)
        return output_X
人工智能(AI)最近经历了复兴,在视觉,语言,控制和决策等关键领域取得了重大进展。 部分原因在于廉价数据和廉价计算资源,这些资源符合深度学习的自然优势。 然而,在不同的压力下发展的人类智能的许多定义特征仍然是当前方法无法实现的。 特别是,超越一个人的经验 - 从婴儿期开始人类智能的标志 - 仍然是现代人工智能的一项艰巨挑战。 以下是部分立场文件,部分审查和部分统一。我们认为组合概括必须是AI实现类似人类能力的首要任务,结构化表示和计算是实现这一目标的关键。就像生物学利用自然和培养合作一样,我们拒绝“手工工程”和“端到端”学习之间的错误选择,而是倡导一种从其互补优势中获益的方法。我们探索如何在深度学习架构中使用关系归纳偏差来促进对实体,关系和组成它们的规则的学习。我们为AI工具包提供了一个新的构建模块,具有强大的关系归纳偏差 - 图形网络 - 它概括和扩展了在图形上运行的神经网络的各种方法,并为操纵结构化知识和生成结构化行为提供了直接的界面。我们讨论图网络如何支持关系推理和组合泛化,为更复杂,可解释和灵活的推理模式奠定基础。作为本文的配套文件,我们还发布了一个用于构建图形网络的开源软件库,并演示了如何在实践中使用它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值