《学习geometric deep learning笔记系列》第一篇,Non-Euclidean Structure Data之我见

《学习geometric deep learning笔记系列》第一篇,Non-Euclidean Structure Data之我见
FesianXu at UESTC

前言

本文是笔者在学习Geometric deep learning的过程中的一些笔记和想法,较为零散,主要纪录了非欧几里德结构数据和欧几里德结构数据之间的区别,后续会引出图卷积网络模型。如有谬误请联系指出,本文遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明并且联系笔者,谢谢

∇ \nabla 联系方式:

e-mail: FesianXu@gmail.com

QQ: 973926198

github: https://github.com/FesianXu

知乎专栏: 计算机视觉/计算机图形理论与应用

微信公众号

qrcode


总的来说,数据类型可以分为两大类,分别是:欧几里德结构数据(Euclidean Structure Data) 以及 非欧几里德结构数据(Non-Euclidean Structure Data),接下来谈自己对这两类数据的认识。

欧几里德结构样本

在我们日常生活中,最常见到的媒体介质莫过于是图片(image)视频(video)以及语音(voice)了,这些数据有一个特点就是:“排列整齐”。什么叫做排列整齐呢?举例子来说,图片可以用矩阵来表达其像素,就如同下图所示[2]:

formatted_data

Fig 1. 欧几里德结构数据示例。

对于某个节点,我们很容易可以找出其邻居节点,就在旁边嘛,不偏不倚。而且,图片数据天然的,节点和邻居节点有着统计上的相关性,因此能够找出邻居节点意味着可以很容易地定义出卷积这个操作出来,而我们在深度学习的过程中知道,卷积这个操作是提取局部特征以及层次全局特征的利器,因此图片可以很容易定义出卷积操作出来,并且在深度网络中进行进一步操作。

而且,因为这类型的数据排列整齐,不同样本之间可以容易的定义出“距离”这个概念出来。我们且思考,假设现在有两个图片样本,尽管其图片大小可能不一致,但是总是可以通过空间下采样的方式将其统一到同一个尺寸的,然后直接逐个像素点进行相减后取得平方和,求得两个样本之间的欧几里德距离是完全可以进行的。如下式所见:
d ( s i , s j ) = 1 2 ∣ ∣ s i − s j ∣ ∣ 2 (1) d(\mathbf{s_i}, \mathbf{s_j}) = \dfrac{1}{2}||\mathbf{s_i}-\mathbf{s_j}||^2 \tag{1} d(si,sj)=21sisj2(1)
因此,不妨把图片样本的不同像素点看成是高维欧几里德空间中的某个维度,因此一张 m × n m \times n m×n的图片可以看成是 m × n m \times n m×n维的欧几里德样本空间中的一个点,而不同样本之间的距离就体现在了样本点之间的距离了。

这就是称之为欧几里德结构数据的原因了。 同样的,视频可以在时间轴上进行采样做到统一的目的,而音频也是一样的。因此它们都是符合欧几里德距离定义的类型的样本。

非欧几里德结构样本

非欧几里德结构的样本总得来说有两大类型[1],分别是图(Graph)数据[3]和流形数据[4],如Fig 2和Fig 3所示:

graph_data

Fig 2. 图结构数据是典型的非欧几里德结构数据。

manifold

Fig 3. 流形数据也是典型的非欧几里德结构数据。

这两类数据有个特点就是,排列不整齐,比较的随意。具体体现在:对于数据中的某个点,难以定义出其邻居节点出来,或者是不同节点的邻居节点的数量是不同的[5],这个其实是一个特别麻烦的问题,因为这样就意味着难以在这类型的数据上定义出和图像等数据上相同的卷积操作出来,而且因为每个样本的节点排列可能都不同,比如在生物医学中的分子筛选中,显然这个是一个Graph数据的应用,但是我们都明白,不同的分子结构的原子连接数量,方式可能都是不同的,因此难以定义出其欧几里德距离出来,这个是和我们的欧几里德结构数据明显不同的。因此这类型的数据不能看成是在欧几里德样本空间中的一个样本点了,而是要想办法将其嵌入(embed)到合适的欧几里德空间后再进行度量。而我们现在流行的Graph Neural Network便可以进行这类型的操作。这就是我们的后话了。


