グラフ埋め込み(Graph Embedding)とは?手法比較・GNNとの関係・Python実装まで

グラフ埋め込み(Graph Embedding)は、ノードとエッジからなるネットワーク構造(グラフ)を、機械学習で扱える低次元のベクトルへ変換する技術です。ExcelやPowerPointの「グラフ(図表)を文書に埋め込む」操作とは別物で、本記事はネットワークをベクトル化する前者を扱います。SNSの友人関係、購買履歴、知識グラフ、分子構造など「関係そのものが情報」であるデータを、分類・リンク予測・推薦といった機械学習タスクへ橋渡しするのが目的です。定義とノード埋め込みとの違い、DeepWalkからGNN・知識グラフ埋め込みまでの手法の使い分け、そしてnode2vecとPyTorch Geometricによる実装コードまでを一気通貫で整理します。

まとめ:先に結論

  • グラフ埋め込みは「ノード間の近さ」をベクトル空間の距離として保つ変換。近いノードほどベクトルも近くなる。
  • まず試すならNode2Vec。ランダムウォークの偏りを2つのパラメータ(p・q)で制御でき、ノード分類・リンク予測に広く効く。
  • ノードに特徴量があり、学習後に増える未知ノードも埋め込みたいならGraphSAGEやGNN(GCN・GAT)。属性を使え、帰納的に新規ノードへ適用できる。
  • 「AはBの上司」のような向きと種類を持つ関係(知識グラフ)は、専用のTransEなど知識グラフ埋め込みを使う。
  • Pythonでの最短実装はnode2vecライブラリ。GNNベースやGPU学習まで踏み込むならPyTorch Geometric。

グラフ埋め込みの定義とノード埋め込みとの関係

グラフはノード(点)とエッジ(つながり)で関係を表すデータ構造です。ノードの数や隣接関係は疎(スパース)で高次元になりやすく、隣接行列をそのまま特徴量にすると次元が膨れ上がって機械学習アルゴリズムに乗りません。グラフ埋め込みは、この構造を各ノード数十〜数百次元の連続ベクトルに落とし込み、元のグラフで近いノードは埋め込み空間でも近いという性質を保ちます。こうしてベクトル化すれば、コサイン類似度で似たノードを探したり、埋め込みを入力に分類モデルを学習したりと、通常の機械学習手法をそのまま適用できます。テキストをPythonでのEmbedding APIを使ってベクトル化するのと同じ発想を、ネットワーク構造に適用したものと整理すると分かりやすい。

ノード埋め込みとグラフ埋め込みの違い

「グラフ埋め込み」は文脈によって2つの粒度を指します。ノード埋め込みは個々のノードを1本ずつベクトル化する手法で、ユーザー分類・友人推薦・リンク予測など「ノード単位」のタスクに使います。一方、狭義のグラフ埋め込み(グラフ全体埋め込み)は、分子1個やネットワーク1つといったグラフ全体を1本のベクトルにまとめ、グラフ同士の分類や比較に使います。DeepWalkやNode2Vecが出力するのはノード埋め込みで、分子の毒性判定のようにグラフ全体を比べたい場合はノード埋め込みを集約(プーリング)してグラフベクトルを作ります。実務で単に「グラフ埋め込み」と言うときは、多くがノード埋め込みを指します。

ベクトル化が必要な理由(高次元・疎性の課題)

グラフは「中心性」「クラスタリング係数」「最短経路」といった指標を都度計算しないと構造を数値化できず、非線形な関係性を既存モデルへ渡しにくいという課題があります。埋め込みは、これらの構造的特徴を学習によって1本のベクトルへ凝縮します。結果として、ノードの類似度計算・クラスタリング・可視化・下流の予測モデルへの入力が、すべて同じベクトル演算で完結します。生成した埋め込みはpgvectorのようなベクトル検索基盤に格納すれば、大量ノードから類似ノードを高速に引くこともできます。

代表的な手法と使い分け

手法は大きく、ランダムウォークで近接関係を単語埋め込みのように学習する古典系と、ノードの属性や近傍を集約するニューラルネット系(GNN)に分かれます。まず全体像を押さえてから、タスクの性質で選びます。

手法 発表 アプローチ 帰納的 属性利用 主な用途
DeepWalk 2014 ランダムウォーク+Skip-gram × × ノード分類・可視化
LINE 2015 1次・2次近接を保存 × × 大規模ネットワーク
Node2Vec 2016 偏りウォーク(p・q) × × ノード分類・リンク予測
GraphSAGE 2017 近傍サンプリング+集約 未知ノード・動的グラフ
GCN 2017 近傍を畳み込み集約 半教師ノード分類
GAT 2018 注意機構で近傍を重み付け 近傍の重要度が不均一
TransE 2013 関係を平行移動 h+r≈t × 知識グラフ・リンク予測

ランダムウォーク系:DeepWalk・Node2Vec・LINE

