GNN

This is my blog.

在舍友 都想不到整理这篇的时候,我到新宿舍已经快两个月了 的熏陶下,开始看看GNN。

Paper

A Comprehensive Survey on Graph Neural Networks——2019

处理的数据不是从欧几里得空间中生成的,需要用图来表示数据之间的复杂关系。

we can represent an image as a regular grid in the Euclidean space. A convolutional neural network (CNN) is able to exploit the shift-invariance, local connectivity, and compositionality of image data

图卷积:周围点是无序的,并且点的个数是可变的。

  • Network embedding aims at representing network nodes as low-dimensional vector representations, preserving both network topology structure拓扑结构 and node content information, so that any subsequent graph analytics task can be easily performed using simple off-the-shelf machine learning algorithms

  • GNNs are deep learning models aiming at addressing graph-related tasks in an end-to-end manner. Many GNNs explicitly extract high-level representations.


图内核和GNN可以通过映射函数将图或节点嵌入向量空间。 不同之处在于图内核映射函数是确定性的,而不是可学习的。 由于成对相似性计算,图核方法明显受到计算瓶颈的困扰。 GNN则直接根据提取的图形表示进行图形分类,因此比图形核方法更有效。

分成四类:

  • recurrent graph neural networks
  • convolutional graph neural networks
  • graph autoencoders
  • spatial-temporal graph neural networks

看不下去了,waiting……我看了个啥ᶘ ᵒᴥᵒᶅ

Graph Neural Networks: A Review of Methods and Application

https://arxiv.org/pdf/1812.08434.pdf

Deep Learning on Graphs: A Survey

https://arxiv.org/pdf/1812.04202.pdf

CVPR 2020

  • Point-GNN- Graph Neural Network for 3D Object Detection in a Point Cloud

    PointGNN是一种单阶段检测方法,可以在一个场景中检测多个目标。由于点云通常是稀疏的且不均匀。把点云放在规则网格【CNN使用的条件】会导致每个cell中点的数目不均匀。对这些网格进行相同的卷积操作,可能会导致拥挤网格中的信息丢失或者网格浪费计算。并且图神经网络在每一层都重复使用图的边,避免了对点的重复分组和采样。

    整体做法:首先用降采样的方法来从原始点云场景中提取一部分点,降低复杂度;然后将点云有效地编码到一个固定半径的近邻图中【规定一个顶点最多和256个点有关联】,使用图作为一个点云的紧凑表示,用自动配准的机制来保证平移不变性,并设计一个框合并打分操作,以精确结合多个顶点的检测结果。

    每个迭代t使用一组不同的MLPt,这些MLPt在迭代之间不共享。 在图神经网络的T迭代之后,使用顶点状态值来预测每个顶点所属的对象的类别和边界框。

  • Grid-GCN for Fast and Scalable Point Cloud Learning

    图卷积网络(GCN)通过完全保留数据粒度和利用点间的相互关系表现出显著的性能。基于点的网络在数据结构化(例如,最远点采样(FPS)和邻接点查询)上花费了大量的时间,限制了其速度和可扩展性。Grid-GCN采用了一种新颖的数据结构策略—Coverage-Aware Grid Query(CAGQ)。通过利用网格空间的效率,CAGQ在降低理论时间复杂度的同时提高了空间覆盖率。与最远的点采样(FPS)和Ball Query等流行的采样方法相比,CAGQ的速度提高了50倍。

    模型包含有很多个GridConv层,每一层有2个阶段,第一个阶段是数据结构的构建,对数据选择其中心点,然后对中心的点邻居进行采样。第二个阶段是在第一步的基础之上聚合选出来的邻居节点的信息到一个中心点之上

    虑了节点的特征信息,同时考虑边的相关信息的时候还加入了权重参数而且在考虑节点之间的语义信息的时候,将所有环境节点的语意特征融合形成了fcxt,在考虑fcxt和中心节点的语义关系。
    关于其中边的权重,是指上一层该中心节点聚集到的节点的个数,上一层聚集到的节点个数越多,那么权重越大。

    自PointNet++ 和DGCNN问世以后,基本所有的点云处理模型都要使用采样或近邻查询。

    通过利用网格空间的效率,CAGQ提高了空间覆盖率,同时降低了理论时间复杂度。

  • Social-STGCNN: A Social Spatio-Temporal Graph Convolutional Neural Network for Human Trajectory Prediction

    提出了一个核函数来将行人之间的社会交互嵌入到邻接矩阵中。通过定性分析,我们的模型继承了行人轨迹之间可以预期的社会行为。

  • Object Relational Graph with Teacher-Recommended Learning for Video Captioning

    目标之间的交互

  • Graph Neural Based End-to-end Data Association Framework for Online Multiple-Object Tracking

    通过一个孪生网络求得了观测目标j与当前目标轨迹i的表观相似度,然后取目标轨迹的历史位置为输入,通过LSTM得到预测的位置,计算该位置与观测目标位置的运动相似度,两个相似度结合构建相似度矩阵。至此,所有目标轨迹与观测目标的相似度构成了一个二部图,以目标和观测信息作为节点,相似度作为边权,表观特征和位置信息拼接作为节点属性特征。

  • Learning a Neural Solver for Multiple Object Tracking

    图节点由所有帧的所有目标构成,直接将观测信息作为节点,没有跟踪,只有关联。节点属性特征由训练得到的表观特征和几何特征构成,其中几何特征为位置和形状。并且定义表观特征距离用欧氏距离度量

