GCN グラフ畳み込みネットワークの詳細な紹介

この記事は「GCN Graph Convolution Network 徹底入門」からの転載です

再版リンク: GCN グラフ畳み込みネットワークの詳細な紹介 | Leifeng.com

この記事では、GCN と呼ばれるよく知られたグラフ ニューラル ネットワークについて詳しく見ていきます。まず、その仕組みを直観的に理解してから、その背後にある数学を詳しく見てみましょう。

グラフを使用する理由

多くの問題は本質的にグラフです。私たちの世界では、分子、ソーシャル ネットワーク、論文引用ネットワークなど、多くのデータがグラフとして表示されます。

GCN グラフ畳み込みネットワークの詳細な紹介

 図の例。(画像は[1]より)

グラフ上のタスク

  • ノード分類: 特定のノードのタイプを予測します。

  • リンク予測: 2 つのノードが接続されているかどうかを予測します。

  • コミュニティ検出: 密に接続されたノード コミュニティを識別します。

  • ネットワークの類似性: 2 つの (サブ) ネットワークはどの程度似ていますか? 

機械学習のライフサイクル

グラフには、ノードの特徴 (ノードを表すデータ) とグラフの構造 (ノードの接続方法を表す) があります。

ノードの場合、各ノードのデータを簡単に取得できます。しかし、グラフの構造に関しては、そこから有用な情報を抽出するのは簡単な作業ではありません。たとえば、2 つのノードが互いに非常に近い場合、それらを他のノードのペアとは異なるように扱う必要がありますか? 高次ノードと低次ノードをどのように扱うか? 実際、特定の作業ごとに、特徴エンジニアリング、つまりグラフ構造を特徴に変換するだけでも、多くの時間とエネルギーを消費します。

GCN グラフ畳み込みネットワークの詳細な紹介

グラフの特徴エンジニアリング。(画像は[1]より)

何らかの方法でノードの特性とグラフの構造情報の両方を入力として取得し、どちらの情報が有用であるかを機械に判断させることができれば良いでしょう。

このため、グラフ表現の学習が必要になります。

GCN グラフ畳み込みネットワークの詳細な紹介

グラフが独自に「特徴量エンジニアリング」を学習できるようにしたいと考えています。(画像は[1]より) 

グラフ畳み込みニューラル ネットワーク (GCN)

論文: グラフニューラルネットワークに基づく半教師あり分類(2017)[3]

GCN は、グラフ上で直接動作し、グラフの構造情報を活用する畳み込みニューラル ネットワークです。

これは、ごく一部のノードのみがラベルを持つグラフ (引用ネットワークなど) 内のノード (文書など) を分類する問題 (半教師あり学習) を解決します。

GCN グラフ畳み込みネットワークの詳細な紹介

グラフでの半教師あり学習の例。一部のノードにはラベルがありません (不明なノード)。  

本旨

「コンボリューション」という名前が示すように、このアイデアは画像から生まれ、後にグラフに導入されました。ただし、画像の構造が固定されている場合、グラフはさらに複雑になります。

GCN グラフ畳み込みネットワークの詳細な紹介

画像からグラフィックスへの畳み込みのアイデア。(画像は[1]より)

GCN の基本的な考え方: 各ノードについて、そのノード自体の特性を含むすべての隣接ノードからその特性情報を取得します。Average() 関数を使用するとします。すべてのノードに対して同じことを行います。最後に、これらの計算された平均をニューラル ネットワークに入力します。

下の画像には、引用ネットワークの簡単な例があります。各ノードは研究論文を表し、エッジは引用を表します。ここには前処理ステップがあります。ここでは、元の論文を特徴として使用せず、(tf-idf などの NLP 埋め込みを使用して) 論文をベクトルに変換します。NLP 埋め込み (TF-IDF など)。

緑色のノードを考えてみましょう。まず、自身のノードを含むすべての近隣ノードの固有値を取得し、平均を取ります。最後に、結果ベクトルがニューラル ネットワークを通じて返され、最終結果として使用されます。

GCN グラフ畳み込みネットワークの詳細な紹介

GCNの主な考え方。緑色のノードを例に挙げてみましょう。まず、それ自体のノードを含むすべての隣接ノードの平均を取得します。次に、平均がニューラル ネットワークを通過します。GCN では、完全に接続された 1 つのレイヤーのみを使用することに注意してください。この例では、出力として 2 次元ベクトルを取得します (完全接続層の 2 つのノード)。

実際には、平均関数よりも複雑な集計関数を使用できます。より多くのレイヤーを積み重ねて、より深い GCN を取得することもできます。各層の出力は、次の層の入力とみなされます。

GCN グラフ畳み込みネットワークの詳細な紹介

2 層 GCN の例: 最初の層の出力が 2 番目の層の入力になります。また、GCN のニューラル ネットワークは完全に接続された層にすぎないことに注意してください ([2] の図)。

これがどのように機能するかを数学的に詳しく見てみましょう。

直感的な感情とその背後にある数学的原理