另外,欧几里德结构数据所谓的“排列整齐”也可以视为是一种特殊的非欧几里德结构数据,比如说是一种特殊的Graph数据,如下图所示[5]:

image_data

Fig 4. 即便是欧几里德结构数据,也可以视为是特殊形式的非欧几里德结构数据。

因此,用Graph Neural Network的方法同样可以应用在欧几里德结构数据上,比如文献[6]中report的结果来看,的确这样是可行的。事实上,只要是赋范空间中的数据,都可以建立数据节点与数据节点之间的某种关联,都可以尝试用非欧几里德结构数据的深度方法进行实验。[7]

那么什么叫做赋范空间中的数据呢?赋范空间,指的就是定义了范数的向量空间,我认为,指的是数据中的每个样本的单元的特征维度都是一致的,比如,一张图片的像素一般都是RGB三个维度的,不同像素之间可以进行求范数的操作,再比如,一个Graph上的某个节点和另外一个节点的维度都是相同的,因此也可以定义出范数出来。不过这个是我一家之言,如有其他见解,请在评论区指出。

result

Fig 5. 在传统的图片上利用图神经网络进行分类,可以达到接近传统CNN方法的效果。意味着欧几里德结构数据也可以通过某种形式,用非欧几里德结构数据模型建模。

该系列的后续

  1. 《Geometric Deep Learning学习笔记》第二篇, 在Graph上定义卷积操作,图卷积网络

  2. 《Geometric Deep Learning学习笔记》第三篇,GCN的空间域理解,Message Passing以及其含义


Reference

[1]. Bronstein M M, Bruna J, LeCun Y, et al. Geometric deep learning: going beyond euclidean data[J]. IEEE Signal Processing Magazine, 2017, 34(4): 18-42.
[2]. https://www.zhihu.com/question/54504471
[3]. https://en.wikipedia.org/wiki/Graph
[4]. https://en.wikipedia.org/wiki/Manifold
[5]. Niepert M, Ahmed M, Kutzkov K. Learning convolutional neural networks for graphs[C]//International conference on machine learning. 2016: 2014-2023.
[6]. Defferrard M, Bresson X, Vandergheynst P. Convolutional neural networks on graphs with fast localized spectral filtering[C]//Advances in neural information processing systems. 2016: 3844-3852.
[7]. https://www.zhihu.com/question/54504471

  • 20
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
Pytorch-geometric是一个基于PyTorch的神经网络框架,它提供了大量的神经网络层和数据集,可以方便地进行数据的建模和训练。Pytorch-geometric的主要特点包括: 1. 支持多种神经网络层,包括GCN、GAT、GraphSAGE等。 2. 提供了大量的数据集,包括Cora、CiteSeer、PubMed等常用数据集。 3. 支持GPU加速,可以快速地进行模型训练和推理。 4. 提供了丰富的可视化工具,可以方便地对数据进行可视化和分析。 下面是一个使用Pytorch-geometric进行分类的例子: ```python import torch from torch_geometric.datasets import Planetoid import torch.nn.functional as F from torch_geometric.nn import GCNConv # 加载Cora数据集 dataset = Planetoid(root='/tmp/Cora', name='Cora') data = dataset[0] # 定义GCN模型 class Net(torch.nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = GCNConv(dataset.num_features, 16) self.conv2 = GCNConv(16, dataset.num_classes) def forward(self, x, edge_index): x = F.relu(self.conv1(x, edge_index)) x = F.dropout(x, training=self.training) x = self.conv2(x, edge_index) return F.log_softmax(x, dim=1) # 训练模型 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = Net().to(device) data = data.to(device) optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4) model.train() for epoch in range(200): optimizer.zero_grad() out = model(data.x, data.edge_index) loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask]) loss.backward() optimizer.step() # 测试模型 model.eval() _, pred = model(data.x, data.edge_index).max(dim=1) correct = float(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item()) acc = correct / data.test_mask.sum().item() print('Accuracy: {:.4f}'.format(acc)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FesianXu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值