圖神經網絡概況
- 1.GNN,GCN,GE的區別
- 2.圖卷積的通式--矩陣該如何作用
- 2.1實現1
- 2.2實現2
- 2.3實現3
- 3.PyTorch geometric
- 3.1 PyG內置數據集
- 3.1.1ENZYMES dataset
- 3.1.2Cora
- 3.2 PyG自定義數據集
- 3.2.1Data構建簡單的圖結構
- 3.2.2 Dataset
- 3.2.3 InMemoryDataset
一文讀懂圖卷積GCN(https://zhuanlan.zhihu.com/p/89503068)讀書筆記
本文更強調的是空域卷積,比較簡單的介紹。
1.GNN,GCN,GE的區別
Graph Embedding:表示學習的范疇,將圖中節點/將整個圖表示為低維、實值、稠密的向量。(可以將用戶表示成向量的形式,再勇于節點分類任務)圖嵌入的方式有三種:矩陣分解,deepWalk, 圖神經網絡
Graph Neural Netvork:神經網絡在圖上應用的模型統稱。依據傳播的方式不同,可以分為圖卷積神經網絡,圖注意力網絡,圖LSTM。(本質還是將網絡結構技巧借鑒過來做新的嘗試)。
Graph Convolutional Network:采用卷積操作圖神經網絡,是最經典的圖神經網絡。引發了無數的改進工作。
一句話概括三者的關系:GCN是一類GNN,GNN可以實現GE。
現實需求:現實中,像圖像一樣排列整齊的數據只占很小的一部分,還有更大的一部分數據以圖的形式存儲(社交網絡的信息,知識圖譜,蛋白質網絡,萬維度網)
提出疑問:能夠類似于圖像領域的卷積操作一樣,具有一個通用的范式來抽取圖像特征呢?–圖卷積(處理非結構化數據的利器)
2.圖卷積的通式–矩陣該如何作用
圖的表示:
圖G=(V,E)G=(V,E)G=(V,E),其中VVV為節點的集合,EEE為邊的集合。對于每個節點i,均有特征向量xix_ixi?,可以用矩陣XN?DX_{N*D}XN?D?表示。
圖相關矩陣:(Laplacian矩陣的定義是否有具體含義?)
度矩陣D-對角陣,對角線元素為各個結點的度,無向圖:與該頂點相關聯的邊數;有向圖:入度和出度
鄰接矩陣A:表示結點間關系,無向圖:對稱矩陣,有邊即為1;有向圖:有向連接才為1。
Laplacian 矩陣L:L=D-A
圖卷積核心思想:每個節點受到鄰居節點的影響,通式:
Hl+1=f(Hl,A)H^{l+1}=f(H^l,A)Hl+1=f(Hl,A)
其中:H0=XH^0=XH0=X為圖的特征矩陣,fff的差異定義了不同算法的差異。
2.1實現1
Hl+1=σ(AHlWl)H^{l+1}=\sigma(AH^lW^l)Hl+1=σ(AHlWl)
出發點:結點特征與鄰居結點的特征有關,鄰居結點各個維度特征的加權和。多層疊加后能夠利用多層鄰居的信息。
存在的問題:沒有考慮結點對自身的影響;A沒有被規范化時,鄰居結點多的結點擁有更大的影響力。
2.2實現2
Hl+1=σ(LHlWl)H^{l+1} = \sigma(LH^lW^l)Hl+1=σ(LHlWl)
使用Laplacian 矩陣(Combinatorial Laplacian?),對角線未知非零;解決了沒有考慮自身結點信息自傳遞的問題。
2.3實現3
利用Symmetric normalized Laplacian同時解決兩個問題:自傳遞和歸一化的問題。
歸一化的Laplacian矩陣具有多種形式,這些矩陣其實就是對應的圖卷積核。
3.PyTorch geometric
PyTorch geometric–基于PyTorch的用于處理不規則數據(圖)的庫,能夠用于快速實現圖等數據的表征學習的框架。
PyG-document
對機器學習庫最關心的內容:數據規范,模型定義,參數學習,模型測試
3.1 PyG內置數據集
PyTorch Geometric 包含了很多常見的基本數據集,例如:Cora, Citeseer, Pubmed
3.1.1ENZYMES dataset
graph-level數據集載入demo–ENZYMES dataset, 包含6大類,一共60個圖,能夠用于graph-level的分類任務。
from torch_geometric.datasets import TUDataset
# graph_level demo
dataset = TUDataset(root='/tmp/ENZYMES', name='ENZYMES') # 會下載,不過很快就下載完了
print("數據集的大小(有多少張圖):", len(dataset))
print("圖的類別數:", dataset.num_classes)
print("圖中結點的特征數:", dataset.num_node_features)print("第i張圖:", dataset[2])
print("圖為有向圖否:", dataset[2].is_undirected())
輸出
數據集的大小(有多少張圖): 600
圖的類別數: 6
圖中結點的特征數: 3
第i張圖: Data(edge_index=[2, 92], x=[25, 3], y=[1])
圖為有向圖否: True
3.1.2Cora
node-level 數據集載入demo–Cora,依據科學論文之間相互引用關系而構建的Graph數據集,一共包括2708篇論文,共7類:Genetic_Algorithms,Neural_Networks,Probabilistic_Methods,Reinforcement_Learning,Rule_Learning,Theory
# node_level demofrom torch_geometric.datasets import Planetoiddataset2 = Planetoid(root='/tmp/Cora', name='Cora') # 自動下載稍微有慢
# 直接上數據倉庫中下載數據后放入/tmp/Cora/raw 文件夾著中
# cp ~/Downloads/planetoid-master/data/*cora* ./raw
# 處理完后會多一個processed 文件夾print("數據集的大小(有多少張圖):", len(dataset2))
print("圖的類別數:", dataset2.num_classes)
print("圖中結點的特征數:", dataset2.num_node_features)print("第i張圖:", dataset2[0])
print("圖為有向圖否:", dataset2[0].is_undirected())print("訓練結點數:", dataset2[0].train_mask.sum().item())
print("測試結點數:", dataset2[0].test_mask.sum().item())
print("驗證結點數:", dataset2[0].val_mask.sum().item())
輸出
數據集的大小(有多少張圖): 1
圖的類別數: 7
圖中結點的特征數: 1433
第i張圖: Data(edge_index=[2, 10556], test_mask=[2708], train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])
圖為有向圖否: True
訓練結點數: 140
測試結點數: 1000
驗證結點數: 500
3.2 PyG自定義數據集
3.2.1Data構建簡單的圖結構
利用torch_geometric.data.Data()建模下圖:四個結點v0,v1,v2,v3v_0,v_1,v_2,v_3v0?,v1?,v2?,v3?,每個結點帶有特征向量[2,1],[5,6],[3,7],[12,0][2,1],[5,6],[3,7],[12,0][2,1],[5,6],[3,7],[12,0],并且每個結點的目標值/目標類別分別為:0,1,010,1,010,1,01
Data()的參數屬性:
Data(x=None, edge_index=None, edge_attr=None, y=None, pos=None, normal=None, face=None, **kwargs)
# 參數
# x (Tensor, optional) – 結點的特征矩陣:[num_nodes, num_node_features]. (default: None)
# edge_index (LongTensor, optional) – 結點的連接關系,以COO格式存儲 [2, num_edges]. 第一維度為源結點,第二維為目標結點,邊可無序存儲,可用于計算鄰接矩陣。無向圖會有2*num_nodes條邊。
# y (Tensor, optional) – 圖或者結點的目標向量,可以為任意的尺寸. (default: None)
# edge_attr (Tensor, optional) – 邊的特征矩陣 [num_edges, num_edge_features]. (default: None)
# pos (Tensor, optional) – Node position matrix with shape [num_nodes, num_dimensions]. (default: None)
# normal (Tensor, optional) – Normal vector matrix with shape [num_nodes, num_dimensions]. (default: None)
# face (LongTensor, optional) – Face adjacency matrix with shape [3, num_faces]. (default: None)
建模代碼demo:
import torch
from torch_geometric.data import Data
x = torch.tensor([[2, 1], [5, 6], [3, 7], [12, 0]], dtype=torch.float) # 每個結點的特征向量
y = torch.tensor([0, 1, 0, 1], dtype=torch.float) # 結點的目標值
edge_index = torch.tensor([[0, 1, 2, 0, 3], [1, 0, 1, 3, 2]], dtype=torch.long)
data = Data(x=x, y=y, edge_index=edge_index)
print(data)
輸出:
Data(edge_index=[2, 5], x=[4, 2], y=[4])
# 方括號中為各個矩陣的尺寸,其中包括5條邊,4個維度為2的特征向量,和4個標亮目標值。
3.2.2 Dataset
Dataset,適用于較大的數據集
torch_geometric.data.Dataset
3.2.3 InMemoryDataset
InMemoryDataset,適用于RAM的數據
torch_geometric.data.InMemoryDataset # 繼承自torch_geometric.data.Dataset
目前關注的還不是創建自己的數據集合,回頭再來
PyTorch geometric官方文檔,安裝啦,簡單使用啦:https://pytorch-geometric.readthedocs.io/en/latest/notes/introduction.html
使用參考博文1–圖神經網絡庫PyTorch geometric(PYG)零基礎上手教程:https://zhuanlan.zhihu.com/p/91229616
使用參考博文2–圖神經網絡之神器——PyTorch Geometric 上手 & 實戰:https://zhuanlan.zhihu.com/p/94491664