まず、いくつかの注釈が必要です

以下に示すようなグラフ G を考えます。

GCN グラフ畳み込みネットワークの詳細な紹介

 グラフ G から、隣接行列 A と次数行列 D が得られます。同時に、特徴行列 X も得られます。

GCN グラフ畳み込みネットワークの詳細な紹介

では、各ノードの固有値を隣接ノードから取得するにはどうすればよいでしょうか? 解決策は A と X を掛け合わせることにあります。

隣接行列の最初の行を見ると、ノード A とノード E の間に接続があることがわかります。取得された行列の最初の行は、A に接続されている E ノードの固有ベクトルです (下図を参照)。同様に、取得した行列の 2 行目は、D と E の固有ベクトルの合計です。この方法により、すべての隣接ノードのベクトルの合計を取得できます。

GCN グラフ畳み込みネットワークの詳細な紹介

「和ベクトル行列」AX の最初の行を計算します。

  • ここにはまだ改善の余地があります。

  1. ノード自体の特性は無視します。たとえば、計算された行列の最初の行には、ノード A の特性も含まれている必要があります。

  2. sum() 関数を使用する代わりに、隣接ノードの特徴ベクトルの平均、さらには加重平均を取る必要があります。それでは、なぜ sum() 関数を使用しないのでしょうか? その理由は、 sum() 関数を使用する場合、次数が大きいノードは大きな v ベクトルを生成する可能性が高く、次数が低いノードは小さな集合ベクトルを取得する傾向があり、将来的に勾配の爆発や勾配の消失を引き起こす可能性があるためです (たとえば、 、シグモイドを使用する場合)。さらに、ニューラル ネットワークは入力データのサイズに敏感であるようです。したがって、考えられる問題を取り除くために、これらのベクトルを正規化する必要があります。

問題 (1) では、単位行列 I を A に追加して新しい隣接行列 Ã を取得することで解決できます。

GCN グラフ畳み込みネットワークの詳細な紹介

lambda=1 (ノード自体の特性を隣接するノードと同じくらい重要にする) とすると、Ã=A+I になります。ラムダをトレーニング可能なパラメータとして扱うことができることに注意してください。ただし、ここではラムダを 1 に割り当てるだけで済みます。この論文では、ラムダには単純に値 1 が割り当てられています。

GCN グラフ畳み込みネットワークの詳細な紹介

各ノードに自己ループを追加することで、新しい隣接行列を取得します。

質問 (2) について: 行列のスケーリングでは、通常、行列に対角行列を乗算します。現在のケースでは、集約された特徴の平均を取得するか、数学的に言えば、ノードの次数に応じて集約されたベクトル行列×X をスケーリングしたいと考えています。直感的には、ここでスケーリングに使用される対角行列は次数行列 D に関連するものであることがわかります (なぜ D ではなく Dmber なのでしょうか。もう A ではなく、新しい隣接行列 Ã の次数行列 Dmber を考慮しているからです)。

ここで問題は、どのようにして合計ベクトルをスケーリング/正規化するかということになります。言い換えると:

近隣情報を特定のノードに渡すにはどうすればよいでしょうか? まずは旧友の平均値から始めます。この場合、Dmber の逆行列 (つまり、Dmber^{-1}) が機能します。基本的に、D̃ の逆行列の各要素は、対角行列 D の対応するエントリの逆数です。

GCN グラフ畳み込みネットワークの詳細な紹介

たとえば、ノード A の次数が 2 であるため、ノード A の集合ベクトルを 1/2 で乗算し、ノード E の次数が 5 である場合、E の集合ベクトルを 1/5 で乗算する必要があります。 。

したがって、D̃ を反転して X を乗算することにより、すべての隣接ノード (自身のノードを含む) の固有ベクトルの平均を取ることができます。

GCN グラフ畳み込みネットワークの詳細な紹介

ここまでは順調ですね。しかし、加重平均() についてはどうなるのでしょうか? 直感的には、次数の高いノードと低い次数のノードを異なる方法で処理した方がよいでしょう。

GCN グラフ畳み込みネットワークの詳細な紹介

GCN グラフ畳み込みネットワークの詳細な紹介

 ただし、行単位でスケールするだけで、対応する列 (破線のボックス) は無視します。 

GCN グラフ畳み込みネットワークの詳細な紹介

GCN グラフ畳み込みネットワークの詳細な紹介

新しいスケーラーを列に追加します。

新しいスケーリング方法では、「加重」平均が得られます。ここで行うことは、低次ノードにさらに重みを追加して、高次ノードの影響を軽減することです。この加重平均の背後にある考え方は、低次数のノードは隣接ノードに大きな影響を与える一方、高次数のノードは影響があまりにも多くの隣接ノードに分散されるため、低次数のノードの影響は小さくなると仮定することです。

GCN グラフ畳み込みネットワークの詳細な紹介

ノード B で隣接ノード フィーチャを集約する場合、最大の重み (次数 3) をノード B 自体に割り当て、最小の重み (次数 5) をノード E に割り当てます。

