ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【老计带你懂AI算法】16:GNN图神经网络,专治社交网络和分子结构这类网状数据

【老计带你懂AI算法】16:GNN图神经网络,专治社交网络和分子结构这类网状数据 【老计带你懂AI算法】16GNN图神经网络专治社交网络和分子结构这类网状数据开头有些数据天生长成一张网前面讲的模型处理的数据要么是表格一行行独立样本要么是图像规整的像素网格要么是序列一个接一个。可现实里还有一大类数据长得完全不一样它天生是一张网。想想这些社交网络里人是点、好友关系是连线分子结构里原子是点、化学键是连线道路交通里路口是点、道路是连线知识图谱里概念是点、概念间的关系是连线。这类由节点和连接节点的边组成的数据叫图数据这里的图不是图片是数学上的图网状结构。它和前面那些规整的数据形态很不一样却恰恰对应了现实世界里大量万物互联的场景。图数据有个鲜明特点一个节点的意义很大程度上由它和谁相连决定。判断一个人是什么样看他的朋友圈子判断一个分子有什么性质看它的原子怎么连接。这种关系即信息的数据在生活里其实无处不在我们评价一个人常说物以类聚、看他跟谁混本质就是在用关系网络来推断个体图数据要刻画的正是这种直觉。而普通网络、CNN、RNN都不擅长处理它它们要求规整的表格、网格或序列。于是有了专门对付图数据的GNN图神经网络。为什么图数据这么难处理先说清楚图数据难在哪这样你就明白GNN为什么要另起炉灶。结构不规则。图像每个像素都有固定的上下左右邻居规规整整。可图里每个节点的邻居数量完全不同有的人几个好友、有的人几千个好友没法套用CNN那种固定窗口。没有固定顺序。序列有明确的先后图里的节点谁先谁后没有意义你打乱节点编号这张图还是同一张图。模型必须对这种换个编号不变的特性免疫。信息在关系里。最关键的信息不只在节点自己身上更在节点之间怎么连。举个直观的例子同样是一个银行账户孤立看它的流水可能很正常可一旦把它放进转账关系网里发现它和一群已知的诈骗账户频繁往来、还处在资金汇集的关键位置它的可疑程度立刻就不一样了。这种把节点放进关系网里才看得清的信息恰恰是传统模型最容易漏掉的也正是GNN的用武之地。这三个特点让处理图数据需要一套全新的思路核心就是想办法让每个节点把它周围邻居的信息也融合进来。这就是GNN的核心机制。GNN的核心打听邻居融合信息GNN的核心思想用一句大白话概括每个节点通过不断打听自己邻居的信息来更新对自己的理解。这个过程术语叫消息传递。具体怎么打听一轮消息传递是这样的每个节点收集它所有直接邻居的信息邻居们各自的特征。把这些邻居信息汇总起来比如求平均、加权综合再和自己原本的信息融合。更新自己的特征得到一个融合了邻居信息的新的自己。做完一轮每个节点就吸收了一圈直接邻居的信息。再做一轮因为邻居们上一轮也吸收了它们邻居的信息所以这一轮相当于间接吸收到了两圈以外的信息。做几轮下来每个节点就把它周围一大片的结构信息都融进了自己的表示里。打个比方你想了解一个陌生人先问问他的直接朋友对他的看法第一轮打听这些朋友的看法其实又受他们各自朋友的影响第二轮等于间接问到了朋友的朋友。打听几轮你就对这个人所处的整个圈子有了立体的了解从而更准确地判断他是个什么样的人。GNN就是让每个节点这样一轮轮打听、融合最终每个节点的表示都饱含了它在整张网络里的位置和关系信息。这个打听邻居、融合信息的机制天然解决了前面说的难题它不要求邻居数量固定多少邻居都能汇总也不在乎节点编号顺序汇总操作和顺序无关还把关系信息实实在在地用了起来。一个有意思的视角GNN其实是CNN的推广理解了消息传递你会发现GNN和上一篇的CNN骨子里是相通的这个视角能帮你把知识串起来。回想CNN的卷积一个像素的新值是由它周围那一小片邻居像素比如3乘3的九个综合计算出来的。这不就是融合邻居信息吗只不过图像里每个像素的邻居是规规整整、数量固定的上下左右所以能用一个固定形状的卷积窗口去扫。而图数据里每个节点的邻居数量不固定、位置不规则没法用固定窗口。GNN干的本质就是把CNN那套融合邻居的思想从规整的网格推广到了不规则的图上。所以最经典的一种GNN干脆就叫图卷积网络GCN名字里的卷积正是这个渊源。打个比方CNN是在整整齐齐的棋盘格上问邻居GNN是在乱七八糟的关系网里问邻居问的动作一样只是地形不同。理解了这层关系你就明白深度学习里很多看似不同的模型底层的思想其实是一脉相承、互相推广的这也是学这个系列越到后面越能体会到的乐趣万变不离其宗。输入和输出长什么样输入一张图包括节点每个节点带自己的特征、边谁和谁相连边有时也带特征。输出看任务分三个层次很好理解。节点级预测每个节点的属性。如判断社交网络里每个用户是不是水军。边级预测两个节点之间的关系。如推荐系统里预测用户和商品之间会不会产生购买这条边存不存在。图级预测整张图的属性。如判断一个分子整张图有没有毒性、能不能当药。上代码用GNN给节点分类用PyTorch Geometric专门做图的库在经典的引文网络数据集上做节点分类。输入图论文是节点、引用是边。输出每篇论文的类别。# 依赖pip install torch torch_geometricimporttorchimporttorch.nn.functionalasFfromtorch_geometric.nnimportGCNConvfromtorch_geometric.datasetsimportPlanetoid# Cora数据集:论文引文网络,节点是论文,边是引用关系,任务是给论文分类datasetPlanetoid(root./data/Cora,nameCora)datadataset[0]print(f节点数{data.num_nodes}边数{data.num_edges}类别数{dataset.num_classes})# 定义一个两层GCN(图卷积网络,GNN最经典的一种)classGCN(torch.nn.Module):def__init__(self):super().__init__()self.conv1GCNConv(dataset.num_features,16)# 第一轮消息传递self.conv2GCNConv(16,dataset.num_classes)# 第二轮消息传递defforward(self,data):x,edge_indexdata.x,data.edge_index xF.relu(self.conv1(x,edge_index))# 打听一圈邻居xself.conv2(x,edge_index)# 再打听一圈returnF.log_softmax(x,dim1)modelGCN()optimizertorch.optim.Adam(model.parameters(),lr0.01,weight_decay5e-4)model.train()forepochinrange(100):outmodel(data)lossF.nll_loss(out[data.train_mask],data.y[data.train_mask])# 只用训练节点算损失optimizer.zero_grad();loss.backward();optimizer.step()# 看测试准确率model.eval()predmodel(data).argmax(dim1)acc(pred[data.test_mask]data.y[data.test_mask]).float().mean()print(测试集节点分类准确率:,round(acc.item(),3))运行输出示例训练有随机性准确率约在0.8上下节点数2708 边数10556 类别数7 测试集节点分类准确率: 0.812运行你会看到不错的分类准确率。核心是GCNConv那两层每一层就是一轮消息传递打听邻居两层下来每个节点就融合了两圈邻居的信息再据此分类。训练依然是反向传播四步说明GNN也只是把层换成了图卷积层。关键概念消息传递轮数层数打听几圈邻居。层数太少信息融合不够太多又会让所有节点信息趋同术语叫过平滑通常两三层就够。聚合方式汇总邻居信息用求和、平均还是加权GAT用注意力加权让重要邻居权重更高是GNN的一个关键设计。常见变体GCN图卷积、GraphSAGE能处理大图和新节点、GAT图注意力是GNN的几种主流实现。优缺点与适用场景优点天生处理图这种关系数据、能充分利用节点间的连接信息、灵活支持节点边图三个层次的任务。缺点大规模图上亿节点计算和内存开销大、训练有一定门槛层数不能太深过平滑问题。适合场景社交网络分析好友推荐、社区发现、水军和欺诈识别。推荐系统把用户物品的复杂交互建成图效果往往比传统协同过滤更好如今是大厂推荐的重要方向。风控反欺诈欺诈团伙往往在关系网络里抱团GNN擅长揪出这种团伙。药物研发和材料科学把分子当图预测分子性质、加速新药筛选这是GNN特别亮眼的应用。知识图谱、交通预测等。不适合数据本身没有明显的关系网络结构那用不上它的长处。这里再点一个贯穿全系列的思想帮你把GNN放进大图景。GNN一轮轮消息传递之后每个节点最终得到的那个融合了周围结构信息的新表示其实就是这个节点的嵌入向量它用一组数字浓缩了这个节点是谁、在网络里处于什么位置、和谁关系密切。你有没有觉得眼熟第8篇PCA把高维数据压成精华表示第12篇矩阵分解把用户和物品变成隐向量这里GNN把节点变成嵌入向量本质都是同一件事学习事物的紧凑本质表示。一旦一个节点被表示成了向量你就能用前面学过的各种手段处理它算相似度找相似节点、丢进分类器判断类别、比较两个向量预测它们之间有没有关系。这个把万物都变成向量嵌入再来处理的思想是现代AI最核心的套路之一从推荐到图网络再到后面的大模型一以贯之。理解了它你就抓住了贯穿整个系列的一条主线也就更容易理解为什么后面大模型能把文字、图片、声音统一起来处理因为它们最终都被变成了同一个向量空间里的数字。小结与承上启下图数据由节点和边组成的网状数据社交、分子、交通、知识图谱关系即信息。难点结构不规则、无固定顺序、信息藏在关系里普通网络处理不了。GNN核心消息传递每个节点不断打听融合邻居信息几轮下来吸收周围一大片的结构信息。应用社交分析、推荐、风控反欺诈、药物研发凡是关系网络里的问题都可考虑是近年很受重视的方向。到这里我们已经讲了处理各种数据的网络表格用全连接、图像用CNN、序列用RNN、网状用GNN。它们大多是在做判断和预测这是什么、会怎样。接下来两篇我们进入一个更神奇的领域让AI去创造生成以假乱真的图片、艺术、内容。下一篇讲生成对抗网络GAN看两个网络怎么在互相较劲中学会创造。我们下一篇见。延伸阅读PyTorch Geometric 官方文档本篇GNN代码用的库https://pytorch-geometric.readthedocs.io图卷积网络GCN原始论文《Semi-Supervised Classification with Graph Convolutional Networks》Kipf Welling2016https://arxiv.org/abs/1609.02907说明以上为官方与经典公开资料地址可能随版本调整如打不开可用标题搜索。
返回列表