拉普拉斯算子属于卷积方法吗_论文阅读·图卷积

40ce149ad46a0af3aaabdb3ea84725f0.png

SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS

连接:Semi-supervised classification with graph convolutional networks

创新点:1)FAST APPROXIMATE CONVOLUTIONS ON GRAPHS,在图卷积模型中提出一种简单有效的层式传播方法。2)SEMI-SUPERVISED NODE CLASSIFICATION,应用在半监督的任务上面。

1. FAST APPROXIMATE CONVOLUTIONS ON GRAPHS

先介绍频谱图形卷积,类似与标准的卷积网络的每一层,定义为输入量

与经过傅里叶域参数化的滤波器
进行相乘操作:

归一化图形拉普拉斯算子

,式中
代表
的特征向量的矩阵, Λ是它的特征值对角矩阵。最后的
的图形傅里叶变换,我们可以将
理解为为
特征值的一个函数,比如

由于频谱卷积所提出的公式计算开销过于庞大,特征向量矩阵

的相乘运算时间复杂度是
的平方。此外,在处理数据量大的图结构时拉普拉斯算子
的特征分解运算开销大。2011年Hammond等人提出
可以通过一个切比雪夫多项式
的截断展开为第
阶来表示:

其中,

表示
的最大特征值,
是一个切比雪夫系数的向量。切比雪夫多项式是被递归的定义为
,且
。然后我们得到新的图卷积公式:

其中

,这样就通过
来调节能够影响当前顶点的最大距离顶点,可以类比于图像中的感受野的大小。

本文的改进:通过

次的1阶卷积的结构来替代一次性的
阶卷积操作,将K设为1的模型命名为层状线性模型(LAYER-WISE LINEAR MODEL)。作者直观的觉得这个模型能够通过较宽的节点分布来减轻分类问题中节点邻近区域结构的过拟合问题。此外,从运算开销来看,将K设置为1得到的层状线性运算也能够进一步构建更深的网络模型。

进一步近似的令

约等于2:

式中

是卷积神经网络滤波器的参数。通常来说,限制参数的数量可以进一步解决过拟合并将各层的运算量最小化,因此,基于这个思想可进一步将
都等价于
简化式:

为了防止过拟合,加入再规范技巧(renormalization trick):

其中,

综上所述,图卷积的操作的模型如下:

其中

,N是顶点向量的大小,C是输入的通道数。
是图卷积层的参数。
是卷积最后的结果。

2. SEMI-SUPERVISED NODE CLASSIFICATION

经过上述的模型中图卷积层的操作,我们首先处理两层的图卷积神经网络。

式子中

针对半监督的数据,我们定义以下的交叉熵损失:

其中

是所有有标签数据的集合。整个模型的结构如图:

e956968505e4b194eaa87b5223d1e68f.png

对模型中间层的可视化结果如图:

d90b6d08c8a81150a3857feb007b792d.png

总结:

  • 基于拉普拉斯算子正则的方法,假设相邻顶点具备相同性质。这样的假设是有相当大的局限性。
  • 基于Skip-gram的顶点向量的方式,不是端到端的。用起来的不方便。
  • 本文的方法结合两者,加速了拉普拉斯算子的图卷积,并且基于顶点向量实现了端到端的模型构建。
  • 更进一步,实现了半监督的学习。效果拔群。

代码:

class GraphConvolution(Layer):
    """Graph convolution layer."""
    def __init__(self, input_dim, output_dim, placeholders, dropout=0.,
                 sparse_inputs=False, act=tf.nn.relu, bias=False,
                 featureless=False, **kwargs):
        super(GraphConvolution, self).__init__(**kwargs)
        # 类里面的定义

    def _call(self, inputs):
        x = inputs

        # dropout
        if self.sparse_inputs:
            x = sparse_dropout(x, 1-self.dropout, self.num_features_nonzero)
        else:
            x = tf.nn.dropout(x, 1-self.dropout)

        # convolve
        supports = list()
        for i in range(len(self.support)):
            if not self.featureless:
                pre_sup = dot(x, self.vars['weights_' + str(i)],
                              sparse=self.sparse_inputs)
            else:
                pre_sup = self.vars['weights_' + str(i)]
            support = dot(self.support[i], pre_sup, sparse=True)
            supports.append(support)
        output = tf.add_n(supports)
        # 通过for循环来实现矩阵的乘积。

        # bias
        if self.bias:
            output += self.vars['bias']

        return self.act(output)

思考:

我们能够将A矩阵进行新的表示来进一步的加速运算,毕竟有N个顶点就要N*N的矩阵。新的一年,新的开始。

参考文献:

  • SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS个人理解https://github.com/tkipf/gcn/blob/master/gcn/layers.py
  • semi_supervised classification with graph convolutional networks论文阅读报告(1)
  • https://github.com/tkipf/gcn/blob/master/gcn/layers.py
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值