GCN グラフ畳み込みネットワークの詳細な紹介

GCN グラフ畳み込みネットワークの詳細な紹介

正規化を2回行ったので「-1」を「-1/2」に変更します

GCN グラフ畳み込みネットワークの詳細な紹介

GCN グラフ畳み込みネットワークの詳細な紹介

たとえば、10 クラスの多分類問題があり、F が 10 に設定されているとします。レイヤー 2 に 10 次元のベクトルが入った後、ソフトマックス関数を通じてこれらのベクトルを予測します。

損失関数の計算方法は非常に簡単です。すべてのラベル付きサンプルのクロスエントロピー誤差を計算します。Y_{l} はラベル付きノードのセットです。    

GCN グラフ畳み込みネットワークの詳細な紹介

レイヤー数

レイヤーの意味

レイヤーの数は、ノード フィーチャが送信できる最長距離を指します。たとえば、レイヤー 1 GCN では、各ノードは近隣ノードからのみ情報を取得できます。各ノードの情報を収集するプロセスは、すべてのノードに対して独立して同時に実行されます。

最初のレイヤーの上に別のレイヤーを追加する場合は、情報を収集するプロセスを繰り返しますが、今回は、隣接ノードはすでに自身の隣接ノードに関する情報を (前のステップから) 持っています。これにより、各ノードが受信できる最大ホップのレイヤー数が決まります。したがって、ノードがネットワークからどの程度の距離まで情報を取得すべきかに応じて、#layers に適切な数を設定できます。しかし、繰り返しになりますが、図では、通常、あまり行き過ぎたくありません。6 ~ 7 ホップに設定すると、ほぼグラフ全体を取得できますが、これにより集計の意味が薄れてしまいます。

GCN グラフ畳み込みネットワークの詳細な紹介

例: 対象ノード i の 2 層情報を収集する処理

GCN は何層に積層する必要がありますか?

この論文では、著者は浅い GCN と深い GCN についてそれぞれいくつかの実験も実施しました。下の画像では、2 層または 3 層モデルを使用すると最良の結果が得られることがわかります。さらに、深い GCN (7 層以上) では、パフォーマンスが低下することがよくあります (青い破線)。1 つの解決策は、隠れ層間の残りの接続 (紫色の線) に頼ることです。

GCN グラフ畳み込みネットワークの詳細な紹介

レイヤー数が異なる場合のパフォーマンス#。紙からの写真[3]

メモする

  • GCN は、グラフの半教師あり学習に使用されます。

  • GCN はノードの機能と構造の両方を使用してトレーニングされます

  • GCN の主なアイデアは、すべての隣接ノード (自身のノードを含む) の特性の加重平均を取ることです。次数が低いノードほど重みが大きくなります。その後、取得した特徴ベクトルをニューラル ネットワークを通じて学習します。

  • より多くのレイヤーを積み重ねて、GCN をより深くすることができます。深い GCN の残りの接続を考慮します。通常は 2 層または 3 層の GCN を選択します。

  • 数学に関するメモ: 対角行列を見たときは、行列のスケーリングについて考えてください。

  • これは、StellarGraph ライブラリ [5] を使用した GCN デモです。このリポジトリは、他の多くの GNN アルゴリズムも提供します。

論文の著者からのメモ

このフレームワークは現在、無向グラフ (重み付きまたは重みなし) に限定されています。ただし、有向エッジとエッジ特徴は、元の有向グラフを無向二端子グラフとして表し、元のグラフのエッジを表すノードを追加することによって処理できます。

次は何ですか?

GCN の場合、ノードの機能とグラフの構造の両方を活用できるようです。しかし、グラフ内のエッジのタイプが異なる場合はどうなるでしょうか? それぞれの関係を別々に扱うべきでしょうか? この場合、隣接ノードを集約するにはどうすればよいでしょうか? 最近の先進的な手法とは何でしょうか?

グラフのトピックに関する次の記事では、より洗練された方法をいくつか見ていきます。

GCN グラフ畳み込みネットワークの詳細な紹介

  サイド間のさまざまな関係(兄弟、友人など)にどう対処するか?

参考文献

[1] Jure Leskovec (スタンフォード) によるグラフ表現学習に関する優れたスライド: https://drive.google.com/file/d/1By3udbOt10moIcSEgUQ0TR9twQX9Aq0G/view?usp=sharing

[2] シンプルになったビデオ グラフ畳み込みネットワーク (GCN): https://www.youtube.com/watch?v=2KRAOZIULzw

[3] グラフ畳み込みネットワークを使用した論文半教師あり分類 (2017): https://arxiv.org/pdf/1609.02907.pdf

[4] GCN ソースコード: https://github.com/tkipf/gcn

[5] StellarGraph ライブラリを使用したデモ: https://stellargraph.readthedocs.io/en/stable/demos/node-classification/gcn-node-classification.html

おすすめ

転載: blog.csdn.net/SmartLab307/article/details/125181176