GNNによるノード分類
Coraデータセット、2層GCN、学習ループ、マスク付き損失、テスト精度、埋め込みの可視化について学習します。
「GNNによるノード分類」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
ノード分類タスク
ノード分類では、ノードの特徴量とグラフ構造を使って、各ノードのラベルを予測します。典型的な例は、引用ネットワーク内の各論文を研究トピックに分類することです。論文の単語だけでなく、どの論文を引用しているかも利用します。
Coraデータセット
Coraは、グラフ学習におけるMNISTです。2,708本の機械学習論文からなる引用グラフで、辺は引用関係を表します。各論文には長さ1433のbag-of-words特徴量ベクトルがあり、7つのトピックのいずれかに分類することが目標です。
# Cora:
# nodes = 2708 papers
# edges = citations
# features per node = 1433
# classes = 7Planetoidによる読み込み
PyTorch GeometricにはPlanetoidローダーが組み込まれており、Coraをダウンロードして、1つのグラフオブジェクトに整形します。
from torch_geometric.datasets import Planetoid
dataset = Planetoid(root="data/Cora", name="Cora")
data = dataset[0]
print(data) # x, edge_index, y, train_mask, test_maskデータオブジェクト
グラフオブジェクトにはすべての情報が含まれます。data.x(特徴量 2708 x 1433)、data.edge_index(接続関係)、data.y(正解ラベル)に加えて、どのノードを訓練、検証、テストに使うかを示すブールマスクも含まれます。
7クラス用のGCN
1433個の入力特徴量を64次元の隠れ層に通し、7クラスのロジットへ変換する2層GCNを構築します。
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
class GCN(torch.nn.Module):
def __init__(self):
super().__init__()
self.conv1 = GCNConv(1433, 64)
self.conv2 = GCNConv(64, 7)
def forward(self, x, edge_index):
x = F.relu(self.conv1(x, edge_index))
x = F.dropout(x, training=self.training)
return self.conv2(x, edge_index)トランスダクティブ学習
Coraはトランスダクティブです。訓練中にテストノードとその特徴量を含むグラフ全体を参照でき、隠すのはテストのラベルだけです。モデルはすべてのノード間の接続を利用しますが、ラベル付きの訓練ノードだけから学習します。
train_mask
train_maskは、損失の計算に寄与するノードを選択するブールベクトルです。モデルはグラフ全体に対して実行しますが、クロスエントロピーはマスクで選択された訓練ノードに対してのみ計算します。
model = GCN()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
def train():
model.train()
optimizer.zero_grad()
out = model(data.x, data.edge_index)
loss = F.cross_entropy(out[data.train_mask], data.y[data.train_mask])
loss.backward()
optimizer.step()
return loss.item()マスク付き損失の直感的な理解
順伝播では2708個すべてのノードについてロジットを生成しますが、train_maskでインデックスを指定することで、損失をラベル付き訓練ノードだけに限定できます。ラベルのないノードもメッセージを伝播してモデルを助けますが、勾配を直接発生させることはありません。
test_maskによる評価
訓練後は、損失の計算に一度も使っていないtest_maskのノードで正解率を評価します。これは、モデルがラベルを見たことのない論文に対する汎化性能を測定します。
@torch.no_grad()
def test():
model.eval()
pred = model(data.x, data.edge_index).argmax(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
return int(correct) / int(data.test_mask.sum())t-SNEによる埋め込みの可視化
GCNが学習した内容を確認するには、隠れ層のノード埋め込みを取り出し、t-SNEで2次元に射影します。十分に学習されたGCNでは、同じクラスのノードがまとまったクラスタが形成されます。
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
emb = model.conv1(data.x, data.edge_index).detach().numpy()
z = TSNE(n_components=2).fit_transform(emb)
plt.scatter(z[:, 0], z[:, 1], c=data.y, cmap="tab10", s=8)t-SNEプロットの解釈
色分けされたクラスタが明確に分離していれば、埋め込みがクラスを識別できる特徴を持ち、GCNが有用な構造を学習したことを示します。重なり合う塊は、学習不足または過平滑化を示唆します。t-SNEは定量指標ではなく、定性的な確認手法です。
クイックチェック
ノード分類に関する知識を確認しましょう。
まとめ
GNNによるノード分類について学びました。
- PlanetoidでCoraの引用グラフを読み込みます
- 2層GCNで1433から64を経て7クラスへ変換します
- train_maskで損失を限定し、test_maskで汎化性能を測定します
- t-SNEでノード埋め込みを可視化し、クラスの分離を確認します
よくある質問
「GNNによるノード分類」レッスンは無料ですか?
はい。「GNNによるノード分類」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「GNNによるノード分類」で何を学びますか?
Coraデータセット、2層GCN、学習ループ、マスク付き損失、テスト精度、埋め込みの可視化について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「GNNによるノード分類」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 機械学習のためのグラフ理論
- グラフ畳み込みネットワーク(GCN)
- GNNによるノード分類
- リンク予測とグラフ分類