Graph Convolutional Networks 代码详解
一、神经网络
1.1 什么是神经网络?
百度百科的定义是这样的
人工神经网络(Artificial Neural Network,缩写ANN),简称神经网络(Neural Network,缩写NN),是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络是一种有监督的机器学习算法,广泛地应用于分类预测、图像识别等领域。
个人理解
简而言之,神经网络是通过可训练的参数来逼近或拟合我们想要的曲线或曲面,从而解决分类或回归问题。可以将其理解为找到一个最佳曲线,以最好地拟合或区分给定的数据点。
1.2 激活函数的非线性之美
“什么是神经网络”中提到了拟合曲线,首先看如何拟合直线呢?
直线方程为:
y
=
a
x
+
b
y = ax + b
y=ax+b
通过使用类似于直线方程的思想,在神经网络中,我们可以将
y
y
y 视为网络的输出,
x
x
x是输入特征,
a
a
a和
b
b
b是该层的权重和偏置直观的理解神经网络的思想。下图为神经元图片:
通过调整
a
a
a和
b
b
b 的值,调整直线的斜率和截距,从而使其更好地拟合数据。在实际的神经网络中,输入
x
x
x 可以是高维度的数据。
例如,对于一个个体,可以包括身高、性别、肤色等多个特征作为输入。通过多个特征信息从而输出这个人某一个标签即 l a b e l label label,形成了一个最简单的神经网络模式。
这个模式最大的缺点就是不能够进行非线性数据的拟合,也就是 y = a x + b y = ax + b y=ax+b的线性模型可能无法捕捉到复杂的非线性关系。对于某些数据,神经网络可能需要更复杂的结构来更好地拟合。
通过下图直观的展示了这一特性,左侧为没有激活函数就是 y = a x + b y = ax + b y=ax+b,右侧为存在激活函数 y = f ( a x + b ) y = f(ax + b) y=f(ax+b).
非线性函数的引入允许神经网络学习并捕捉数据中的非线性关系,使其具备更强大的表示能力。这种能力使得神经网络能够适应各种数据分布,从而更好地拟合实际问题。简单的理解成
a
a
a 实际上就是训练的参数也是对特征进行选择,
b
b
b 调整模型对激活函数的敏感程度,即(激活函数被激活的容易程度)。
BUT 但是这还不够
无法正确地学习和拟合 XOR(异或) 问题
通过线性函数可以很好的划分与,或,非这类数据,下图展示了函数划分 “与非” 数据的情况
数据分布情况看下表
Input (X1, X2) | Output (X1 XOR X2) |
---|---|
0 0 | 1 |
0 1 | 1 |
1 0 | 1 |
1 1 | 0 |
与门、或门和非门三种数据都可以通过简单的线性方式很好地进行划分,但是异或门则难以通过这种方式实现。下面是异或门的数据
Input (X1, X2) | Output (X1 XOR X2) |
---|---|
0 0 | 0 |
0 1 | 1 |
1 0 | 1 |
1 1 | 0 |
显然单一的线性方式无法实现对 XOR gate 的划分,但通过逻辑门的组合,我们可以构建一个包含 XOR gate 的复合逻辑。例如,我们可以通过组合 AND gate、OR gate 和 NAND gate 来实现 XOR gate。
XOR(A, B) = AND(NAND(A, B), OR(A, B))。实际情况可以看下图展示的情况。
与门 AB同时为真则为真。 与非门其中一个为假结果就是真,或门只要有一个为真就是真
该表达式展示了通过组合AND、OR和NAND逻辑门,如何能够构造出一个XOR逻辑门。这种组合方式提供了一种建立非线性关系的手段,使得XOR门的输入空间得以有效划分。因此,虽然利用单一的线性方法难以解决XOR门的划分问题,但通过巧妙地整合多种逻辑门,依然可以达到预期的目标。这恰恰体现了早期神经网络(仅包含输入层和输出层)与引入了隐藏层的多层感知机(MLP)间的主要区别,后者的性能因此而大幅提升。
这个图看起来怎么有些熟悉呢??
通过简单神经网络的表示和上面的图对比下看看。
一模一样
通过将两个简单的神经网络(可类比为逻辑门)所产生的输出进行整合,再将这些输出通过一个加权求和与激活函数的过程,实际上创建了一个含有多个层次的神经网络架构。这种结构通常被称为多层感知机(Multi-Layer Perceptron,MLP)或深度神经网络(Deep Neural Network,DNN)。其设计不仅增强了模型的复杂性,也极大地提升了模型解决非线性问题的能力。
在实际上应用中,真正的神经网络需要根据具体任务选择合适的激活函数、层数以及超参数。这个过程涉及到仔细的设计和调整,通过反向传播算法和损失函数的优化迭代,最终形成一个能够有效学习和表示复杂关系的神经网络结构。这种细致的调整和优化是构建出真正有效神经网络的关键要素。
二、卷积神经网络
2.1 为什么要有卷积神经网络呢?
首先要了解卷积神网络之前我们要了解下神经网络在图片处理领域的缺点有哪些:
- 参数量庞大: 对于高分辨率的图像,全连接神经网络的参数量会非常庞大,导致训练和推理过程需要更多的计算资源。
- 例如:在一个全连接神经网络中,会将高维度的数据拉成一维数据,进行输入,如果输入是一个100x100像素的图像,并且每个像素有三个通道(RGB),那么输入层的节点数是100 * 100 * 3 = 30,000。如果第一个隐藏层有100个神经元,那么与输入层相连的权重和偏置参数的总数是30,000 * 100 + 100 = 3,000,100。需要训练的参数量太过巨大,对计算的计算性能以及训练样本量都是巨大的挑战,还容易引发过拟合。
- 平移不变性: 全连接神经网络在处理平移变换时可能会缺乏不变性,即使图像中的物体平移一小部分,网络可能需要重新学习相应的特征。
- 数据需求量大: 神经网络通常需要大量标记的数据进行训练,而在图像领域,标记大规模数据集可能非常耗时和昂贵。
- 对空间结构的理解有限: 图像是三维形状,这个形状中应该包含重要的空间结构信息。
- 例如:空间中相邻的像素是相似的值、RGB的各个通道之间有密切的关联性,距离较远的像素之间没有什么关联,三维形状中可能存在着值得提取的本质模式。但是全连接神经网络会忽视形状,将全部的输入数据作为相同的神经元处理,所以无法利用与形状相关的信息。
因此要设计一种专门针对图像结构(Image)的神经网络。由此出现了卷积神经网络。
- 例如:想象一下相邻的像素之间存在相似性的关联。当我们看到一张猫的照片时,猫的眼睛可能是黑色的。因此,其中一个像素是黑色的话,周围的像素颜色很可能也接近于黑色数值。因此孤立的看待数据容易忽视形状结构之间的关联,不利于特征的提取。
2.1 什么是卷积神经网络呢?
卷积神经网络(Convolutional Neural Network,CNN)是一种带有卷积层和池化层的神经网络。下面的图示比较了卷积神经网络和传统神经网络,上方的是神经网络,下方是卷积神经网络。在CNN中,我们可以直观地观察到新增加了卷积层和池化层。可以简单理解为在神经网络前加入了卷积和池化操作,用于对数据进行处理。这就是一般的卷积神经网络结构。 换句话说,CNN 是专门为图像结构设计的神经网络,通过增加卷积和池化层来更有效地处理图像数据。
即针对图像结构设计的增加卷积和池化层的神经网络。
2.2 什么是卷积呢?
提到"卷积"这个词可能会感到陌生,但如果是"加减乘除",这只是对某种运算方式的称呼。接下来介绍一下卷积运算。
就像
a
+
b
a + b
a+b 是加法运算一样,抽象的卷积运算也有类似的表示方式。卷积的公式如下:
(
f
∗
g
)
(
n
)
(f*g)(n)
(f∗g)(n)只是这个公式涉及到了积分的运算变得很复杂而已。在离散形式和连续形式的的公式是如下
(
f
∗
g
)
[
n
]
=
∑
m
=
−
∞
∞
f
[
τ
]
⋅
g
[
n
−
τ
]
(f * g)[n] = \sum_{m=-\infty}^{\infty} f[ \tau] \cdot g[n - \tau]
(f∗g)[n]=m=−∞∑∞f[τ]⋅g[n−τ]
(
f
∗
g
)
(
n
)
=
∫
−
∞
∞
f
(
τ
)
⋅
g
(
n
−
τ
)
d
τ
(f * g)( n) = \int_{-\infty}^{\infty} f(\tau) \cdot g(n - \tau) \, d\tau
(f∗g)(n)=∫−∞∞f(τ)⋅g(n−τ)dτ
看起来复杂实际上就是对不同位置的数值进行加权求和
举个大家都在用的例子便于大家理解。
两个骰子:把两个🎲骰子同时丢出去。求两个骰子点数加起来为4的概率是多少呢?
问题的关键在于,两个骰子的点数加起来等于4。这就是卷积的一个应用场景。我们可以通过计算不同点数出现的概率,并用函数表示出来。
那么两个骰子点数加起来为4的情况是:
因此两个骰子加起来点数为4的概率就是为:
f
(
1
)
g
(
3
)
+
f
(
2
)
g
(
2
)
+
f
(
3
)
g
(
1
)
f(1)g(3)+f(2)g(2)+f(3)g(1)
f(1)g(3)+f(2)g(2)+f(3)g(1)
是不是有点眼熟了
不断滑动的窗口对应位置进行加权求和,这实际上就是CNN的卷积层。在这个过程中,对当前位置的特征进行加权,
f
(
x
)
f(x)
f(x) 相当于特征,
g
(
x
)
g(x)
g(x) 则相当于权重,也就是卷积核。只不过这个操作是在矩阵上进行的。当然,这并不是非常严谨的说法,但是为了方便大家理解,概念上是相通的。懂就行。
在CNN中,卷积操作与数学上的传统卷积有一些不同。总体而言,CNN中的卷积是一种用于学习特征的操作。它引入了权值共享和参数可学习的特性,使得CNN能够更好地适应图像处理任务,并通过共享权值降低了模型的复杂度。这些特性使得CNN在处理大规模图像数据时更加高效和有效。
参数学习: 在CNN中,卷积核的权重是可以学习的,这意味着网络可以通过反向传播算法来自动调整这些权重以适应任务。而数学上的卷积通常是基于预定义的核或函数。
权值共享:是CNN中的一个重要特性。在数学中,卷积操作通常涉及两个函数的卷积,而且这两个函数的权值是独立的参数。然而,在CNN中,采用具有共享权值的卷积核。这意味着卷积核的权值在整个输入图像上是共享的,即使用一个卷积核对整个图像进行加权求和。这种权值共享有助于减少模型的参数数量,提高模型的训练效率,并使网络更容易泛化到新的数据。
稍微唠叨下
人类看图片某一个区域实际上这个区域的颜色应该是都差不多的,所以存在着特定关联。
卷积核就像上文中看到的线性函数中的参数
a
a
a,用于提取特征。然而,CNN的特殊之处在于,下一层的特征是由上一层的邻居和自身本身的特征加权得到的。这使得得到的特征具备了邻域信息,也就是说,它包含了形状信息。这是CNN的一个有趣之处。为什么要采用多个卷积核呢?因为每个卷积核,即每组参数
a
a
a,在优化的过程中对特定特征的偏好是不一样的,也就是它们关注的点不同。需要调整不同的视角关注不同的信息,这就解释了为什么需要多个卷积核一起运算。这部分有点口语化,但为了更好地让读者理解。
2.2 稍微说下什么是池化层呢?
在卷积操作结束后,确实产生了大量的特征信息,而池化层的主要目的是对这些特征进行下采样,即减少数据量(例如,通过取最大值来忽略其他零散的信息),从而降低计算成本并保留最显著的特征。池化层有助于简化网络结构、提高计算效率,并增强模型的泛化能力。主要有两种类型的池化层,分别是最大池化和平均池化。可以将其比喻为对图片进行马赛克处理,虽然细节减少了,但大致的样子我们仍然能够识别是什么东西。这种处理减少了运算成本,同时增加了模型的泛化能力。
最大池化:
在最大池化中,每个池化窗口(通常是2x2或3x3)内的最大值被保留,而其余数值被忽略。这样可以确保每个池化区域仅保留最显著的特征,有助于保留图像中的重要信息,同时减小特征图的空间尺寸。
平均池化:
在平均池化中,每个池化窗口内的数值取平均值,以降低局部变化的影响,从而更强调特征的整体性。平均池化同样有助于减小特征图的维度,减轻计算负担。
通过池化操作,网络可以在减少数据量的同时,保持对图像中重要特征的感知。这样的降维和保留显著特征的操作有助于提高网络的计算效率,减少过拟合的风险,并且使得网络对输入的变换更加鲁棒。
总体而言,卷积层通过特征提取,而池化层则通过下采样和筛选,共同协作以实现对图像信息的高效处理和表示学习。
三、图卷积神经网络
3.1 为啥有图卷积操作?
卷积神经网络(CNN)在计算机视觉领域取得了显著的成功,主要应用于图像处理和图像识别。设计的卷积核通常是规则的矩形,这种结构适用于处理图像的规律性和局部相关性。
规则的欧几里得数据
然而,在图结构(Graph)领域,情况确实较为复杂。图是由节点和边组成的,而节点的邻居个数可以是不同的,图的结构可能是非规则的、稀疏的,且不同节点可能有不同数量的邻居。这样的不规则性和灵活性使得传统的卷积操作不太适用于图数据。
简单说就是CNN处理欧几里得数据,GCN处理非欧几里得数据。
在图神经网络(Graph Neural Network,简称GCN)中,与卷积神经网络(CNN)处理欧几里得数据不同,GCN专门用于处理非欧几里得数据。CNN的卷积核通常是固定大小的,但在社交网络等非欧几里得数据的情境下,节点的邻居个数可能会变化,如果卷积核大小固定,则可能无法充分捕捉到多余的邻居信息。为了解决这个问题,需要设计一种能够自适应非欧式距离中的卷积核,以有效聚合邻居消息。这使得GCN能够更灵活地适应不同节点邻居的情况。
四、CNN的卷积的理解
传统的卷积神经网络,是如何工作的呢?
在卷积神经网络(CNN)中,使用卷积核或过滤器对数据进行特征提取是一种基本的操作。以3x3的卷积核为例,它可以看作是一个小的窗口,滑动遍历整个图像或矩阵数据。在每个位置,这个卷积核都会覆盖数据的一个局部区域,并通过该区域内对应位置的数值与卷积核上的权重系数相乘,然后将所有乘积求和得到一个单一的数值。这个过程就是所谓的卷积操作。
由上图可以看到,更新当前位置(或节点)的信息基本上是通过对其邻域内其他节点信息的选择性聚合来实现的。 这其中,卷积核扮演的是一个权重模板的角色,它决定了如何从局部邻域中提取或强调特定的信息
五、空域图神经网络
在CNN中卷积操作这个求和过程,卷积核会考虑当前数据点及其周围的信息,这种机制使得卷积核能够捕捉到局部的特征。正是通过这种方式,卷积神经网络可以从原始数据中学习到有意义的特征表示,形成对当前数据点丰富且综合的新表征。
因此得到了一个重要信息,就是卷积本身就是进行聚合,然后更新当前位置的数据,多次的卷积就是对这一行为的循环。故此在为了实现在图结构上的卷积只需要找到当前节点的邻居进行聚合然后更新自身节点信息就可以。
设计图卷积神经网络的流程:
- 聚合
- 更新
- 循环
即通过邻居信息更新自身节点信息,从而使得不同节点的表示融合了局部信息这一行为。首先聚合局部信息,然后进行更新自身信息循环往复。下图直观的展示了这一流程。
- A节点的特征:
(1, 1, 1, 1, 1)
- B节点的特征:
(2, 2, 2, 2, 2)
- C节点的特征:
(3, 3, 3, 3, 3)
- D节点的特征:
(4, 4, 4, 4, 4)
- E节点的特征:
(5, 5, 5, 5, 5)
- F节点的特征:
(6, 6, 6, 6, 6)
给定邻居信息为 :
N
e
i
g
h
b
o
r
=
w
1
⋅
A
节点特征
+
w
2
⋅
B
节点特征
+
w
3
⋅
D
节点特征
+
w
4
⋅
E
节点特征
Neighbor = w1 \cdot A节点特征 + w2 \cdot B节点特征 + w3 \cdot D节点特征 + w4 \cdot E节点特征
Neighbor=w1⋅A节点特征+w2⋅B节点特征+w3⋅D节点特征+w4⋅E节点特征。
这里的 w 1 、 w 2 、 w 3 、 w 4 w1、w2、w3、w4 w1、w2、w3、w4 是待定的权重参数。
C节点的信息更新公式为:
C
节点的信息
=
激活函数
(
W
1
⋅
C
节点的特征
+
W
2
⋅
N
e
i
g
h
b
o
r
)
C节点的信息 = 激活函数(W1 \cdot C节点的特征 + W2 \cdot Neighbor)
C节点的信息=激活函数(W1⋅C节点的特征+W2⋅Neighbor)
其中,
W
1
W1
W1 是模型需要训练的参数,激活函数可以选择常见的 ReLU、Sigmoid 等。这个过程类似于CNN的卷积操作,通过学习参数
W
W
W 来选择特征,并通过激活函数实现非线性变换,从而更新节点的特征信息。
经过第一次聚合后:
- A节点中有C的信息
- B节点中有C的信息
- C节点中有A,B,E,D的信息
- D节点中有C的信息
- E节点中有C,F的信息
- F节点中有E的信息
经过第二次聚合后:
- C节点中有F的信息
这是因为E节点在第一次聚合中得到了C,F的信息,所以再第二次聚合过程中C节点获得了F的信息
可以看到,在进行了单次图卷积后实现了对一阶段邻居信息特征的聚合,而进行了两次图卷积就成功的聚合到了二阶邻域信息。显然,增加更多卷积层的次数就可以扩展到更高阶的邻域信息,这种方法可以通过增加图卷积层的层数来实现,从而拓宽特征聚合的范围。
那么最终得到的信息有什么用呢?
通过这样的连续聚合过程,不断完善每个节点的表示,也即获得了节点的特征信息。得到这些特征信息后,可以将节点用于分类任务,通过计算损失(Loss)来对之前所描述的权重矩阵 W W W 进行优化。通过持续的迭代优化过程,可以提升分类任务的性能。在这里值得注意的是,尽管这一部分在某种程度上与传统的卷积神经网络(CNN)相似,但图卷积的核心贡献在于实现了对非欧几里得数据的卷积操作,也就是邻域信息的聚合,换言之,它在特征提取这一环节上发挥了关键作用。
5.1 GCN的空域理解
(不同的图卷积模型的核心区别在于它们采用了不同的方法来实现邻域信息的聚合)
在实际应用中,图结构常常可以理解为类似于社交网络的结构,其中不同的节点代表不同的个体,例如人。这些个体之间的社交联系则通过连结各个节点的边来表示。每个节点拥有的特征信息则用以描述该个体的各种属性。例如,当你想描述你的朋友给其他人时,你可能会提及他们的身高、体重、发型、性别或头发颜色等。这些描述信息便构成了每个节点的特征信息,而在图结构中,这些不同的节点特征集合起来就是用来描绘整个网络中每个个体的独特属性。
打个比方,假如想了解 C 节点代表的个体的工资水平。在这个图结构中, A,B,D,E 节点都与 C 节点相连,类似于 C 的朋友圈。一个合理的推断是,这些朋友的工资水平很可能与 C 节点相似。因此,可以通过将 C 节点所有朋友的工资累加起来,从而得到一个总和。但是,仅仅使用这个总和作为 C 节点工资的估计显然是不合理的。为了得到一个更加合理的估算,我们需要进行平均化处理, 这可通过将朋友工资的总和除以 C 节点的朋友数量(即 C 节点的度)来实现。这样,我们就能得到 C 节点的估计工资水平。此过程实质上模拟了图卷积神经网络中的一个聚合操作。
则聚合公式可以表示为:
a
g
g
r
e
g
a
t
e
(
X
i
)
=
∑
j
∈
N
(
i
)
A
i
j
X
j
aggregate(X_i)= \sum_{j \in \mathcal{N}(i)} A_{ij}X_j
aggregate(Xi)=j∈N(i)∑AijXj
其中,
N
(
i
)
\mathcal{N}(i)
N(i) 表示节点
i
i
i 的邻居节点集合,
A
i
j
A_{ij}
Aij 是邻接矩阵
A
A
A 中的元素,表示节点
i
i
i 和节点
j
j
j 之间的连接权重,
X
j
X_j
Xj 是节点
j
j
j 的特征向量。
a
g
g
r
e
g
a
t
e
(
X
i
)
=
A
X
aggregate(X_i)= AX
aggregate(Xi)=AX
在图卷积网络(GCN)的计算过程中,要更新节点的特征表示,通常会聚合邻居节点的特征信息。然而,为了不丢失节点自身的特征信息,会在邻接矩阵 A A A 上添加单位矩阵 I I I,执行所谓的“自连接”操作 A ^ = A + I \hat{A} = A + I A^=A+I,其中 A ^ \hat{A} A^ 表示加入自连接的邻接矩阵。
自连接后的邻接矩阵
A
^
\hat{A}
A^ 会与节点特征矩阵
X
X
X 相乘,使得每个节点在计算新的特征表示时,同时融合了邻居节点和自身的特征信息。
a
g
g
r
e
g
a
t
e
(
X
i
)
=
A
^
X
aggregate(X_i)= \hat{A}X
aggregate(Xi)=A^X
接着说上述的例子
仅仅使用这个总和作为C节点工资的估计显然是不合理的。为了得到一个更加合理的估算,我们需要进行平均化处理,所以使用度矩阵的逆矩阵
D
−
1
D^{-1}
D−1 来进行归一化,具体的聚合公式可以被写成:
a
g
g
r
e
g
a
t
e
(
X
i
)
=
D
−
1
A
^
X
aggregate(X_i) = D^{-1}\hat{A}X
aggregate(Xi)=D−1A^X
通过这种方式,对聚合得到的信息进行了归一化,即均值处理操作。
但是还存在一种特殊的情况,假如你的朋友是一个明星呢?
在这种情况下,该明星节点可能拥有更多的邻居,而其他节点只有少量邻居,甚至只有一个。这种不对称的连接关系可能导致上述公式失效。举例来说,考虑下图节点 C 和节点 E 之间的关系,如果节点 C 是一个明星,而节点 E 只有节点 C 一个邻居,那么节点 C 的工资情况不可能等同于节点 E 的工资情况。
为了解决这种不对称连接关系可能带来的问题,可以对每个节点的特征矩阵
X
X
X 和度矩阵的逆
D
−
1
D^{-1}
D−1 进行乘积运算,以消除明星节点对结果的影响。具体地,可以将每个节点的特征矩阵除以该节点的度,从而将节点的特征信息归一化。然后,利用带有自环的邻接矩阵进行聚合操作,再次将结果与度矩阵进行乘积,以实现特征数据的归一化均值操作。
这种方法能够有效地消除明星节点对结果的影响,并更好地考虑到不同节点之间的连接情况,从而提高图卷积神经网络的性能和稳定性。现在看下GCN的公式:
H ( l + 1 ) = σ ( D ~ − 1 2 A ~ D ~ − 1 2 H ( l ) W ( l ) ) H^{(l+1)} = \sigma(\tilde{D}^{-\frac{1}{2}} \tilde{A} \tilde{D}^{-\frac{1}{2}} H^{(l)} W^{(l)}) H(l+1)=σ(D~−21A~D~−21H(l)W(l))
这里的符号代表:
- H ( l ) H^{(l)} H(l) 表示第 l l l 层的节点特征矩阵。
- H ( l + 1 ) H^{(l+1)} H(l+1) 表示第 l + 1 l+1 l+1 层的节点特征矩阵。
- σ \sigma σ 是非线性激活函数,例如ReLU函数。
- A ~ = A + I \tilde{A} = A + I A~=A+I,其中 A A A 是图的邻接矩阵, I I I 是单位矩阵,其在对角线上添加自环(self-loops)。
- D ~ \tilde{D} D~ 是 A ~ \tilde{A} A~ 的度矩阵的对角矩阵,其中每个元素 D ~ i i \tilde{D}_{ii} D~ii 等于节点 i i i 的度加上1(对应自环)。
- W ( l ) W^{(l)} W(l) 是第 l l l 层的权重矩阵。
整个的过程就是上描述例子中描述的工资的计算方法。形象化理解有助于更直观地理解 GCN 的工作原理,
(不同的图卷积模型的核心区别在于它们采用了不同的方法来实现邻域信息的聚合)
而GCN公式也给出了在聚合过程中自己的答案。
总结
在本章节中,将之前的图卷积网络系列文章进行了紧密的整合,旨在为读者提供一个流畅且连贯的学习体验。通过减少对公式和定义的依赖,努力降低理论概念可能引起的认知负荷,以激发读者的阅读热情。进一步地,为了使读者能够将知识转化为实践,对图卷积网络(GCN)的代码在当前专栏下进行了逐步解析。这不仅加深了对理论的理解,也提升了实践操作的技能。对于那些寻求深入当前领域并提高实践能力的读者,可以作为学习资料参考下。