cs224w(图机器学习)2021冬季课程学习笔记10 Applications of Graph Neural Networks

1,019 阅读16分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天

本文首发于CSDN。

诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合

@[toc]

YouTube 视频观看地址1 视频观看地址2 视频观看地址3


本章主要内容: 本章继续上一章1内容,讲design space剩下的两部分:图增强,如何训练一个GNN模型(GNN训练全流程)。

在图增强方面: 首先介绍图增强的原因和分类。 然后分别介绍: graph feature augmentation的方法:使用常数特征、独热编码、图结构信息 graph structure augmentation的方法:  对稀疏图:增加虚拟边或虚拟节点  对稠密图:节点邻居抽样

接下来讲GNN模型训练的学习目标。 首先介绍不同粒度任务下的prediction head(将节点嵌入转换为最终预测向量):节点级别的任务可以直接进行线性转换。链接级别的任务可以将节点对的嵌入进行concatenation或点积后进行线性转换。图级别的任务是将图中所有节点嵌入作池化操作,可以通过hierarchical global pooling方法来进行优化(实际应用:DiffPool)。 接下来介绍了预测值和标签的问题:有监督/无监督学习情况下的标签来源。 然后介绍损失函数:分类常用交叉熵2,回归任务常用MSE(L2 loss)。 接下来介绍评估指标:回归任务常用RMSE和MAE,分类任务常用accuracy和ROC AUC。 最后讲了设置GNN预测任务(将图数据拆分为训练/验证/测试集)的方法,分为transductive和inductive两种。


1. Graph Augmentation for GNNs

这一部分在 Lecture 71 的slides中写过,但是在 Lecture 8(本章)课程中讲的,所以我笔记也放在这一部分来做。

  1. 回顾一遍在 Lecture 71 第一节中讲过的GNN图增强部分:在这里插入图片描述
  2. 为什么要进行图增强? 我们在之前的学习过程中都假设原始数据和应用于GNN的计算图一致,但很多情况下原始数据可能不适宜于GNN:
    1. 特征层面:输入图可能缺少特征(也可能是特征很难编码)→特征增强
    2. 结构层面:
      1. 图可能过度稀疏→导致message passing效率低(边不够嘛)
      2. 图可能过度稠密→导致message passing代价太高(每次做message passing都需要对好几个节点做运算)
      3. 图可能太大→GPU装不下
    3. 事实上输入图很难恰好是适宜于GNN(图数据嵌入)的最优计算图在这里插入图片描述
  3. 图增强方法
    1. 图特征:输入图缺少特征→特征增强
    2. 图结构:
      1. 过于稀疏→增加虚拟节点/边
      2. 过于稠密→在message passing时抽样邻居
      3. 太大→在计算嵌入时抽样子图(在后续课程中会专门介绍如何将GNN方法泛化到大型数据上scale up)在这里插入图片描述

1.1 图特征增强Feature Augmentation

  1. 应对图上缺少特征的问题(比如只有邻接矩阵),标准方法:
    1. constant:给每个节点赋常数特征在这里插入图片描述
    2. one-hot:给每个节点赋唯一ID,将ID转换为独热编码向量的形式(即ID对应索引的元素为1,其他元素都为0)在这里插入图片描述
    3. 两种方法的比较:
constant node featureone-hot node feature
表示能力中等:所有节点都一样,但是GNN仍然可以学到图结构信息高:每个节点ID唯一,所以可以储存节点特有的信息
inductive能力高:对新节点再赋这个常数就行低:无法泛化到新节点上,因为对新节点再赋ID的话,GNN无法嵌入这个新ID
计算力代价低:只有一维特征高:O(V)O(\|V\|) 维特征,无法应用到大型图上
适用情况所有图,inductive小图,transductive
在这里插入图片描述
  1. 应对GNN很难学到特定图结构的问题(如果不用特征专门加以区分,GNN就学不到这些特征):
    1. 举例:节点所处环上节点数cycle count这一属性 问题:因为度数相同(都是2),所以无论环上有多少个节点,GNN都会得到相同的计算图(二叉树),无法分别。 解决方法:加上cycle count这一特征(独热编码向量,节点数对应索引的元素为1,其他元素为0)。 在这里插入图片描述在这里插入图片描述在这里插入图片描述
    2. 其他常用于数据增强的特征:clustering coefficient,centrality(及任何 Lecture 23 中讲过的特征),PageRank4在这里插入图片描述

