首页 > 其他分享 >图神经网络知识总结——归一化

图神经网络知识总结——归一化

时间:2024-08-29 14:37:21浏览次数:9  
标签:总结 frac inv 矩阵 sqrt 神经网络 归一化 np

本文以Graph WaveNet为主体,总结其使用到的(图)神经网络知识点以及相应代码实现方式。

对称归一化邻接矩阵

介绍

对称归一化邻接矩阵(Symmetrically normalize adjacency matrix),更适合无向图。

  • 作用

    • 将邻接矩阵归一化处理,使得每一行/列的和等于1(类比“数独”游戏),同时保持矩阵的对称性。
  • 目的

    • 度数偏差:指一些结点的度数较大,而另一些结点的度数较小。在使用未经过归一化的邻接矩阵进行训练时,结点的度数会对模型的训练产生影响,即度数较大的结点对应的特征在模型中占比较大,而度数较小的结点对应的特征占比较小,从而导致模型的偏差。
    • 梯度消失:进行反向传播算法时,梯度可能会随层数的增加而变得非常小,导致模型参数难以更新。未经归一化的邻接矩阵的梯度消失问题十分明显。邻接矩阵中非常大的元素和非常小的元素会导致梯度计算时数值不稳定。

公式

\[\hat{A} = D^{-\frac{1}{2}}AD^{-\frac{1}{2}} \]

  • A:邻接矩阵。不要求A一定是对称矩阵,不过无向图往往都是对称矩阵。
  • D:度矩阵。它是一个对称阵,对角线上的值表示\(v_i\)结点的度。\(D^{-\frac{1}{2}} = \frac{1}{\sqrt{D}}\)

代码

import numpy as np
import scipy.sparse as sp # 提供了一系列用于处理稀疏矩阵的线性代数操作和方法
from scipy.sparse import linalg

adj = sp.coo_matrix(adj) # 转为COO格式的稀疏矩阵,方便计算
rowsum = np.array(adj.sum(axis = 1)).flatten() # 沿列方向,对每一行进行求和。.flatten()将多维数组拉平为一维数组。目的:求结点的度
d_inv_sqrt = np.power(rowsum,-0.5) # np.power()对数组中的每一个元素做幂运算。
d_inv_sqrt[np.isinf(d_inv_sqrt)] = 0. # 因为求1/n(倒数),当n=0时,会是无穷大,所以将无穷大的值修改为0,避免无穷大。
d_mat_inv_sqrt = sp.diags(d_inv_sqrt) # 创建对角阵
result = adj.dot(d_mat_inv_sqrt).transpose().dot(d_mat_inv_sqrt).astypt(np.float32).todense() # 设置数据类型,转为密集型矩阵

代码讲解

函数方法
  • COO格式的稀疏矩阵

\[adjacency = \begin{pmatrix} 0 & 8 & 0 \\ 5 & 0 & 0 \\ 0 & 0 & 3 \\ \end{pmatrix} \]

三个列表分别表示数据、行索引、列索引。与数据结构中的稀疏矩阵三元组存储方式相同。

\[(data,row,col) = ([8,5,3],[0,1,2],[1,0,2]) \]

  • np.power()

计算数组各元素的幂。

a = np.array([1,2,3,4])
result = np.power(a,2)
print(result) # [1,4,9,16]
  • np.isinf():判断列表中各元素是否是无穷大,返回一个布尔值数组,[True,False,False,True]

  • \(.dot()\):矩阵乘法

  • .transpose()

可交换指定维度。对于二维矩阵,就是求转置。

import numpy as np

# 创建一个三维数组
array_3d = np.array([[[1, 2], [3, 4]], 
                     [[5, 6], [7, 8]]])

print("原始三维数组:")
print(array_3d)

# 使用 .transpose() 方法进行转置,改变维度顺序
transposed_array_3d = array_3d.transpose(1, 0, 2)

print("\n转置后的三维数组:")
print(transposed_array_3d)

"""
原始三维数组:
[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]

转置后的三维数组:
[[[1 2]
  [5 6]]

 [[3 4]
  [7 8]]]

"""
疑问与解答
  1. adj.dot(d_mat_inv_sqrt).transpose().dot(d_mat_inv_sqrt).astypt(np.float32).todense()为什么代码实现中使用到了转置,而原公式中没有转置?

对应不同的代码实现方式,通过公式推导可以证明是一致的。d_mat_inv_sqrt.dot(adj).dot(d_mat_inv_sqrt).astypt(np.float32).todense(),这种写法与公式相同,更容易理解。

\[(A D^{-\frac{1}{2}})^T D^{-\frac{1}{2}} = (D^{-\frac{1}{2}})^T A^T D^{-\frac{1}{2}} = D^{-\frac{1}{2}} A D^{-\frac{1}{2}} \]

\(A\)和\(D\)都是对称阵, \(A^T = A\)、\((D^{-\frac{1}{2}})^T = D^{-\frac{1}{2}}\)

非对称归一化邻接矩阵

介绍

非对称归一化邻接矩阵(Asymmetrically normalize adjacency matrix),更适合有向图。

  • 目的
    • 消除结点度数对聚合信息的影响,让每个结点在进行特征聚合时考虑到自身的度数。

公式

\[\hat{A} = D^{-1} A \]

  • A:邻接矩阵。不要求A一定是非对称矩阵,不过有向图往往都是非对称矩阵。
  • D:度矩阵。它是一个对称阵,对角线上的值表示\(v_i\)结点的度。

