形态:就是《数据结构》、《离散数学》等所说的那个“图”的概念:节点、邻居、关系(有向、无向)、度、出度、入度
然后,我们把邻接矩阵 A,度矩阵D,特征矩阵X再有个印象就OK了。
操作-1:聚合:本质就是将目标实体和特征(邻居信息)作为一个整体,变成可学习的单位
操作-2:更新:自己的特征+权重1邻居1特征+权重2邻居2特征…
操作-3:循环-多层更新:A更新后新的A就不是原来的A了,那么在更新B的过程中,A给的也是含B信息的新的信息!最终A、B、C的值一定程度上也包含了结构信息。
----------------以下是自我理解-----------------
我把up主在其他视频的例子做个改编,来解释一下GNN:
例子:你微信朋友圈最近更新的五个人的平均工资 = 你的工资
有道理在于小A的朋友圈很有可能有一起工作的同事、相似教育经历的同学、工资高于或不如你的等等,平均一下确实有可能等于你的工资;
没道理在于
① 轻视了自己的努力奋斗,在传递过程中,自己的个性化特征占比在减小
② 通过自己,将同事的信息和同学信息相互传递了,而且反复多次的传递特征,这个仿佛没有解释性;
③ 我稍微语文建模一下
其实,小A能有这个“工资高于你的老板”,是因为与其他人竞争后,进入了这家公司,这个让体现了小A“工作能力强”的特征;
小A有强大(或弱小)的同学,说明小A的教育资源和认知水平具备相似性或者合作(小组作业)、竞争(奖学金)等关系等等,也是你的“学习很强”的特征。
因此,确实是有一定道理的,但是小A是同学中的2-8定律中的优秀的2(因为是20%,我并不认为是可以忽略的),其余的同学都有“懒惰”之类的不好的特征,老板是被国外制裁的科技公司老板(门槛高,但发展困难),那么“懒惰”和“未来不可期”的特点也会传呀?如何把握自身和邻居的关系呢?
甚至,我自己的思考:真正和自己的一样强大(或弱小)的对手(或菜鸡互啄对象),我们反而没有好友关系。比如特征完全一致,但是是相反的类别。所以我想提出一种**“特征相似对立”**的概念。
发现问题:如下图,对B来说,能聚合很多特征,他们的特征反映了B的特点(看上面的语文建模),而对A来说,就只有B了,那把B的特征直接聚合到A就不行了。
up主例子:马云有很多伙伴,你参加了双十一也四舍五入跟马云有关了,此时直接给你马云的特征…
提出问题:
参考:
https://www.zhihu.com/question/426784258
https://zhuanlan.zhihu.com/p/112277874
度大的节点特征越来越大,而对于度小的节点却相反,会导致梯度爆炸或消失
解决问题:
思想:将度考虑进来,且不仅仅① 考虑本身的度,也考虑邻接节点的度,使用归一化使得更新权重时,②** B对A的影响 = A对B的影响**,主要是让B对A的特征的影响降低。
step1:进行归一化
简单的归一化本质是取平均,得到了一个非对称矩阵;
stpe2 :所以进行改进
推导过程,以这幅图为例
A 指的是邻接矩阵,比如1和2、3相邻,则1这一行的第二列和第三列是1
A^ 就是在A的基础上加上自己(自身特征)
GNN中就说了:自己的特征 = 自己的特征+权重1邻居1特征+权重2邻居2特征…
所以要考虑自己!
D的意思是度(无向图比简单,有向图就稍微复杂一丢丢)
D^ 也是+1
注意1:
刚学A^ 的时候,错误的理解为:加了一个环,但是实际上不能这么理解!!!
思考:但是其实每一个都加一个环的话,也不算破坏图的结构吧…
D^(-1/2) | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
1 | 1/√3 | 0 | 0 | 0 | 0 |
2 | 0 | 1/√3 | 0 | 0 | 0 |
3 | 0 | 0 | 1/2 | 0 | 0 |
4 | 0 | 0 | 0 | 1/2 | 0 |
5 | 0 | 0 | 0 | 0 | 1/√3 |
Step3:更新权重
H^0 是最初的模样,也就是之前提到过的特征矩阵X
然后每一轮都会在这个基础上进行更新权重,
GNN是这么提的,只考虑了邻居,没有把度数加上
现在从卷积神经网络中得到启发:
W是学习权重,σ表示激活函数
增加上归一化的概念
最终得到的结果
图像表示图神经网络的过程:
提出问题:
按照GNN,就是a,b,c=1,把信息直接聚合到一起
按照GCN,就是除以节点度数开根号分之一,也就是度越多(邻居越多,给各个邻居的特征影响越小)
都是数据本身一出现就定死了,没有根据不同节点的重要程度等等有不同的a,b,c
做出假设:
引入重要性 这一概念。根据关系之间的重要程度来影响最终聚合的结果。
问:重要程度如何去描述呢?
答:增加约束条件,就是所有邻居的重要性程度权重之和为1(都很重要的情况其实就是都不重要,根据这个思想)
设计实验:
以A与B的权重设置为例:假设向量a是用来将向量转化为数值的一个向量,那么
向量a * (从A的特征中提取的特定部分 || 从B的特征中提取的特定部分)
注:||指的是拼接
最终在网络中显示的为:ab重要值/(ab重要值+ac重要值+ad重要值)
实际论文中,关于重要值还增加了激活函数leakyReLU(大概就是如果重要值太小了,就当没啥影响,就丢了),最后也用softmax进行了归一化。