1.2 图结构增强Structure Augmentation

  1. 对稀疏图:增加虚拟边virtual nodes或虚拟节点virtual edges
    1. 虚拟边:在2-hop邻居之间增加虚拟边 直觉:在GNN计算时不用邻接矩阵 AA,而用 A+A2A+A^2A2A^2 的每个元素是对应节点对之间长度为2的路径数量35 适用范例:bipartite graphs6  如作者-论文组成的bipartite graph,增加虚拟边可以在合作作者或者同作者论文之间增加链接。 这样GNN可以浅一些,训练也会更快一些(因为在同类节点之间可以直接交互了) 但如果添的边太多了也会增加复杂性在这里插入图片描述
    2. 虚拟节点:增加一个虚拟节点,这个虚拟节点与图(或者一个从图中选出的子图)上的所有节点相连 这会导致所有节点最长距离变成2(节点A-虚拟节点-节点B) 优点:稀疏图上message passing大幅提升在这里插入图片描述
  2. 对稠密图:节点邻居抽样node neighborhood sampling7 在message passing的过程中,不使用一个节点的全部邻居,而改为抽样一部分邻居。 在这里插入图片描述
    举例来说,对每一层,在传播信息时随机选2个邻居,计算图就会从上图变成下图:在这里插入图片描述
    优点:计算图变小 缺点:可能会损失重要信息(因为有的邻居直接不用了嘛)
    可以每次抽样不同的邻居,以增加模型鲁棒性:在这里插入图片描述
  3. 节点邻居抽样示例8 我们希望经抽样后,结果跟应用所有邻居的结果类似,但还能高效减少计算代价(在后续课程中会专门介绍如何将GNN方法泛化到大型数据上scale up)。 实践证明效果很好。在这里插入图片描述

2. Learning Objective

  1. 回顾一遍在 Lecture 71 第一节中讲过的学习目标部分:我们如何训练一个GNN模型?在这里插入图片描述
  2. GNN训练pipeline 输入数据→用GNN训练数据→得到节点嵌入→prediction head(在不同粒度的任务下,将节点嵌入转换为最终需要的预测向量)→得到预测向量和标签→选取损失函数→选取评估指标 (前三部分已经在本章及上章前文讲述过)在这里插入图片描述

