MLエンジニアへの道 #35 - 異種グラフ学習

Last Edited: 1/20/2025

このブログ記事では、ディープラーニングにおける異種グラフ学習やGNN APIついて紹介します。

ML

同種グラフと異種グラフ

これまで、暗黙的に同種グラフを扱ってきました。同種グラフでは、グラフ内のすべてのノードとエッジが同じ種類に属します。 例えば、ソーシャルネットワークは同種グラフであり、ノードはすべて人間を表し、エッジは人間関係の存在を表します。 しかし、ノードやエッジが異なる種類を持つ異種グラフを構築することも可能です。

Heterogeneous Graph

上は異種有向グラフの例です。このグラフには、著者ノード、機関ノード、論文ノード、研究分野ノードが含まれており、 これらは「執筆」、「引用」、「所属」、「トピックを持つ」といったエッジによって接続されています。二部グラフは異種グラフの一種であり、 異なる種類のノードを2種類持ち、主にレコメンダシステムで、ユーザーが特定のアイテムを好むかどうかを予測するために使用されます(これについては後日詳しく取り上げるかもしれません)。 ノードやエッジの種類の違いを無視したり、それらの違いを表現するためにノードやエッジの埋め込みを使用して異種グラフを同種グラフとして扱うことも可能ですが、 ノードやエッジの種類の違いを考慮することで、モデルの表現力向上が期待できます。

関係型GNN

ノードやエッジの種類の違いを区別する最も簡単な方法は、各エッジの種類、関係ごとに複数のGNNレイヤーを積み重ね、 その結果を集約して単一のレイヤーにすることです。例えば、Schlichtkrull, M. ら (2017) によるR-GCNでは、 以下のようなレイヤーを使用しています。

hi(t+1)=σ(rRj{i,Ni}1ci,rWr(t)hj(t)) h_i^{(t+1)} = \sigma(\sum_{r \in R}\sum_{j \in \{i, N_i\}}\frac{1}{c_{i, r}}W_r^{(t)} h_j^{(t)})

ここで、RRはグラフ内のすべてのエッジ種類の集合であり、ci,rc_{i,r}は次数や学習可能なパラメータを表します。 上記のアプローチで顕著な問題の1つは、特に多くの関係を持つデータの場合、パラメータ数が増加することです。 そのため、Schlichtkrull, M. ら (2017) は基底分解を使用します。基底分解は、Wr=bBar,bVbW_r = \sum_{b}^B a_{r,b}V_b という形で表され、 bbの値がrrより小さい場合、関係間で基底を共有し、関係固有の重みを削減することが可能です。(R-GCNはブロック分解も使用します。)

同種グラフ用に構築された他のレイヤーに対しても同様の処理を行うことができますし、関係に応じて異なる複雑さのレイヤーを使用することも可能です。 また、グラフトランスフォーマーも適切な埋め込みやエンコーディングを準備することで異種グラフを簡単にサポートできます。 TokenGTを例に取ると、異なるノードやエッジの種類ごとに異なる埋め込みを準備し、適切なタイプ識別子を追加することができます。

GNN API

これまで、標準化されたデータセット準備の方法がないTensorFlowやPyTorchで作業してきました。同種グラフの場合はそれで問題ありませんが、 異種グラフでは管理が困難になります。そのため、TensorFlowやPyTorchが提供するGNN APIを使用し、標準化されたデータ形式や既存のモデルを活用できます。 以下では、TensorFlowとPyTorchのGNN APIの基本を説明します。(クリックして開いてください。)

両フレームワークとも、複数のノードやエッジの種類をディクショナリで管理し、エッジのインデックスを使用してソースとターゲットを指定します。 また、どちらのフレームワークでも既存のモデルを利用することが可能です。私の意見では、PyG のドキュメントやインターフェースは非常に読みやすく、 使いやすいので、特別な技術的要件がない限り PyG を使用することをお勧めします。

結論

この記事では、新しい種類のグラフである異種グラフ、異種グラフ用の関係型GNN、および同種グラフと異種グラフの両方を画一的に扱うための GNN API を紹介しました。 次の記事では、GNNパイプライン全体について、下流タスクやグラフ学習における推論型学習と帰納型学習の意味を含めて、ついに議論します。

リソース