残差网络(ResNet)中图神经网络中应用以及示例

在这里插入图片描述

一、ResNet概念

在传统的神经网络中,每一层都通过非线性变换(例如ReLU)将输入映射到输出。然而,当网络层数增加时,这些非线性变换会导致梯度消失的问题,使得网络难以训练。为了解决这个问题,ResNet提出了残差块(Residual Block)的概念。

残差块由两个主要部分组成:恒等映射(Identity Mapping)和残差映射(Residual Mapping)。恒等映射即将输入直接传递到输出,而残差映射则对输入进行非线性变换,并与恒等映射相加,从而形成残差。这样的设计使得模型可以学习到残差,即剩余的映射,而不仅仅是对输入的变换。

通过引入残差连接,ResNet使得信息可以更容易地在网络中传播。即使网络非常深,梯度也可以通过残差连接直接传递到较浅层,从而避免了梯度消失的问题。此外,ResNet还通过使用批归一化(Batch Normalization)等技术来加速训练过程和提高模型性能。

在图神经网络中,每个节点通常会聚合其邻居节点的信息,并通过非线性变换来更新自身的特征表示。然而,当图网络的深度增加时,由于多次的信息传递和变换,梯度可能会逐渐消失或爆炸,导致网络难以训练。

二、概念化例子

假设我们有以下10个用户节点和它们之间的关系:

节点1:年龄=25,性别=男,兴趣爱好=篮球
节点2:年龄=30,性别=女,兴趣爱好=足球
节点3:年龄=27,性别=女,兴趣爱好=音乐
节点4:年龄=35,性别=男,兴趣爱好=游泳
节点5:年龄=22,性别=女,兴趣爱好=阅读
节点6:年龄=29,性别=男,兴趣爱好=篮球
节点7:年龄=31,性别=女,兴趣爱好=足球
节点8:年龄=28,性别=男,兴趣爱好=音乐
节点9:年龄=33,性别=女,兴趣爱好=游泳
节点10:年龄=26,性别=男,兴趣爱好=阅读

现在,我们来逐步进行计算:

  1. 归一化处理:将每个节点的属性特征进行归一化处理,例如将年龄特征除以最大年龄值,将性别特征进行one-hot编码,将兴趣爱好特征进行标准化处理。

  2. 构建邻接矩阵A:根据节点之间的关系,我们可以构建一个10x10的邻接矩阵A来表示节点之间的连接关系。例如,如果节点i和节点j之间存在边,则A[i][j]=1;否则,A[i][j]=0。

  3. 定义图卷积层计算公式:假设我们定义了两个图卷积层,分别为第1层和第2层。对于第1层的节点隐藏表示 h i ( 1 ) h_i^{(1)} hi(1),我们可以通过以下公式进行计算:
    h 1 ( 1 ) = σ ( 1 d 1 h 2 ( 0 ) W ( 1 ) ) h 2 ( 1 ) = σ ( 1 d 2 ( h 1 ( 0 ) + h 3 ( 0 ) ) W ( 1 ) ) h 3 ( 1 ) = σ ( 1 d 3 ( h 2 ( 0 ) + h 4 ( 0 ) ) W ( 1 ) ) . . . h 10 ( 1 ) = σ ( 1 d 10 h 9 ( 0 ) W ( 1 ) ) h_1^{(1)} = \sigma\left(\frac{1}{\sqrt{d_1}} h_2^{(0)} W^{(1)}\right)\\ h_2^{(1)} = \sigma\left(\frac{1}{\sqrt{d_2}} (h_1^{(0)}+h_3^{(0)}) W^{(1)}\right)\\ h_3^{(1)} = \sigma\left(\frac{1}{\sqrt{d_3}} (h_2^{(0)}+h_4^{(0)}) W^{(1)}\right)\\ ...\\ h_{10}^{(1)} = \sigma\left(\frac{1}{\sqrt{d_{10}}} h_9^{(0)} W^{(1)}\right)\\ h1(1)=σ(d1 1h2(0)W(1))h2(1)=σ(d2 1(h1(0)+h3(0))W(1))h3(1)=σ(d3 1(h2(0)+h4(0))W(1))...h10(1)=σ(d10 1h9(0)W(1))
    其中,
    σ ( ⋅ ) \sigma(\cdot) σ()
    表示激活函数,
    W ( 1 ) W^{(1)} W(1)
    表示第1层的权重矩阵,
    d i d_i di
    表示节点i的度数。

  4. 引入残差连接:为了引入残差连接,我们将前一层的隐藏表示与当前层的输出进行相加。对于第2层的节点隐藏表示 h i ( 2 ) h_i^{(2)} hi(2),我们可以通过以下公式进行计算:

    h 1 ( 2 ) = σ ( 1 d 1 h 2 ( 1 ) W ( 2 ) + h 1 ( 1 ) ) h 2 ( 2 ) = σ ( 1 d 2 ( h 1 ( 1 ) + h 3 ( 1 ) ) W ( 2 ) + h 2 ( 1 ) ) h 3 ( 2 ) = σ ( 1 d 3 ( h 2 ( 1 ) + h 4 ( 1 ) ) W ( 2 ) + h 3 ( 1 ) ) . . . h 10 ( 2 ) = σ ( 1 d 10 h 9 ( 1 ) W ( 2 ) + h 10 ( 1 ) ) h_1^{(2)} = \sigma\left(\frac{1}{\sqrt{d_1}} h_2^{(1)} W^{(2)} + h_1^{(1)}\right)\\ h_2^{(2)} = \sigma\left(\frac{1}{\sqrt{d_2}} (h_1^{(1)}+h_3^{(1)}) W^{(2)} + h_2^{(1)}\right)\\ h_3^{(2)} = \sigma\left(\frac{1}{\sqrt{d_3}} (h_2^{(1)}+h_4^{(1)}) W^{(2)} + h_3^{(1)}\right)\\ ...\\ h_{10}^{(2)} = \sigma\left(\frac{1}{\sqrt{d_{10}}} h_9^{(1)} W^{(2)} + h_{10}^{(1)}\right)\\ h1(2)=σ(d1 1h2(1)W(2)+h1(1))h2(2)=σ(d2 1(h1(1)+h3(1))W(2)+h2(1))h3(2)=σ(d3 1(h2(1)+h4(1))W(2)+h3(1))...h10(2)=σ(d10 1h9(1)W(2)+h10(1))
    其中,
    σ ( ⋅ ) \sigma(\cdot) σ()
    表示激活函数,
    W ( 2 ) W^{(2)} W(2)
    表示第2层的权重矩阵,
    d i d_i di
    表示节点i的度数。

  5. 全连接层映射到职业标签:在网络的最后一层,我们可以添加一个全连接层将节点的隐藏表示映射到职业标签空间。假设我们有3个职业标签(例如医生、教师和工程师),我们可以通过以下公式进行计算:

    y 1 = σ ( h 1 ( 2 ) W ( 3 ) ) y 2 = σ ( h 2 ( 2 ) W ( 3 ) ) y 3 = σ ( h 3 ( 2 ) W ( 3 ) ) . . . y 10 = σ ( h 10 ( 2 ) W ( 3 ) ) y_1 = \sigma(h_1^{(2)} W^{(3)})\\ y_2 = \sigma(h_2^{(2)} W^{(3)})\\ y_3 = \sigma(h_3^{(2)} W^{(3)})\\ ...\\ y_{10} = \sigma(h_{10}^{(2)} W^{(3)})\\ y1=σ(h1(2)W(3))y2=σ(h2(2)W(3))y3=σ(h3(2)W(3))...y10=σ(h10(2)W(3))
    其中,
    σ ( ⋅ ) \sigma(\cdot) σ()
    表示激活函数,
    W ( 3 ) W^{(3)} W(3)
    表示全连接层的权重矩阵。