2.1 Prediction Head

  1. 不同粒度下的prediction head:节点级别,边级别,图级别在这里插入图片描述在这里插入图片描述
  2. 节点级别:直接用节点嵌入做预测 GNN得到的节点嵌入 hv(L)\mathbf{h}_v^{(L)}:d维 预测目标向量:k维(k-way prediction)   分类任务:在k个类别之间做分类   回归任务:在k个目标target / characteristic 上做回归 y^v=Headnode(hv(L))=W(H)hv(L)\hat{\mathbf{y}}_v=\text{Head}_{\text{node}}(\mathbf{h}_v^{(L)})=\mathbf{W}^{(H)}\mathbf{h}_v^{(L)} W(H)Rkd\mathbf{W}^{(H)}\in\mathbb{R}^{k*d},将d维嵌入映射到k维输出在这里插入图片描述
  3. 边级别:用节点嵌入对来做预测 k-way prediction y^uv=Headedge(hu(L),hv(L))\hat{\mathbf{y}}_{uv}=\text{Head}_{\text{edge}}(\mathbf{h}_u^{(L)},\mathbf{h}_v^{(L)})在这里插入图片描述 Headedge(hu(L),hv(L))\text{Head}_{\text{edge}}(\mathbf{h}_u^{(L)},\mathbf{h}_v^{(L)}) 的可选方法:
    1. concatenation+linear 这种方法在讲GAT1的时候介绍过,注意力机制 aa 可以用这种方法将节点对信息转换为注意力系数 eey^uv=Linear(Concat(hu(L),hv(L)))\hat{\mathbf{y}}_{uv}=\text{Linear}(\text{Concat}(\mathbf{h}_u^{(L)},\mathbf{h}_v^{(L)})) Linear()\text{Linear}(\cdot) 将2d维嵌入映射到k维输出在这里插入图片描述
    2. 点积:y^uv=(hu(L))Thv(L)\hat{\mathbf{y}}_{uv}=(\mathbf{h}_u^{(L)})^T\mathbf{h}_v^{(L)} 这种方法只能应用于1-way prediction(因为点积输出结果就一维嘛),例如链接预测任务(预测边是否存在)
      应用到k-way prediction上:跟GAT中的多头注意力机制1类似,多算几组然后合并(公式中的 W(1),...,W(k)\mathbf{W}^{(1)},...,\mathbf{W}^{(k)} 是可学习的参数):
    ... \\ \textcolor{brown}{\hat{\mathbf{y}}_{uv}^{(k)}}=(\mathbf{h}_u^{(L)})^T\textcolor{red}{\mathbf{W}^{(k)}}\mathbf{h}_v^{(L)} \\ \hat{\mathbf{y}}_{uv}=Concat(\textcolor{brown}{\hat{\mathbf{y}}_{uv}^{(1)}},...,\textcolor{brown}{\hat{\mathbf{y}}_{uv}^{(k)}})\textcolor{blue}{\in\mathbb{R}^k}$$![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/14da87253a37436cb49a5952e015ee36~tplv-k3u1fbpfcp-zoom-1.image)
  4. 图级别:用图中所有节点的嵌入向量来做预测 k-way prediction y^G=Headgraph({hv(L)Rd,vG})\hat{\mathbf{y}}_G=\text{Head}_{\text{graph}}(\{\mathbf{h}_v^{(L)}\in\mathbb{R}^d,\forall v\in G\}) Headgraph()\text{Head}_{\text{graph}}(\cdot) 与GNN单层中的 AGG()\text{AGG}(\cdot)1 类似,都是将若干嵌入聚合为一个嵌入。 在这里插入图片描述 Headgraph({hv(L)Rd,vG)\text{Head}_{\text{graph}}(\{\mathbf{h}_v^{(L)}\in\mathbb{R}^d,\forall v\in G) 的可选方法9
    1. global mean pooling:y^G=Mean({hv(L)Rd,vG})\hat{\mathbf{y}}_G=\textcolor{red}{\text{Mean}}(\{\mathbf{h}_v^{(L)}\in\mathbb{R}^d,\forall v\in G\})
    2. global max pooling:y^G=Max({hv(L)Rd,vG})\hat{\mathbf{y}}_G=\textcolor{red}{\text{Max}}(\{\mathbf{h}_v^{(L)}\in\mathbb{R}^d,\forall v\in G\})
    3. global sum pooling:y^G=Sum({hv(L)Rd,vG})\hat{\mathbf{y}}_G=\textcolor{red}{\text{Sum}}(\{\mathbf{h}_v^{(L)}\in\mathbb{R}^d,\forall v\in G\})在这里插入图片描述
    4. 如果想比较不同大小的图,mean方法可能比较好(因为结果不受节点数量的影响);如果关心图的大小等信息,sum方法可能比较好。 这些方法都在小图上表现很好。 但是在大图上的global pooling方法可能会面临丢失信息的问题。
      举例:使用一维节点嵌入。 G1G_1 的节点嵌入为 {1,2,0,1,2}\{-1,-2,0,1,2\}G2G_2 的节点嵌入为 {10,20,0,10,20}\{-10,-20,0,10,20\},显然两个图的节点嵌入差别很大,图结构很不相同。 但是经过global sum pooling后: y^G1=Sum({1,2,0,1,2})=0\hat{\mathbf{y}}_{G_1}=\text{Sum}(\{-1,-2,0,1,2\})=0 y^G2=Sum({10,20,0,10,20})=0\hat{\mathbf{y}}_{G_2}=\text{Sum}(\{-10,-20,0,10,20\})=0 就这两个图的表示向量一样了,无法做出区分,这是不行的。在这里插入图片描述 为了解决这一问题,解决方法是hierarchical global pooling:分层聚合节点嵌入。 举例:使用 ReLU(Sum())\text{ReLU}(\text{Sum}(\cdot)) 做聚合,先分别聚合前两个节点和后三个节点的嵌入,然后再聚合这两个嵌入。 G1G_1: 第一轮:ya^=ReLU(Sum({1,2}))=0,yb^=ReLU(Sum({0,1,2}))=3\textcolor{blue}{\hat{\mathbf{y}_a}=\text{ReLU}(\text{Sum}(\{-1,-2\}))=0},\textcolor{orange}{\hat{\mathbf{y}_b}=\text{ReLU}(\text{Sum}(\{0,1,2\}))=3} 第二轮:yG^=ReLU(Sum({ya,yb}))=3\textcolor{red}{\hat{\mathbf{y}_G}=\text{ReLU}(\text{Sum}(\{\mathbf{y}_a,\mathbf{y}_b\}))=3} G2G_2: 第一轮:ya^=ReLU(Sum({10,20}))=0,yb^=ReLU(Sum({0,10,20}))=30\textcolor{blue}{\hat{\mathbf{y}_a}=\text{ReLU}(\text{Sum}(\{-10,-20\}))=0},\textcolor{orange}{\hat{\mathbf{y}_b}=\text{ReLU}(\text{Sum}(\{0,10,20\}))=30} 第二轮:yG^=ReLU(Sum({ya,yb}))=30\textcolor{brown}{\hat{\mathbf{y}_G}=\text{ReLU}(\text{Sum}(\{\mathbf{y}_a,\mathbf{y}_b\}))=30} 这样我们就可以将 G1G_1G2G_2 作出区分了在这里插入图片描述 一个hierarchical pooling的实际应用:DiffPool10(惯例,我又没咋看懂) 大致来说,就是每一次先用一个GNN计算节点嵌入,然后用另一个GNN(这两个GNN可以同步运算)(两个GNN联合训练jointly train)计算节点属于哪一类,然后按照每一类对图进行池化。每一类得到一个表示向量,保留类间的链接,产生一个新的图。重复这一过程,直至得到最终的表示向量。 将图池化问题与社区发现问题相结合,用节点嵌入识别社区→聚合社区内的节点得到community embeddings→用community embeddings识别supercommunity→聚合supercommunity内的节点得到supercommunity embeddings……在这里插入图片描述在这里插入图片描述

2.2 Predictions & Labels

  1. 有监督问题的标签 & 无监督问题的信号在这里插入图片描述
  2. 有监督学习supervise learning:直接给出标签(如一个分子图是药的概率) 无监督学习unsupervised learning / self-supervised learning:使用图自身的信号(如链接预测:预测两节点间是否有边) 有时这两种情况下的分别比较模糊,在无监督学习任务中也可能有“有监督任务”,如训练GNN以预测节点clustering coefficient3在这里插入图片描述
  3. 有监督学习的标签:按照实际情况而来 举例: 节点级别——引用网络中,节点(论文)属于哪一学科 边级别——交易网络中,边(交易)是否有欺诈行为 图级别——图(分子)是药的概率
    建议将无监督学习任务规约到三种粒度下的标签预测任务,因为这种预测任务有很多已做过的工作可资参考,会好做些。 例如聚类任务可视为节点属于某一类的预测任务。在这里插入图片描述
  4. 无监督学习的信号: 在没有外部标签时,可以使用图自身的信号来作为有监督学习的标签。举例来说,GNN可以预测: 节点级别:节点统计量(如clustering coefficient3, PageRank4 等) 边级别:链接预测(隐藏两节点间的边,预测此处是否存在链接) 图级别:图统计量(如预测两个图是否同构) 这些都是不需要外部标签的在这里插入图片描述

2.3 损失函数Loss Function

  1. 分类任务常用交叉熵,回归任务常用MSE在这里插入图片描述
  2. 我们用 y^(i)\mathbf{\hat{y}}^{(i)}y(i)\mathbf{y}^{(i)} 来统一指代各级别的预测值和标签(ii 是观测编号)在这里插入图片描述
  3. 分类任务的标签 y(i)\mathbf{y}^{(i)} 是离散数值,如节点分类任务的标签是节点属于哪一类。 回归任务的标签 y(i)\mathbf{y}^{(i)} 是连续数值,如预测分子图是药的概率。 两种任务都能用GNN。其区别主要在于损失函数和评估指标。在这里插入图片描述
  4. 分类任务的损失函数交叉熵 CE(y(i),y^(i))=j=1K(yj(i)logy^j(i))\text{CE}\left(\mathbf{y}^{(i)},\mathbf{\hat{y}}^{(i)}\right)=-\sum_{j=1}^K\left(\mathbf{y}^{(i)}_j\log{\mathbf{\hat y}^{(i)}_j}\right)ii 是观测序号,jj 是类别对应的维度索引) Loss=i=1NCE(y(i),y^(i))\text{Loss}=\sum_{i=1}^N\text{CE}\left(\mathbf{y}^{(i)},\mathbf{\hat y}^{(i)}\right)在这里插入图片描述
  5. 回归任务的损失函数MSE / L2 loss MSE(y(i),y^(i))=j=1K(yj(i)y^j(i))2\text{MSE}\left(\mathbf{y}^{(i)},\mathbf{\hat y}^{(i)}\right)=\sum_{j=1}^K\left(\mathbf{y}^{(i)}_j-\mathbf{\hat y}_j^{(i)}\right)^2ii 是观测序号,jj 是类别对应的维度索引) Loss=i=1NMSE(y(i),y^(i))\text{Loss}=\sum\limits_{i=1}^N\text{MSE}\left(\mathbf{y}^{(i)},\mathbf{\hat y}^{(i)}\right) MSE的优点:连续、易于微分……等在这里插入图片描述
  6. 此外还有其他损失函数,如maximum margin loss,适用于我们关心节点顺序、不关心具体数值而关心其排行的情况11