ICMR2019

  • Deep association: End-to-end graph-based learning for multiple object tracking with conv-graph neural network

    提取表观和运动特征,由此构建网络图,通过GNN得到最终的关联矩阵。首先相似度矩阵这里用的是IOU信息:

GCN

图卷积层的每个节点的特征学习可以概括为:

  • (对该节点的邻域节点特征)变换
  • (邻域节点)聚合
    • 增加自连接,考虑自己的特征
    • 度大节点特征越来越大;度小的节点相反,造成梯度爆炸或者梯度消失的问题
      • 通过邻接矩阵归一化: ;就是对邻域节点求平均
      • 对称归一化;考虑了自身和邻居节点
  • (激活函数来增加)非线性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import torch
import torch.nn as nn
class GraphConvolution(nn.Module):
"""GCN layer"""
def __init__(self, in_features, out_features, bias=True):
super(GraphConvolution, self).__init__()
self.in_features = in_features
self.out_features = out_features
self.weight = nn.Parameter(torch.Tensor(in_features, out_features))
if bias:
self.bias = nn.Parameter(torch.Tensor(out_features))
else:
self.register_parameter('bias', None)
self.reset_parameters()
def reset_parameters(self):
nn.init.kaiming_uniform_(self.weight)
if self.bias is not None:
nn.init.zeros_(self.bias)
def forward(self, input, adj):
support = torch.mm(input, self.weight)
output = torch.spmm(adj, support)
if self.bias is not None:
return output + self.bias
else:
return output
class GCN(nn.Module):
"""a simple two layer GCN"""
def __init__(self, nfeat, nhid, nclass):
super(GCN, self).__init__()
self.gc1 = GraphConvolution(nfeat, nhid)
self.gc2 = GraphConvolution(nhid, nclass)
def forward(self, input, adj):
h1 = F.relu(self.gc1(input, adj))
logits = self.gc2(h1, adj)
return logits

数据集

CORA

数据提取

1
2
# https://github.com/tkipf/pygcn/blob/master/pygcn/utils.py
adj, features, labels, idx_train, idx_val, idx_test = load_data(path="./data/cora/")

参考资料

《深入浅出图神经网络》

CS224W: https://www.bilibili.com/video/BV1jE41177A4?p=1&share_medium=android&share_plat=android&share_source=COPY&share_tag=s_i&timestamp=1601193236&unique_k=aqPZDE

转载请注明出处,谢谢。

愿 我是你的小太阳

买糖果去喽