结构体在cuda核函数里面不能用吗_Chebyshev多项式作为GCN卷积核

cccdada411a24a064adc2941832eb0c7.png

利用Chebyshev多项式拟合卷积核是GCN论文中广泛应用的方法在这篇文章中,我会推导相应的公式,并举一个具体的栗子。

在之前的回答中(如何理解 Graph Convolutional Network(GCN)?),已经推导出了如下GCN的形式:

其中,

是由拉普拉斯矩阵的特征向量构建的矩阵,
是特征值构成的对角矩阵,
是卷积核,
是输入特征,
是激活函数。

利用Chebyshev多项式代替卷积核,就可以得到下式:

其中,

阶的Chebyshev多项式,
是对应的系数(
也就是训练中迭代更新的参数)。
是re-scaled的特征值对角矩阵,进行这个shift变换的原因是Chebyshev多项式的输入要在
之间。

这里大家可能会疑问为什么会有

这个区间的限制?因为第一类Chebyshev多项式的解析形式是(详细内容可以参考第50期 切比雪夫多项式及其应用):

因为

函数,所以输入必须在
之间。

那么现在问题来了,如何把

转换在上述区间?一共有两步:
  • 由于
    (原因为拉普拉斯矩阵半正定,特征值非负),除以最大特征值
    ,就转化在
    区间
  • 再进行
    ,就实现了目标。于是就有:

把式(2)带入到式(1)中,即可得到:

因为Chebyshev多项式作用在对角矩阵上,不会影响矩阵运算。那就改变一下运算顺序,先把矩阵运算放进去

因为

表示拉普拉斯矩阵),代入可以得

其中,

。这样变换的好处在于:计算过程无需再进行特征向量分解。

(最大特征值

可以利用幂迭代法(power iteration)求出,详细内容可以参考
https://www. cnblogs.com/fahaizhong/ p/12240051.html )

在实际运算过程中,可以利用Chebyshev多项式的性质,进行递推:

下面来举个栗子,以下图为例

50162496898363477d3a8b1de0601a0b.png
graph示意图

这里我们利用对阵型拉普拉斯矩阵,

  • 当K=1时,卷积核为

当K=2时,卷积核为

结合图的邻接关系,明显可以看出卷积核的localize特性。

通过观察我们可以发现,当K=2时,对角线上的卷积系数中

前的系数很小。这种方式的好处在于:顶点自身特征基本由
控制,
控制一阶邻居的特征。

代码实现可以参考(源码地址:https://github.com/tkipf/gcn):

def chebyshev_polynomials(adj, k):
    """Calculate Chebyshev polynomials up to order k. Return a list of sparse matrices (tuple representation)."""
    print("Calculating Chebyshev polynomials up to order {}...".format(k))

    adj_normalized = normalize_adj(adj) # D^{-1/2}AD^{1/2}
    laplacian = sp.eye(adj.shape[0]) - adj_normalized  # L = I_N - D^{-1/2}AD^{1/2}
    largest_eigval, _ = eigsh(laplacian, 1, which='LM') # lambda_{max}
    scaled_laplacian = (2. / largest_eigval[0]) * laplacian - sp.eye(adj.shape[0]) # 2/lambda_{max}L-I_N

    # 将切比雪夫多项式的 T_0(x) = 1和 T_1(x) = x 项加入到t_k中
    t_k = list()
    t_k.append(sp.eye(adj.shape[0])) 
    t_k.append(scaled_laplacian)
    
    # 依据公式 T_n(x) = 2xT_n(x) - T_{n-1}(x) 构造递归程序,计算T_2 -> T_k项目
    def chebyshev_recurrence(t_k_minus_one, t_k_minus_two, scaled_lap):
        s_lap = sp.csr_matrix(scaled_lap, copy=True)
        return 2 * s_lap.dot(t_k_minus_one) - t_k_minus_two

    for i in range(2, k+1):
        t_k.append(chebyshev_recurrence(t_k[-1], t_k[-2], scaled_laplacian))

    return sparse_to_tuple(t_k)

关于参数共享方式的讨论,可以参考我的另一篇文章

superbrother:解读三种经典GCN中的Parameter Sharing​zhuanlan.zhihu.com
78639dd041f4b811d32ab3fce2c173f1.png

在我最近发表的一篇论文中:就将结合Chebyshev多项式的GCN作为基于有限检测器的路网规模交通流量估计问题(一种特殊的时空矩阵填充问题)的baseline。既原文4.2节部分的CGMC模型,目前论文可以在12月27号前免费访问。感兴趣的朋友可以阅读如下的链接。

Please wait whilst we redirect you​authors.elsevier.com

Zhang, Z., Li, M., Lin, X., & Wang, Y. (2020). Network-wide traffic flow estimation with insufficient volume detection and crowdsourcing data.Transportation Research Part C: Emerging Technologies,121, 102870.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值