2.4 评估指标Evaluation Metrics

  1. evaluation metrics12:Accuracy和ROC AUC在这里插入图片描述
  2. 回归任务 root mean square error (RMSE):i=1N(y(i)y^(i))2N\sqrt{\sum^N_{i=1}\dfrac{\left(\mathbf{y}^{(i)}-\mathbf{\hat y}^{(i)}\right)^2}{N}} mean absolute error (MAE):i=1Ny(i)y^(i)N\dfrac{\sum^N_{i=1}\left|\mathbf{y}^{(i)}-\mathbf{\hat y}^{(i)}\right|}{N}在这里插入图片描述
  3. 分类任务
    1. 多分类任务 accuracy:1[arg max(y^(i))=y(i)]N\dfrac{1\left[\argmax(\mathbf{\hat y}^{(i)})=\mathbf{y}^{(i)}\right]}{N}
    2. 二分类任务 对分类阈值敏感的评估指标: (如果输出范围为 [0,1][0,1],我们用0.5作为阈值) accuracy precision / recall (因为数据不平衡时可能会出现accuracy虚高的情况。比如99%的样本都是负样本,那么分类器只要预测所有样本为负就可以获得99%的accuracy,但这没有意义。所以需要其他评估指标来解决这一问题)
      对分类阈值不敏感的评估指标:ROC AUC在这里插入图片描述 二元分类的评估指标(可参考 sklearn.metrics.classification_report — scikit-learn 0.24.2 documentation): accuracy(分类正确的观测占所有观测的比例) precision(预测为正的样本中真的为正(预测正确)的样本所占比例) recall(真的为正的样本中预测为正(预测正确)的样本所占比例) F1-Score(precision和recall的调和平均值,信息抽取、文本挖掘等领域常用) 混淆矩阵在这里插入图片描述
      ROC曲线:TPR(recall)和FPR之间的权衡(对角斜线说明是随机分类器)在这里插入图片描述 ROC AUC ROC曲线下面积。越高越好,0.5是随机分类器,1是完美分类器。 随机抽取一个正样本和一个负样本,正样本被识别为正样本的概率比负样本被识别为正样本的概率高的概率。在这里插入图片描述