通过反向传播算法,我们可以优化网络参数,使得预测结果与真实标签尽可能接近。这样,我们就可以使用残差连接来构建图神经网络,并应用于社交网络数据的职业预测任务中。

三、含有具体数据的例子

假设我们有一个具有10个节点的图数据,并为每个节点赋予以下特征向量:

节点1: [0, 1]
节点2: [1, 0]
节点3: [1, 1]
节点4: [0, 0]
节点5: [1, 0]
节点6: [0, 1]
节点7: [1, 1]
节点8: [0, 0]
节点9: [1, 0]
节点10: [0, 1]

现在,我们来定义权重矩阵W,它是一个2x2的矩阵。我将选择以下权重值进行计算:

W = [[0.5, 0.2],
     [0.3, 0.8]]

下面是征进行线性变换和聚合的详细计算过程:

  1. 首先,进行线性变换,将节点特征与权重矩阵相乘。

    节点1:H1_1 = W · [0, 1] = [0.2, 0.8]
    节点2:H1_2 = W · [1, 0] = [0.5, 0.3]
    节点3:H1_3 = W · [1, 1] = [0.7, 1.1]
    节点4:H1_4 = W · [0, 0] = [0, 0]
    节点5:H1_5 = W · [1, 0] = [0.5, 0.3]
    节点6:H1_6 = W · [0, 1] = [0.2, 0.8]
    节点7:H1_7 = W · [1, 1] = [0.7, 1.1]
    节点8:H1_8 = W · [0, 0] = [0, 0]
    节点9:H1_9 = W · [1, 0] = [0.5, 0.3]
    节点10:H1_10 = W · [0, 1] = [0.2, 0.8]
    
  2. 接下来,进行聚合操作,将节点特征取平均值。

    H2 = mean([H1_1, H1_2, H1_3, H1_4, H1_5, H1_6, H1_7, H1_8, H1_9, H1_10])
       = [mean([0.2, 0.5, 0.7, 0, 0.5, 0.2, 0.7, 0, 0.5, 0.2]),
          mean([0.8, 0.3, 1.1, 0, 0.3, 0.8, 1.1, 0, 0.3, 0.8])]
       = [0.36, 0.64]
    
  3. 然后,我们将聚合结果通过ReLU激活函数进行非线性映射。

    H3 = ReLU(H2) = [max(0, 0.36), max(0, 0.64)] = [0.36, 0.64]
    

