(整理予定)言語処理道一合目

対話システム・言語処理についてぼちぼち頑張るブログ

GNN実装・超入門 -小話:有効グラフと無効グラフの定義-

最近GNNに惹かれてます.

現在も,自分のシステムの機構の一部にR-GCNを使っているのですが,きちんと理解しようと以下で勉強し直しています.


・グラフニューラルネットワーク: PyTorchによる実装

https://amzn.asia/d/aCG2SGY

 

PyG公式ドキュメント

pytorch-geometric.readthedocs.io

 

今日は地味につまった,PyGによる有効グラフと無効グラフの定義についです.

公式ドキュメントによると無効グラフの定義ってこれなんですが,

import torch
from torch_geometric.data import Data

edge_index = torch.tensor([[0, 1, 1, 2],
                           [1, 0, 2, 1]], dtype=torch.long)
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)

data = Data(x=x, edge_index=edge_index)
>>> Data(edge_index=[2, 4], x=[3, 1])

 

「ん,,この定義の仕方↓って有効グラフじゃないの???方向あるじゃん,,」と疑問に思い,地味に進めませんでした.

edge_index = torch.tensor([[0, 1, 1, 2],
                           [1, 0, 2, 1]], dtype=torch.long)

 

結論,PyGでは「エッジの両端を入れ替えたものは同じエッジとして扱われるため、この定義の仕方で無効グラフとして扱われる」ようです(間違っていたらご指摘ください)

諸々確認してみました.

◎無効グラフの場合

import torch
from torch_geometric.data import Data

edge_index = torch.tensor([[0, 1, 1, 2],
[1, 0, 2, 1]], dtype=torch.long)
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)

data = Data(x=x, edge_index=edge_index)

#エッジ数の確認と,有効グラフかどうかの判定
print(data.num_edges)
print(data.is_directed())

>>2
>>False

 

おお,確かに,エッジ数が重複が削除されて4→2,そして,無効グラフであることを示すFalseになっています.

 

◎有効グラフの場合

edge_index = torch.tensor([[0, 1, 1, 2], [1, 2, 3, 4]], dtype=torch.long)
x = torch.tensor([[-1], [0], [1], [1]], dtype=torch.float)
data = Data(x=x, edge_index=edge_index)

#エッジ数の確認と,有効グラフかどうかの判定
print(data.num_edges)
print(data.is_directed())

>>4
>>True

 

有効グラフの場合はエッジ数がそのまま4で,きちんと表示もTrueです.

 

少しつまったので,記しておきます.