2.5 切分数据集

  1. 将数据集切分为训练集、验证集、测试集在这里插入图片描述
  2. fixed / random split fixed split:只切分一次数据集,此后一直使用这种切分方式 random split:随机切分数据集,应用多次随机切分后计算结果的平均值
  3. 我们希望三部分数据之间没有交叉,即留出法hold-out data13。 但由于图结构的特殊性,如果直接像普通数据一样切分图数据集,我们可能不能保证测试集隔绝于训练集:就是说,测试集里面的数据可能与训练集里面的数据有边相连,在message passing的过程中就会互相影响,导致信息泄露。 在这里插入图片描述在这里插入图片描述在这里插入图片描述
  4. 解决方式1:transductive setting 输入全图在所有split中可见。仅切分(节点)标签。在这里插入图片描述
  5. 解决方式2:inductive setting 去掉各split之间的链接,得到多个互相无关的图。这样不同split之间的节点就不会互相影响。在这里插入图片描述
  6. transductive setting / inductive setting transductive setting: ①测试集、验证集、训练集在同一个图上,整个数据集由一张图构成 ②全图在所有split中可见。 ③仅适用于节点/边预测任务。
    inductive setting: ①测试集、验证集、训练集分别在不同图上,整个数据集由多个图构成。 ②每个split只能看到split内的图。成功的模型应该可以泛化到没见过的图上。 ③适用于节点/边/图预测任务。在这里插入图片描述
  7. 示例:节点分类任务 transductive:各split可见全图结构,但只能观察到所属节点的标签 inductive:切分多个图,如果没有多个图就将一个图切分成3部分、并去除各部分之间连接的边在这里插入图片描述
  8. 示例:图预测任务 只适用inductive setting,将不同的图划分到不同的split中。在这里插入图片描述
  9. 示例:链接预测任务 任务目标:预测出缺失的边。 这是个 unsupervised / self-supervised 任务,需要自行建立标签、自主切分数据集。 需要隐藏一些边,然后让GNN预测边是否存在。在这里插入图片描述
    在切分数据集时,我们需要切分两次。 第一步:在原图中将边分为message edges(用于GNN message passing)和supervision edges(作为GNN的预测目标)。只留下message edges,不将supervision edges传入GNN。在这里插入图片描述 第二步:切分数据集  方法1:inductive link prediction split  划分出3个不同的图组成的split,每个split里的边按照第一步分成message edges和supervision edges在这里插入图片描述在这里插入图片描述  方法2:transductive link prediction split(链接预测任务的默认设置方式)  在一张图中进行切分:在训练时要留出验证集/测试集的边,而且注意边既是图结构又是标签,所以还要留出supervision edges(要不然还搞啥呢……)  具体来说:   训练:用 training message edges 预测 training supervision edges   验证:用 training message edges 和 training supervision edges 预测 validation edges   测试:用 training message edges 和 training supervision edges 和 validation edges 预测 test edges  是个链接越来越多,图变得越来越稠密的过程。这是因为在训练过程之后,supervision edges就被GNN获知了,所以在验证时就要应用 supervision edges 来进行 message passing(测试过程逻辑类似)在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述不同论文中链接预测的数据集切分方式可能不同。