代码

详情参照对称归一化邻接矩阵。方法几乎相同。

adj = sp.coo_matrix(adj)
rowsum = np.array(adj.sum(axis = 1)).flatten()
d_inv = np.power(rowsum, -1)
d_inv[np.isinf(d_inv)] = 0.
d_mat = sp.diags(d_inv)
result = d_mat.dot(adj).astype(np.float32).todense()

归一化拉普拉斯矩阵

介绍

详细内容可参考GCN图卷积网络全面理解GCN图卷积网络本质理解

公式

  1. 组合拉普拉斯矩阵(Combinatorial Laplacian)

\[L = D - A \]

  1. 对称归一化拉普拉斯矩阵(Symmetric Normalized Laplacian)

\[L = D^{-\frac{1}{2}} (I - A) D^{-\frac{1}{2}} = I - D^{-\frac{1}{2}} A D^{-\frac{1}{2}} \]

很多GCN的论文中应用的就是这种拉普拉斯矩阵。

  1. 随机游走归一化拉普拉斯矩阵(Random Walk Normalized Laplacian)

\[L = D^{-1}L = I - D^{-1}A \]

标签:总结,frac,inv,矩阵,sqrt,神经网络,归一化,np
From: https://www.cnblogs.com/coder-shane/p/18386628

相关文章

  • wpf prism用法总结
    1、App文件中RegisterTypes方法:此方法中主要是注册、绑定视图、实体的。使用RegisterForNavigation方法,可以将视图注册成导航,且绑定对应的viewmodel,视图被调用后自动绑定这个viewmodel。注册成导航后,相当于公开了此视图允许调用。同时同一个视图可以绑定多个viewmodel。......
  • 2024年睿抗机器人大赛智能侦查省赛(预选赛)总结中篇
    2024年睿抗机器人大赛智能侦查省赛(预选赛)总结中篇引言通过上篇的分析,我们已经完成了睿抗机器人大赛省赛任务书的前两个部分,关于如何在win11下搭建yolov5环境并将其运用,后续我们会继续跟进,也欢迎大家留言,现在我们将继续分析省赛任务书余下的部分。任务3:ROS程序题任务描述......
  • 从零开始的PyTorch【03】:优化你的神经网络模型
    从零开始的PyTorch【03】:优化你的神经网络模型前言欢迎回到PyTorch学习系列的第三篇!在前两篇文章中,我们学习了如何构建一个简单的神经网络并训练它,同时探索了数据集调整对模型性能的影响。今天,我们将深入探讨如何优化你的神经网络模型,使其在更复杂的任务中表现更好。我们......
  • 24年最全面的AI绘画变现途径总结!
    前言4.7制作红包封面中国的节日和传统文化元素仍然可以成为创作者们的创作灵感,创造出更多的变现机会。比如元宵节,可以制作大型元宵图案,进行引流并卖出元宵。而春分、谷雨等节气也可以成为创作的灵感来源,创作出与之相关的图案,吸引更多粉丝。这样不仅可以吸引新粉丝,也可以......
  • 【CTF杂项】常见文件文件头、文件尾格式总结及各类文件头
    原创小羽网安1、从Ultra-edit-32中提取出来的附件:文件格式分析器JPEG(jpg),文件头:FFD8FFPNG(png),文件头:89504E47GIF(gif),文件头:47494638TIFF(tif),文件头:49492A00WindowsBitmap(bmp),文件头:424DCAD(dwg),文件头:41433130AdobePhotoshop(psd),文件头:38425053RichT......
  • 2024.8.28 总结
    上午做了一个很板的广义SAM题,算是练了一下广义SAM,当时基本上能自己写出广义SAM了,但是还是写错了两个地方(好像是把p写成了q)。大概是做完这道题之后我去看了看lr的博客,发现他的博客里有计划。于是我也写了一个最近的计划。在这之后我就去挑了个较基础的SA题来写。后缀......
  • 开源的工作流系统突出优点总结
    当前,想要实现高效率的办公,可以一起来了解低代码技术平台、开源的工作流系统的相关特点和功能优势。作为较受职场喜爱的平台产品,低代码技术平台拥有可视化才做界面、灵活、好维护操作等多个优势特点,在推动企业流程化办公的过程中扮演了非常重要的角色,是市场价值较高的产品。随时欢......
  • 2024-8月总结
    一转眼就到8月了。其实之前一直想写个总结,但是一直拖延。今天不拖了,来写吧。一看日子,竟然离上一次总结恰好也是三个月。 ##工作工作好像也没什么好说的,可能确实没什么激情了。这三个月花了大力气完成了年度计划中的一部分。算是不小的一部分吧。偶尔也有一些疑难问题要解......
  • 扫描线总结
    引入面积并(周长并)如下图给你一堆矩形求它的面积并或周长并。显然直接做,就是考虑容斥,但明显不好做。那就思考如何切割或补,显然补完要减的图形也不规整,只能考虑割。如何将其割成规整的图形,明显矩形最容易计算和割。把它割成矩形后发现,每次遇到某个矩形的边就会变,所以考虑一条......
  • 博弈论算法总结
    正在完善!何为博弈论博弈论,是经济学的一个分支,主要研究具有竞争或对抗性质的对象,在一定规则下产生的各种行为。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。先来看一道小学就接触过的思维题你和好基友在玩一个取石子游戏。面前有30颗石子,每次只能取一颗......