DeepWalkは各ノードから短いランダムウォークを大量に生成し、そのノード列を「文章」とみなしてword2vecのSkip-gramで埋め込みを学習します。計算が軽く大規模グラフでも回せますが、探索の偏りを制御できません。Node2Vecはここに戻りやすさp遠くへ進みやすさqの2パラメータを加え、ウォークを幅優先寄り(構造的な役割を捉える)から深さ優先寄り(コミュニティを捉える)まで調整できるようにしたものです。LINEはウォークを使わず、直接つながる1次近接と、共通の隣接ノードを持つ2次近接を明示的に保存する目的関数で、数百万ノード級のネットワークを想定して設計されています。いずれも学習時に存在したノードだけを埋め込むトランスダクティブな手法で、あとから増えたノードは再学習が必要です。

帰納的手法:GraphSAGE

GraphSAGE(Graph SAmple and aggreGatE)は、各ノードの埋め込みを「近傍ノードの特徴量をサンプリングして集約する関数」として学習します。埋め込みそのものではなく集約の仕方を学ぶため、学習後に現れた未知ノードにも同じ関数を適用でき、日々ノードが増えるSNSや商品グラフのような動的な環境に向きます。ノードの属性(プロフィールや商品カテゴリなど)を入力に使える点も、構造だけを見る古典系との違いです。

グラフニューラルネットワーク(GNN)との関係

「グラフ埋め込みとGNNは何が違うのか」はよく検索される論点です。GNNは埋め込みを作るための手段の一種で、対立概念ではありません。GNNは各ノードが近傍から情報を受け取り、自分の表現を更新する処理(メッセージパッシング)を数層重ね、その結果として各ノードの埋め込みベクトルを出力します。代表格のGCN(Graph Convolutional Network)は次数で正規化した近傍を畳み込み、GAT(Graph Attention Network)は注意機構で「どの隣接ノードを重視するか」を学習します。GATは注意機構により学習時に無かったノードへも適用でき、帰納的な運用に向きます。GNNの強みは、DeepWalkやNode2Vecが使えなかったノード属性を埋め込みに反映できる点と、GraphSAGEのように帰納的に運用できる点です。属性がなく構造だけを素早くベクトル化したいならNode2Vec、属性を活かして精度を追うならGNN、と役割を分けて考えると選定しやすくなります。

知識グラフ埋め込み(TransE系)とは

SNSのような「つながっているか否か」だけのグラフと違い、知識グラフは「(東京, 首都, 日本)」のように向きと種類を持つ関係(トリプル)でできています。この関係の意味まで埋め込むのが知識グラフ埋め込みで、SERPでも大学・NTTの研究資料が上位を占める重要なサブテーマです。基礎となるTransE(Bordes ほか、2013)は、頭エンティティhと関係rと尾エンティティtを、h+r≈tという平行移動で表現します。「日本+首都の逆」が「東京」に近づくようにベクトルを学習し、未知のトリプルの成否をベクトルの距離で判定してリンク予測(欠けた関係の補完)に使います。TransEは1対多・多対多の関係を苦手とするため、関係ごとに射影を挟むTransRや、複素数で非対称な関係を扱うComplEx、回転で表すRotatEなどの発展形が提案されています。ノードの近さだけを見るNode2Vec系とは目的が異なるため、関係の種類が重要なデータでは知識グラフ埋め込みを選びます。

Pythonでのグラフ埋め込み実装

実装は用途で2段構えにすると迷いません。まず構造だけを手早くベクトル化するならnode2vecライブラリ、属性を活かしGPUで学習まで回すならPyTorch Geometricです。

node2vecライブラリで最短実装

eliorc版のnode2vecはNetworkXのグラフをそのまま渡せ、内部でウォーク生成とword2vec学習まで面倒を見てくれます。数行で埋め込みと類似ノード検索まで到達できます。

pip install node2vec networkx

import networkx as nx
from node2vec import Node2Vec

# サンプルグラフを用意(実務では自前のグラフを読み込む)
graph = nx.fast_gnp_random_graph(n=100, p=0.5)

# ウォーク生成の設定。p・qで探索の偏りを制御する
node2vec = Node2Vec(graph, dimensions=64, walk_length=30,
                    num_walks=200, workers=4)

# fitはgensimのWord2Vecに引数をそのまま渡す
model = node2vec.fit(window=10, min_count=1, batch_words=4)

# ノード"2"に近いノードを類似度順に取得
print(model.wv.most_similar("2"))

# 埋め込みをファイルへ保存(下流の学習で再利用)
model.wv.save_word2vec_format("embeddings.txt")

dimensionsが埋め込みの次元、walk_lengthとnum_walksがウォークの長さと本数です。p・qはNode2Vecの引数で指定でき、既定はどちらも1(DeepWalk相当の一様なウォーク)です。

PyTorch GeometricでGNNベースの埋め込み

PyTorch Geometric(PyG)はエッジ情報をテンソルで受け取り、負例サンプリングで埋め込みを最適化します。GPU学習やGNNモデルへの接続を見据えるならこちらです。