2.6 GNN Training Pipeline

在这里插入图片描述

3. GNN design space 总结

在这里插入图片描述

Footnotes

  1. 可参考我撰写的笔记:cs224w(图机器学习)2021冬季课程学习笔记9 Graph Neural Networks 2: Design Space 2 3 4 5 6 7

  2. 可参考我撰写的笔记:cs224w(图机器学习)2021冬季课程学习笔记7 Graph Neural Networks 1: GNN Model

  3. 可参考我撰写的笔记:cs224w(图机器学习)2021冬季课程学习笔记2: Traditional Methods for ML on Graphs 2 3 4

  4. 可参考我撰写的笔记:cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix) 2

  5. 老师在课上讲,如果邻接矩阵不是方阵,就用 AATAA^TATAA^TA ……我妹搞懂,邻接矩阵还能不是方阵???

  6. 可参考我撰写的笔记:cs224w(图机器学习)2021冬季课程学习笔记1 Introduction; Machine Learning for Graphs

  7. Hamilton et al. Inductive Representation Learning on Large Graphs, NeurIPS 2017

  8. Ying et al. Graph Convolutional Neural Networks for Web-Scale Recommender Systems, KDD 2018 ACM网址 论文下载地址

  9. K. Xu*, W. Hu*, J. Leskovec, S. Jegelka. How Powerful Are Graph Neural Networks, ICLR 2019

  10. Ying et al. Hierarchical Graph Representation Learning with Differentiable Pooling, NeurIPS 2018 其他参考资料: ①[DIFFPOOL] - Hierarchical Graph Representation Learning with Differentiable Pooling 图分类 NeurIPS 2018_知行合一,止于至善-CSDN博客_diffpool

  11. 这个我查了一下,好像专门有个ranking loss,还有hinge loss什么的,我简单看了一下感觉有点难,因为在这里没用到所以我还没看。以后看。

  12. 可参考sklearn官方文档:3.3. Metrics and scoring: quantifying the quality of predictions — scikit-learn 0.24.2 documentation

  13. 可参考:模型评估方法之held-out data(留出法)_上帝是个娘们的博客-CSDN博客_held-out