1.神经网络 PyTorch Geometric 入门教程
2.图神经网络学习笔记之二(node2vec)
3.图神经网络入门示例:使用PyTorch Geometric进行节点分类
4.用图神经网络解决小样本问题(含代码)
5.图神经网络的图神Inductive learning 和 Transductive learning
6.图神经网络(GNN)入门之旅(四)-GraphSAGE和PinSAGE
神经网络 PyTorch Geometric 入门教程
图神经网络(GNN)近年来在学术界得到了广泛关注,尤其由于其能够处理不规则输入的经训能力。GNN 通过信息传递、练源转换和聚合来提取特征,图神类似于卷积神经网络(CNN),经训但 GNN 可以处理点云等不规则输入,练源在线订餐源码系统而 CNN 仅适用于固定尺寸的图神输入,如。经训
PyTorch Geometric(PyG)是练源一个基于 PyTorch 的图神经网络库,提供了一套方便复现论文方法的图神实现和常用数据集,使得使用 GNN 变得更加简单。经训它的练源用法与 PyTorch 类似,因此对于熟悉 PyTorch 的图神用户而言,可以快速上手。经训
在 PyG 中,练源构建图需要两个关键要素:节点和边。通过使用 `torch_geometric.data.Data` 类,可以定义图的结构,该类提供了五个属性,每个属性并非必须,可以为空。进一步地,`Data` 对象不限于这些属性,还可以通过 `data.face` 属性扩展,用张量保存三维网格中三角形的连接信息。
值得注意的是,在 `Data` 对象中包含了样本的标签,这与 PyTorch 稍有不同。在 PyTorch 中,通过重写 `Dataset` 的 `__getitem__()` 方法根据索引返回样本和标签。而在 PyG 中,使用 `get()` 函数根据索引返回 `torch_geometric.data.Data` 类型的数据,其中包含了数据和标签。
下面是一个未加权无向图的例子,包括3个节点和4条边。由于是无向图,边的表示方式为 `(0 -> 1)`、`(1 -> 0)`、`(1 -> 2)` 和 `(2 -> 1)`。(-127)10的源码为每个节点都有自己的特征。这个图可以使用 `torch_geometric.data.Data` 类表示如下。在边的表示中,`edge_index` 由两个列表构成,分别表示边的起始点和目标节点。
对于 `edge_index` 的存储,通常需要先转置然后使用 `contiguous()` 方法。关于 `contiguous()` 函数的作用,可以查阅 PyTorch 文档。
综上所述,`Data` 对象的基本属性包括 `x`(节点特征)、`edge_index`(边的索引)、`pos`(节点位置)和 `y`(样本标签)。在构建 Dataset 时,可以使用 PyG 提供的工具,如 `TUDataset`,通过简单的代码加载数据集,并通过索引访问每个数据。
在 PyG 中,通过 `Dataset` 和 `DataLoader` 进行数据管理和并行处理,其中 `DataLoader` 可以方便地使用 mini-batch。`torch_geometric.data.Dataset` 继承自 `torch.utils.data.Dataset`,提供了数据集管理和预处理的功能。
为了自定义数据集,可以继承 `torch_geometric.data.Dataset` 类,实现数据加载、预处理和数据转换。在初始化方法中,需要传入数据存放的路径,并通过 `pre_transform` 和 `pre_filter` 方法对数据进行预处理。`process()` 方法用于生成处理后的数据,通常将原始数据转换为 `pt` 格式,以便在 `get()` 方法中使用 `torch.load()` 函数加载。
数据增强是计算机视觉领域常见的实践,PyG 提供了专门的 `transforms`,可以对输入数据进行变换,如生成最近邻图或在点坐标上随机平移等操作。通过 `torch_geometric.transforms.Compose` 可以封装一系列的约趴小程序源码 `transforms`。
在模型训练方面,可以使用 PyG 提供的工具构建和训练 GNN 模型。例如,使用简单的 GCN 层在 Cora 数据集上进行实验。通过加载数据集、定义模型结构、训练模型和评估模型性能,可以完成基本的 GNN 模型训练过程。
总之,PyTorch Geometric 提供了构建和训练图神经网络的强大框架,包括图数据结构处理、数据集管理和模型训练工具,使得 GNN 应用更加便捷和高效。
图神经网络学习笔记之二(node2vec)
图神经网络学习笔记之二(node2vec):探索节点向量的构建艺术 在图数据分析的世界里,将整个图中的节点转化为统一的embedding维度向量,就像word2vec中的词向量,是一个至关重要的步骤。我们首先将节点通过one-hot编码,然后通过一个嵌入矩阵,将这些高维信息压缩为低维向量,这就是node2vec的核心思想。关键在于如何构造这个巧妙的嵌入矩阵,使得相似节点在映射后的空间中拥有高度的相似度。 node2vec:探索节点相似性的智能算法 node2vec的核心在于理解节点间的两种相似性:同质性与结构等价性。同质性强调节点与其周围节点的相似,而结构等价性关注节点在图中的位置相似。为了实现这种效果,它采用了随机游走策略,这是一种自监督学习方法,无需标签或特征,但能捕捉到节点间潜在的联系。 随机游走策略的核心在于定义从一个节点到另一个节点的概率,这取决于两个节点在嵌入空间中的相似性。理想情况下,概率正比于它们的向量点积。node2vec通过调整两个超参数,p和q,控制游走策略的qq加群验证源码深度优先(p小)或广度优先(q小),以平衡同质性与结构性的探索。 优化目标与策略调整 node2vec的目标是最大化给定节点条件下,其邻居节点出现的概率。它借鉴了skip-gram模型的思想,采用负采样技术减少计算成本。负采样通过选取负样本,控制梯度下降的复杂度,使得高频词在训练中得到更充分的考虑。 通过实验,我们发现,随机游走策略(p和q值)以及embedding维度对模型效果有着显著影响。增加随机游走的路径长度和次数,以及增加节点对的上下文数量,都可以提升嵌入的性能,但效果逐渐趋于稳定。 节点向量的力量:构建边的嵌入 令人兴奋的是,node2vec的节点嵌入并不仅仅局限于节点本身。通过简单的二元运算,如平均、哈达玛积(元素相乘)、L1和L2距离计算,我们可以扩展到边的嵌入,使模型适用于涉及节点和边的预测任务,进一步增强了其在复杂网络分析中的应用价值。 总结,node2vec通过巧妙的随机游走策略和优化目标,为我们提供了一种强大而灵活的方法,将图中的节点转化为高效、富有结构的向量表示,为网络分析和理解奠定了坚实的基础。图神经网络入门示例:使用PyTorch Geometric进行节点分类
本文介绍利用图神经网络进行节点分类的实践过程,具体采用的是 PyTorch Geometric 库。首先引入 Facebook Large Page-Page Network 数据集,其中包含 , 个页面,分为四类并具有不同大小的特征向量。数据集包含页面间的链接关系以及页面特征信息。
接着,我们用 PyTorch 创建数据对象以适应训练图神经网络。源码授权了怎么解对特征进行规范化处理,确保每个节点的特征向量大小一致,对于长度小于最大值()的向量,我们将以0填充。对特征进行归一化。
数据集被分成训练集和测试集,用于模型评估。随后,本文展示了如何使用多层感知器(MLP)和图卷积网络(GCN)进行节点分类。MLP 模型基于特征向量进行训练,而 GCN 模型则考虑了节点之间的链接信息。
使用MLP,尽管它能够将大部分特征纳入模型,但是预测结果并不理想,分类准确率为%。相比之下,GCN 模型的准确率显著提高至%,显示出更好地捕获和利用节点间的关系。
通过可视化预测结果,可以看出 GCN 模型能更明显地区分不同类别的节点。这种能力得益于 GCN 通过图结构进行信息传播的方式,有效利用了邻接节点的特征。
总结,本文说明了如何使用 PyTorch Geometric 进行图神经网络建模和训练。通过对比 MLP 和 GCN 的性能,强调了在节点分类任务中考虑图结构的重要性。此类技术在社交网络分析、推荐系统等领域有广泛应用。
用图神经网络解决小样本问题(含代码)
本文探讨的是图神经网络在小样本学习(Few-Shot Learning)领域的应用,具体论文为《Few-Shot Learning With Graph Neural Networks》。主要介绍该方法的理论设计与关键代码实现。此方法以5-way 1-shot任务为例,应用于mini-imagenet数据集,旨在解决小样本问题。
方法框架概述如下:
1. 每个批次输入包含支持集(五个样本)与查询集(一个样本)。
2. 构建图结构,包含节点特征与邻接矩阵。节点特征通过卷积神经网络+全连接层实现编码,再与节点标签的一hot编码拼接。编码后,每个输入图像被编码为(batch_size=, feature_dim=)。
3. 进行迭代训练,初始化对角阵。邻接矩阵与节点特征在迭代过程中动态更新,依据节点之间的相似度计算得到。
4. 通过堆叠的卷积实现通道数降维,获得节点之间的相似度矩阵。利用此矩阵,执行消息传播,实现GNN层的堆叠,最终将支持集的标签和样本信息传播至查询集。
5. 交叉熵计算仅利用查询集的预测值与真实标签,因为支持集的标签信息已融合至网络中。
总结而言,图网络的消息传播机制是本文的关键,它能将支持集的样本特征与标签信息传播至查询集。此方法不仅提供了一种框架性的思路,也成为近年来GNN+Few-Shot领域研究的对比基准,展现了其重要性与典型性。欢迎加入小样本学习交流群,关注公众号“嬉皮工匠”获取更多信息。
图神经网络的Inductive learning 和 Transductive learning
在深入研究图神经网络时,遇到了两个关键概念:inductive learning和transductive learning。它们的区别可以从任务级别和数据处理方式来理解。首先,inductive learning,通常在图级别任务中应用,比如图分类,它将多个图划分为训练、验证和测试集,模型在训练阶段只使用训练集数据,对测试集保持未知,具有较好的泛化能力。这种学习方式的典型例子是GCN,它在训练时并不考虑测试集的节点信息。
相反,transductive learning则是针对节点级别的任务,如节点分类或链接预测,它的训练/验证/测试集是在同一图中进行划分的。在这种情况下,模型在训练时会使用到测试集的数据,即使没有标签,也能通过特征分布学习额外信息,增加模型预测的准确性。但值得注意的是,每次有新的样本加入,可能需要重新训练模型。
在图神经网络的具体实现中,inductive learning如GraphSAGE,会限制训练时只使用训练样本间的边,不涉及测试样本,这使得模型能在未知节点上生成嵌入。而transductive学习则打破了这种限制,允许模型在训练过程中利用所有节点的信息。
总结来说,inductive learning和transductive learning的区别在于数据的使用方式和任务的适应性,前者更注重泛化,后者在特定任务中可能表现更优,但可能需要更多的实时调整。理解这些概念有助于在实际应用中选择合适的图神经网络学习策略。
图神经网络(GNN)入门之旅(四)-GraphSAGE和PinSAGE
图神经网络(GNN)理论深入探讨中,我们已经了解了GCN的基础。接下来,让我们比较GCN和GraphSAGE(特别是PinSAGE)之间的关键差异: GCN是"直推式",全图计算,一次更新所有节点,适合全局信息捕捉,但计算量随着节点数增加而增加,不直接适用于超大图,且对新节点的泛化能力有限。 相比之下,GraphSAGE是"归纳式",通过采样邻居节点进行批训练,适用于超大图,且具有更好的泛化性。它可以为新节点生成embedding,学习节点和邻接节点间的映射关系,更灵活适应有向边,并支持多种聚合函数。 尽管GraphSAGE看似优于GCN,但实际上两者在本质上相似,只是视角不同。GCN的公式展示了其核心思想——节点特征的聚合。理解了GraphSAGE,GCN的复杂性可能就没那么难以理解了。 接下来,我们关注SAGE和PinSAGE的核心特点:SAGE: 重点在于学习节点表示法,而非固定节点表示。通过采样邻居特征并应用聚合函数生成embedding,提高灵活性。
PinSAGE: 建立在SAGE之上,引入了重要性采样、边权重和高效的MapReduce推理,适用于大规模图和生产者-消费者模式训练。
训练与DeepWalk和Node2Vec相比,PinSAGE利用监督学习和节点特征,适用于大规模和有监督的图学习任务。å¾ç¥ç»ç½ç»pytorchåº(å¾ç¥ç»ç½ç»keras)
GNNââå¾ç½ç»ç¸å ³ç¥è¯æ´ç
GNNæ¯å¯¹ä¿æå¾å¯¹ç§°æ§(ç½®æ¢ä¸åæ§)çå¾çææå±æ§(èç¹ãè¾¹ãå ¨å±ä¸ä¸æ)çå¯ä¼ååæ¢ãæ们å°ä½¿ç¨Gilmerç人æåºçâæ¶æ¯ä¼ éç¥ç»ç½ç»âæ¡æ¶æ建GNNï¼å¹¶ä½¿ç¨Battagliaç人ä»ç»çå¾ç½ç»ç½ç»æ¶æ示æå¾ã
âçç·å¥³âä¸æ¢æ¯æºäºéç¿ï¼å¨å¹´8ææ¥æåå¾®åâGNNâ并ä¸é å¾ãæ°´æµä¼ ãï¼ä¸å¼ æ¯æ¦æ¾ä¸¾åææï¼ä¸å¼ æ¯æ¦å¤§éã西é¨åºãæ½éè²ï¼çä¼¼æ讽çå®å¼ºå妻马èåç»çºªäººå®åçä¸æ£å½å ³ç³»ï¼æ责两人为çç·å¥³ã
GNNæ¯ä¸ç§è¿æ¥æ¨¡åï¼éè¿ç½ç»ä¸èç¹ä¹é´çä¿¡æ¯ä¼ éçæ¹å¼æ¥è·åå¾ä¸çä¾åå ³ç³»ï¼GNNéè¿ä»èç¹ä»»æ深度çé»å± æ¥æ´æ°è¯¥èç¹ç¶æï¼è¿ä¸ªç¶æè½å¤è¡¨ç¤ºç¶æä¿¡æ¯ã对äºGNN模åï¼æ们å¼å ¥äºæå¾ç±»åï¼ä¼ æç±»ååè®ç»ç±»ååç±»çåä½ã
PyTorchå°åºå¥½ç¨å¨åªé?1ã-æ¯çï¼pytorchæ¯ä¸ä¸ªé常好ç强åå¦ä¹ å¹³å°ï¼å®æä¸äºé常æ£çæ¡æ¶ç¨äºå¼ºåå¦ä¹ ï¼å¦OpenAIGymï¼Universeï¼Tensorflowçãæ¨å¯ä»¥ä½¿ç¨è¿äºæ¡æ¶æ¥æ建强åå¦ä¹ 模åï¼å¹¶ä½¿ç¨pytorchä¼åå¨æ¥è®ç»å®ä»¬ã
2ãPyTorchåTensorFlowé½å¾å¥½ï¼åæåç§ãPyTorchåTensorFlowæ¯ç®åæ主æµç两个深度å¦ä¹ æ¡æ¶ï¼ç»å¤§å¤æ°ç 究è ä¼éæ©PyTorchæè TensorFlowè¿è¡æ·±åº¦å¦ä¹ çå ¥é¨å¦ä¹ ã
3ãpytorchå¨æ计ç®å¾æä»ä¹å¥½å¤æ°æ®è®¡ç®Torchèªç§°ä¸ºç¥ç»ç½ç»ççNumpyï¼å 为ä»è½å°torch产ççtensoræ¾å¨GPUä¸å éè¿ç®(åææ¯ä½ æåéçGPU)ï¼å°±åNumpyä¼æarrayæ¾å¨CPUä¸å éè¿ç®ã
4ãåºäºå¤§æ°æ®åæå深度å¦ä¹ èåå±åºæ¥ç人工æºè½æ¬è´¨ä¸å·²ç»æ æ³ç¦»å¼pythonçæ¯æï¼ç®åä¸çä¼ç§ç人工æºè½å¦ä¹ æ¡æ¶å¦GoogleçTransorFlowãFaceBookçPyTorch以åå¼æºç¤¾åºçç¥ç»ç½ç»åºKarasçæ¯ç¨pythonå®ç°çã
5ãPytorchæ¯æºå¨å¦ä¹ åPythonä¸çå 费软件å ï¼é常æäºä½¿ç¨ãè¯æ³æ¨¡ænumpyï¼å æ¤ï¼å¦æä½ å¨pythonä¸æä¸äºç§å¦è®¡ç®ç»éªï¼é£ä¹ä¼ç¸å½æç¨çã
å¦ä½ç¨PyTorchå®ç°éå½ç¥ç»ç½ç»
1ã第ä¸æ¥ï¼å建模åï¼æ¨¡åå å«ä¸¤é¨åï¼ç¬¬ä¸é¨åæ¯Pytorchæä¾çRNNå±ï¼ç¬¬äºé¨åæ¯ä¸ä¸ªå ¨è¿æ¥å±ï¼ç¨äºå°RNNçè¾åºè½¬æ¢æè¾åºç®æ ç维度ã
2ã人è¸æ£æµåè¯å«ç½ç»å æ¬ï¼FaceBoxesãLFFDãVarGFaceNetã人ä½å§¿æè¯å«ç½ç»å æ¬ï¼StackedHourglassãNetworksSimpleBaselinesãLPNã
3ãä¸ä¸ªå ¨è¿æ¥ReLUç¥ç»ç½ç»ï¼ä¸ä¸ªéèå±ï¼æ²¡æbiasãç¨æ¥ä»xé¢æµyï¼ä½¿ç¨L2Lossãè¿ä¸å®ç°å®å ¨ä½¿ç¨numpyæ¥è®¡ç®ååç¥ç»ç½ç»ï¼lossï¼åååä¼ æãæ们使ç¨PyTorchtensorsæ¥å建ååç¥ç»ç½ç»ï¼è®¡ç®æ失ï¼ä»¥åååä¼ æã
4ãskip_gramsä¸æ¯è¡ç第äºåååºæ¥åèµ·æ¥å³å¯æå第ä¸æ¥å°±æ¯æ建datasetï¼ç¶åå®ä¹DataLoader模åæ¶æå¾ï¼æ³¨æï¼éå±çæ¿æ´»å½æ°æ¯çº¿æ§çï¼ç¸å½äºæ²¡åä»»ä½å¤çã
5ãinputå°±æ¯shape=(seq_lengthï¼batch_sizeï¼input_size)çå¼ éhtæ¯shape=(num_layers*num_directionsï¼batch_sizeï¼hidden_size)çå¼ éï¼å®å å«äºå¨å½åè¿ä¸ªbatch_sizeä¸æ¯ä¸ªå¥åçåå§éèç¶æãå ¶ä¸num_layerså°±æ¯LSTMçå±æ°ã
pytorchæ¯ä»ä¹?1ã项ç®åå«Pytorchï¼æ¨¡ååå«torchï¼è¿ä¸ªé®é¢æ²¡æ为ä»ä¹ï¼å¼åè å°±æ¯è¿ä¹å®ä¹çãå°±è·OpenCVä¸æ ·é¡¹ç®åå«OpenCVï¼æ¨¡ååå«cv2ã项ç®åå«Pillowï¼æ¨¡ååå«PILã
2ãpytorchä¸æ¯anacondaèªå¸¦çãanacondaèªå¸¦sklearnç¨äºæºå¨å¦ä¹ ï¼ä½æ¯æ²¡æèªå¸¦pytorchç¨äºæ·±åº¦å¦ä¹ ï¼æ以éè¦èªå·±æä½ä¸ä¸ï¼å®è£ pytorchãé¦å ï¼åå®æ们已ç»å®è£ 好äºanacondaï¼é£ä¹æ们就è½ä½¿ç¨condaæ¥å®è£ pytorchã
3ãä½è ï¼ç§æçå ½ç¼è¾ï¼æå¸å¹³å°è¿ç¯æç« ä»åºç¨çè§åº¦åºåï¼ä»ç»DPåDDPåå«å¨ä»ä¹æ åµä¸ä½¿ç¨ï¼ä»¥ååèªç使ç¨æ¹æ³ã以åDDPçä¿ååå 载模åççç¥ï¼åå¦ä½åæ¶ä½¿ç¨DDPå模å并è¡(modelparallel)ã
4ãpytorchå¨æ计ç®å¾æä»ä¹å¥½å¤æ°æ®è®¡ç®Torchèªç§°ä¸ºç¥ç»ç½ç»ççNumpyï¼å 为ä»è½å°torch产ççtensoræ¾å¨GPUä¸å éè¿ç®(åææ¯ä½ æåéçGPU)ï¼å°±åNumpyä¼æarrayæ¾å¨CPUä¸å éè¿ç®ã
5ãä¸ä¸ªå±æ¬¡ãpytorchæ°æ®ç»æä¸çæ½è±¡æ¯ï¼tensor-variable-netä¸ä¸ªå±æ¬¡ãåºæ¬ä¸å©ç¨variableånetè¿ä¸ªå±æ¬¡å°±è½å¤å¾æ¹ä¾¿çå®ç°ç½ç»äºTensorã
6ãææåèªå¹é寺éåä½æ¥é|å ¬ä¼å·QbitAIå°åºæ¯ææ ·çä¸ä¸ªbugï¼è½è®©%çPytorchåºä¸æï¼å°±è¿ç¹æ¯æAIæ»çæ·±åå°æ°ï¼è¿å«è¯´ï¼è¿ä¸ªbugè½å°ï¼ä½æå¤âç¡ç¾âçã
ä¸æ详解å¾ç¥ç»ç½ç»(äº)å·ç§¯ç¥ç»ç½ç»ä¸æ®éç¥ç»ç½ç»çåºå«å¨äºï¼å·ç§¯ç¥ç»ç½ç»å å«äºä¸ä¸ªç±å·ç§¯å±ååéæ ·å±ææçç¹å¾æ½åå¨ãå¨å·ç§¯ç¥ç»ç½ç»çå·ç§¯å±ä¸ï¼ä¸ä¸ªç¥ç»å åªä¸é¨åé»å±ç¥ç»å è¿æ¥ã
å¾ç¥ç»ç½ç»å°±æ¯ä¸é¨ç¨æ¥å¤çå¾æ°æ®çç¥ç»ç½ç»æ¶æãå ·ä½æ¥è¯´ï¼ä¼ç»å®å¾çæ¯ä¸ªé»æ¥ç©éµåèç¹ç¹å¾ï¼éè¿å°è¿ä¸¤ä¸ªè¾å ¥è¿è¡æç§å¾ä¸çæ å°ãä»èå¾å°æ¯ä¸ªèç¹ä¸ä¸å±çç¹å¾ã
â¡å个ç¥ç»å ï¼çº¿æ§å¯åçæ åµä¸ï¼æ¬è´¨æ¯ä¸æ¡ç´çº¿ï¼ï¼è¿æ¡ç´çº¿å°æ°æ®åå为两类ãè线æ§åç±»å¨æ¬èº«å°±æ¯ä¸ä¸ªåå±ç¥ç»ç½ç»ãâ¢ç¥ç»ç½ç»ï¼é线æ§å¯åçæ åµä¸ï¼ç¥ç»ç½ç»éè¿å¤ä¸ªéå±çæ¹æ³æ¥å®ç°é线æ§çå½æ°ã
pytorchåpythonçåºå«æ¯ä»ä¹?1ãPythonåpycharmæ¯ä¸ä¸æ ·çï¼äºè ææ¬è´¨çåºå«ãPythonæ¯ä¸é¨è®¡ç®æºç¨åºè®¾è®¡è¯è¨ï¼èpycharmæ¯ä¸æ¬¾éæå¼åç¯å¢ï¼æ¯ç¨æ¥è¾ å©å¼åçï¼æ以两è æ¯ä¸ä¸æ ·çã
2ãå®ä»¬çä¸è½½å°ååå®è£ çæ¹å¼ä¸åãpythonæ¯ä¸ç§åºæ¬ç¼è¯ç¯å¢ï¼å°±åjavaåjarä¸æ ·ãpycharmæ¯ä¸ç§éæå¼åç¯å¢ï¼ä¸ºäºè½å¤è®©ä½ å¿«éç¼å代ç ï¼ä¾¿äºè°è¯ã
3ãPyTorchæ¬è´¨ä¸æ¯Numpyçæ¿ä»£è ï¼èä¸æ¯æGPUã带æé«çº§åè½ï¼å¯ä»¥ç¨æ¥æ建åè®ç»æ·±åº¦ç¥ç»ç½ç»ãå¦æä½ çæNumpyãPython以å常è§ç深度å¦ä¹ æ¦å¿µï¼å·ç§¯å±ã循ç¯å±ãSGDçï¼ï¼ä¼é常容æä¸æPyTorchã
4ãpycharmåpythonåºå«ï¼é¦å å®ä»¬çä¸è½½å°ååå®è£ çæ¹å¼ä¸åãpythonæ¯ä¸ç§åºæ¬ç¼è¯ç¯å¢ï¼å°±åjavaåjarä¸æ ·ãpycharmæ¯ä¸ç§éæå¼åç¯å¢ï¼ä¸ºäºè½å¤è®©ä½ å¿«éç¼å代ç ï¼ä¾¿äºè°è¯ã
图神经网络学习笔记1Graph embedding
Graph Embedding 当使用One-hot编码表示图上的每个节点时,容易出现节点数较多时向量长度过长以及丢失节点在图上信息的问题。 为简化节点特征长度并保留图上信息,采用Graph Embedding,即在图上计算每个节点的嵌入。 本文介绍5种主要Graph Embedding方法:Deep Walk、LINE、SDNE、Node2Vec和Struc2Vec。 Deep Walk通过随机游走生成节点序列,使用word2vec学习每个节点的嵌入,适用于无向图。 LINE考虑节点的一阶和二阶相似性,分别优化,适用于大规模图,能捕获节点的局部结构信息。 Node2Vec结合DFS和BFS采样策略,通过随机游走生成序列,使用SkipGram学习嵌入,适用于大规模图。 Struc2Vec通过构建层次结构并优化相似性,学习节点嵌入,适用于节点分类任务,结构标识比邻居标识更重要。 SDNE使用多层非线性结构自动编码器优化一阶和二阶相似度,学习节点嵌入,对稀疏网络具有鲁棒性。 总结各方法特点如下:Deep Walk:随机游走生成序列,SkipGram学习嵌入。
Node2Vec:结合DFS和BFS采样,随机游走生成序列,SkipGram学习嵌入。
LINE:分别优化一阶和二阶相似性,学习嵌入。
Struc2Vec:构建层次结构优化相似性,学习嵌入。
SDNE:多层非线性结构自动编码器优化相似度,学习嵌入。
代码实现和实验可在GitHub项目中找到。一文说清楚图注意力神经网络的原理!图注意力神经网络的python实现和注意力熵
本文将深入解析图注意力神经网络(GRAPH ATTENTIONAL LAYER)的原理,并通过Python编程示例演示其在dgl库中的应用。首先,图注意力机制的核心在于理解节点向量如何依赖其邻居。在图神经网络中,节点向量的表示不仅由自身决定,更与其邻居的向量权重相关联,而GAT正是学习这种权重的机制,通过计算节点的重要性和邻居向量来更新节点表示。
GAT的实现过程分为三个步骤:首先,对节点的原始特征进行线性变换,生成[公式]维的新特征;其次,通过注意力机制计算注意力系数,这一步采用线性映射和LeakyReLU激活函数,将节点对的向量表示映射为一个权重值;然后,通过softmax标准化注意力系数,以便加权邻居节点向量。具体来说,就是将标准化后的系数作为权重,对邻居节点向量求和后通过sigmoid激活得到节点的新表示。
为了增加稳定性,GAT引入多头注意力机制,通过多个独立的注意力机制计算结果后取平均。接着,我们来看如何用Python实现GAT,以dgl库为例。例如,网络结构的定义包括维度变换层(fc)和注意力计算层(attn_fc),而edge_attention函数计算边连接的节点注意力系数,reduce_func则进行注意力系数的标准化和加权求和操作。
为了评估注意力系数的分布,dgl文档中引入了注意力熵这一指标,它反映了注意力的分散程度。在Cora数据集上,GAT与GCN性能相近,而在PPI数据集上,GAT表现出更强的性能,其注意力熵分布与均匀分布差异明显,表明GAT能够更有效地聚焦于关键节点,提高节点表示的准确性。