pip install torch torch_geometric

import torch
from torch_geometric.nn import Node2Vec

# data.edge_index は [2, エッジ数] のテンソル
model = Node2Vec(data.edge_index, embedding_dim=128, walk_length=20,
                 context_size=10, walks_per_node=10,
                 num_negative_samples=1, p=1.0, q=1.0, sparse=True)

loader = model.loader(batch_size=128, shuffle=True)
optimizer = torch.optim.SparseAdam(list(model.parameters()), lr=0.01)

model.train()
for pos_rw, neg_rw in loader:
    optimizer.zero_grad()
    loss = model.loss(pos_rw, neg_rw)  # 正例・負例のウォークから損失を計算
    loss.backward()
    optimizer.step()

# 学習済み埋め込みを取り出す(ノード数 × 128 のテンソル)
embeddings = model()

context_sizeは正例とみなす窓幅、num_negative_samplesが負例数です。属性付きのGCNやGATへ発展させる場合も、この埋め込みを初期特徴量や比較対象として使えます。

埋め込みの評価とつまずきやすい点

下流タスクで測る埋め込み品質評価

埋め込み単体には正解がないため、下流タスクの成績で間接的に測るのが基本です。ノード分類では精度やF1スコア、リンク予測ではROC-AUC、推薦ではヒット率や平均順位を使います。加えて、t-SNEやPCAで2次元へ落として可視化し、同じコミュニティのノードが近くに固まるかを目視で確認します。標準的な比較にはCora・PubMed・Redditといったベンチマークデータセットがよく使われ、他手法との相対評価に役立ちます。単一指標では偏りを見落とすため、分類精度と可視化を併用するのが実務の定石です。埋め込み同士の類似度で検索する設計は、ベクトル検索とセマンティック検索の違いで整理した考え方がそのまま応用できます。

実務でのつまずき

まず解釈性です。埋め込みの各次元に人間が読める意味はなく、なぜそのノードが近いのかを説明しづらいため、可視化や特徴量寄与の分析で補います。次に動的グラフで、時間とともにノードやエッジが変わる場合、トランスダクティブな古典系は再学習が必要になるため、GraphSAGEやTemporal Graph Network(TGN)といった帰納的・時系列対応の手法を選びます。さらにスケーラビリティで、ノードやエッジが増えると計算コストが急増するため、近傍サンプリングやミニバッチ、分散処理で抑えます。最後にデータ品質で、ノイズや欠損の多いグラフはそのまま埋め込みの信頼性に響くため、前処理でのクレンジングが精度を左右します。グラフ埋め込みはGenerative Recommendationのような推薦システムやソーシャルネットワーク分析、詐欺検知など「関係が意味を持つ」領域で効果を発揮しますが、これらの制約を踏まえた手法選定が前提になります。

よくある質問

Node2VecとDeepWalkの違いは何ですか?

どちらもランダムウォークとSkip-gramで埋め込みを学習しますが、DeepWalkはウォークが一様なのに対し、Node2Vecは戻りやすさpと遠くへ進みやすさqでウォークの偏りを制御できます。コミュニティ構造も構造的役割も使い分けたい場合はNode2Vecが柔軟で、まずはNode2Vecから試すのが無難です。

グラフ埋め込みとGNNは何が違いますか?

対立するものではなく、GNNは埋め込みを作る手段の一つです。GNN(GCN・GATなど)はノードの属性を反映でき、学習後の未知ノードにも帰納的に適用できます。属性がなく構造だけを軽く数値化したいならNode2Vec系、属性を活かして精度を追うならGNN、と目的で選びます。

ノード埋め込みとグラフ埋め込みはどう違いますか?

ノード埋め込みは各ノードを1本ずつベクトル化し、分類やリンク予測などノード単位のタスクに使います。グラフ全体埋め込みは分子やネットワーク1つを1本のベクトルにまとめ、グラフ同士の分類・比較に使います。ノード埋め込みを集約すればグラフ全体のベクトルを作れます。

知識グラフ埋め込みとは何ですか?

向きと種類を持つ関係(トリプル)でできた知識グラフを、関係の意味ごとベクトル化する手法です。基礎のTransEは頭・関係・尾をh+r≈tの平行移動で表し、欠けた関係の補完(リンク予測)に使います。関係の種類が重要なデータでは、近さだけを見るNode2Vec系より知識グラフ埋め込みが適します。

グラフ埋め込みはどのPythonライブラリを使えばよいですか?

構造だけを手早くベクトル化するならNetworkX+node2vecライブラリが最短です。属性を活かしたGNNやGPU学習まで行うならPyTorch Geometric、TensorFlow系ならSpektralが選択肢になります。まずnode2vecで感触をつかみ、精度が必要になったらPyTorch Geometricへ移るのが現実的です。あわせて、トポロジーについても解説しています。

関連記事

資料請求

RELATED POSTS 関連記事