现在,我们来引入残差连接。假设在每一层的线性变换之后,我们都要添加一个残差连接。我们将把残差连接的结果与原始输入进行相加,并应用ReLU激活函数。

  1. 在第一层的线性变换之后,我们将残差连接的结果与原始输入相加:

    H1_res1 = H1_1 + [0, 1] = [0.2, 0.8] + [0, 1] = [0.2, 1.8]
    H1_res2 = H1_2 + [1, 0] = [0.5, 0.3] + [1, 0] = [1.5, 0.3]
    H1_res3 = H1_3 + [1, 1] = [0.7, 1.1] + [1, 1] = [1.7, 2.1]
    H1_res4 = H1_4 + [0, 0] = [0, 0] + [0, 0] = [0, 0]
    H1_res5 = H1_5 + [1, 0] = [0.5, 0.3] + [1, 0] = [1.5, 0.3]
    H1_res6 = H1_6 + [0, 1] = [0.2, 0.8] + [0, 1] = [0.2, 1.8]
    H1_res7 = H1_7 + [1, 1] = [0.7, 1.1] + [1, 1] = [1.7, 2.1]
    H1_res8 = H1_8 + [0, 0] = [0, 0] + [0, 0] = [0, 0]
    H1_res9 = H1_9 + [1, 0] = [0.5, 0.3] + [1, 0] = [1.5, 0.3]
    H1_res10 = H1_10 + [0, 1] = [0.2, 0.8] + [0, 1] = [0.2, 1.8]
    

    对残差连接的结果应用ReLU激活函数:

    H1_res_relu1 = ReLU(H1_res1) = [max(0, 0.2), max(0, 1.8)] = [0.2, 1.8]
    H1_res_relu2 = ReLU(H1_res2) = [max(0, 1.5), max(0, 0.3)] = [1.5, 0.3]
    H1_res_relu3 = ReLU(H1_res3) = [max(0, 1.7), max(0, 2.1)] = [1.7, 2.1]
    H1_res_relu4 = ReLU(H1_res4) = [max(0, 0), max(0, 0)] = [0, 0]
    H1_res_relu5 = ReLU(H1_res5) = [max(0, 1.5), max(0, 0.3)] = [1.5, 0.3]
    H1_res_relu6 = ReLU(H1_res6) = [max(0, 0.2), max(0, 1.8)] = [0.2, 1.8]
    H1_res_relu7 = ReLU(H1_res7) = [max(0, 1.7), max(0, 2.1)] = [1.7, 2.1]
    H1_res_relu8 = ReLU(H1_res8) = [max(0, 0), max(0, 0)] = [0, 0]
    H1_res_relu9 = ReLU(H1_res9) = [max(0, 1.5), max(0, 0.3)] = [1.5, 0.3]
    H1_res_relu10 = ReLU(H1_res10) = [max(0, 0.2), max(0, 1.8)] = [0.2, 1.8]
    
  2. 在聚合操作之后,我们将残差连接的结果与原始聚合结果相加:

    H2_res = H2 + mean([H1_res_relu1, H1_res_relu2, H1_res_relu3, H1_res_relu4, H1_res_relu5, H1_res_relu6, H1_res_relu7, H1_res_relu8, H1_res_relu9, H1_res_relu10])
           = [0.36, 0.64] + mean([[0.2, 1.8], [1.5, 0.3], [1.7, 2.1], [0, 0], [1.5, 0.3], [0.2, 1.8], [1.7, 2.1], [0, 0], [1.5, 0.3], [0.2, 1.8]])
           = [0.36, 0.64] + [0.98, 1.06]
           = [1.34, 1.70]
    

    对残差连接的结果应用ReLU激活函数:

    H2_res_relu = ReLU(H2_res) = [max(0, 1.34), max(0, 1.70)] = [1.34, 1.70]
    

这样,我们就完成了征进行线性变换和聚合的计算过程,并引入了残差连接。同时,我也计算出了每层的隐藏层结果和残差网络的计算结果。请注意,这只是一个示例,实际应用中可能会有更复杂的计算过程和不同的残差连接方式。

简要说明一下网络结构

我们可以使用如下的线条图表示:

输入层:函数输入 (X) [数量: N]
    |
图卷积层1[神经元数量: K1]
    |
残差连接
    |
图卷积层2[神经元数量: K2]
    |
全连接层:[神经元数量: K3]
    |
输出层:函数输出 (Y) [数量: M]

其中,N表示函数输入的数量,K1、K2和K3分别表示图卷积层1、图卷积层2和全连接层中的神经元数量,M表示函数输出的数量。
网络的输出案例可以参考:GNN完整流程

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值