概要 この記事では、グラフまたはグラフ ニューラル ネットワークを使用した AI/ML/CV に慣れていないユーザーからよく寄せられる質問に回答します。この比較的新しくエキサイティングなモデルの背後にある考え方を明確にするために、Pytorch の例を提供します。

概要 この記事では、グラフまたはグラフ ニューラル ネットワークを使用した AI/ML/CV に慣れていないユーザーからよく寄せられる質問に回答します。この比較的新しくエキサイティングなモデルの背後にある考え方を明確にするために、Pytorch の例を提供します。

チュートリアルのこの部分で私が尋ねる質問は次のとおりです。

グラフのデータ構造が役立つのはなぜですか?

グラフで畳み込みを定義するのが難しいのはなぜですか?

ニューラル ネットワークがグラフ ニューラル ネットワークである理由は何ですか?

これらの質問に答えるために、グラフ ニューラル ネットワーク (GNN) のチュートリアルにするために、動機付けとなる例、論文、および Python コードを提供します。読者には基本的な機械学習とコンピューター ビジョンの知識が必要ですが、作業を進めながら背景と直感的な説明も提供します。

まず、グラフとは何かを簡単に確認しましょう。グラフは、有向/無向エッジによって接続されたノード (頂点) のセットです。ノードとエッジは、通常、問題に関する専門知識や直感に基づいています。つまり、分子内の原子、ソーシャル ネットワーク内のユーザー、交通システム内の都市、チーム スポーツ内のアスリート、脳内のニューロン、動的物理システム内の相互作用するオブジェクト、画像内のピクセル、バウンディング ボックス、または分割マスクなどです。言い換えれば、実際の多くの状況では、グラフ内のノードとエッジを実際に決定します。

多くの実際的なケースでは、グラフのノードとエッジを決定するのは実際にはあなたです。

これは、他の多くのデータ構造を一般化する非常に柔軟なデータ構造です。たとえば、エッジがない場合はセットになります。「垂直」エッジのみが存在し、任意の 2 つのノードが 1 つのパスで接続されている場合は、ツリーになります。この柔軟性は良くも悪くも、このチュートリアルで説明します。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

1.グラフのデータ構造が役立つのはなぜですか?

コンピューター ビジョン (cv) と機械学習 (ml) のコンテキストでは、グラフとそこから学習するモデルを研究することで、少なくとも 4 つの利点が得られます。

1.1 がんの創薬 (Veselkov et al., Nature, 2019); 人間の脳のコネクトームのより良い理解 (Diez & Sepulcre, Nature Communications, 2019) など、以前は難しすぎた重要な問題の解決に近づくことができます。 ; エネルギーと環境の課題に対する材料の発見 (Xie et al., Nature Communications, 2019).

1.2 ほとんどの cv/ml アプリケーションでは、データを別のデータ構造として表現したとしても、実際にはグラフとして見ることができます。データをグラフとして表現すると、柔軟性が高まり、問題について非常に異なる興味深い視点を得ることができます。たとえば、画像ピクセルから学習する代わりに、(Liang et al., ECCV2016) および近日中に公開される BMVC 論文で説明されているように、「スーパーピクセル」から学習できます。グラフを使用すると、データにリレーショナルな帰納的バイアスを課すこともできます (問題に関する予備知識)。たとえば、人間の姿勢について推論したい場合、関係バイアスは人間の骨格関節のグラフにすることができます (Yan et al., AAAI, 2018); または、ビデオについて推論したい場合、関係バイアスは動く境界である可能性があります。ボックス (Wang & Gupta、ECCV2018) の図。もう 1 つの例は、顔のランドマークをグラフとして表して (Antonakos et al., CVPR, 2015)、顔の属性とアイデンティティについて推論することです。

1.3 お気に入りのニューラル ネットワーク自体は、ノードがニューロンでエッジが重みであるグラフ、またはノードがレイヤーでエッジが前方/後方パスの流れを表すグラフと考えることができます (この場合、議論はテンソルフローで使用される計算グラフについてです) 、pytorch、およびその他の dl フレームワーク)。アプリケーションには、計算グラフの最適化、ニューラル アーキテクチャ検索、トレーニング動作の分析などがあります。

1.4 最後に、データをグラフとしてより自然に表現できる場合、多くの問題をより効率的に解決できます。これには、分子および社会的ネットワークの分類 (Knyazev et al., Neurips-W, 2018) と生成 (Simonovsky & Komodakis, ICANN, 2018)、3D メッシュの分類と対応付け (Fey et al., CVPR) が含まれますが、これらに限定されません。 、2018) および生成 (Wang et al., ECCVV, 2018)、動的に相互作用するオブジェクトの動作のモデル化 (Kipf et al., ICML, 2018)、ビジュアル シーン グラフ モデリング (今後の ICcv ワークショップを参照)、および質問応答 (Narasimhan, Neurips 、2018)、プログラム合成 (Allamanis et al.、ICLR、2018)、さまざまな強化学習タスク (Bapst et al.、ICML、2019)、およびその他の多くの刺激的な問題。

以前の研究は顔と感情の認識と分析に関するものだったので、下の図が特に気に入りました。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

2.グラフで畳み込みを定義するのが難しいのはなぜですか?

この質問に答えるために、最初に一般的に畳み込みを使用する動機を説明し、次に「画像の畳み込み」をグラフの用語で説明します。これにより、「グラフの畳み込み」への移行がスムーズになります。

2.1 畳み込みが役立つのはなぜですか?

畳み込みをそれほど気にかけている理由と、畳み込みを使用してグラフを描画する理由を理解しましょう。完全に接続されたニューラル ネットワーク (a.k.a.nns または mlps) と比較して、畳み込みネットワーク (a.k.a.cnns または convnets) には、古き良き Chevrolet のイメージで説明されている次の利点がいくつかあります。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

まず、ConvNets は画像内の自然な優先順位を利用します。これは (Bronstein et al., 2016) でより正式に説明されています。

1.並進不変性 – 上の画像で車を左/右/上/下に移動しても、車として認識できるはずです。これは、すべての場所でフィルターを共有する、つまり畳み込みを適用することで悪用できます。

2.場所 – 近くのピクセルは密接に関連しており、通常はスクロール ホイールやウィンドウなどのセマンティック コンセプトを表します。これは、局所的な空間近傍の画像特徴をキャプチャする比較的大きなフィルターを使用することで利用できます。

3.構成 (または階層) – 画像内の大きな領域は、多くの場合、含まれる小さな領域のセマンティックな親です。たとえば、車はドア、窓、車輪、ドライバーなどの親であり、ドライバーは頭、腕などの親です。これは、畳み込み層を積み重ねてプーリングを適用することにより、暗黙的に悪用されます。

次に、畳み込み層でトレーニング可能なパラメーター (つまりフィルター) の数は入力の次元に依存しないため、技術的には 28×28 と 512×512 の画像でまったく同じモデルをトレーニングできます。つまり、モデルはパラメトリックです。

理想的には、私たちの目標は、グラフ ニューラル ネットと同じくらい柔軟で、あらゆるデータから要約して学習できるモデルを開発することですが、同時に、特定の事前確率をオン/オフすることによって制御 (調整) したいと考えています。)柔軟性要因。

これらすべての優れた特性により、ConvNet は過剰適合しにくくなり (トレーニング セットの精度が高くなり、検証/テスト セットの精度が低くなります)、さまざまなビジョン タスクでより正確になり、大きな画像やデータセットに簡単に拡張できます。したがって、グラフ構造を採用する入力データの重要なタスクを解決したい場合、これらすべてのプロパティをグラフ ニューラル ネットワーク GNN に転送して、その柔軟性を正規化し、スケーラブルにすることは魅力的です。理想的には、私たちの目標は、GNN と同じくらい柔軟で、あらゆるデータから要約して学習できるモデルを開発することですが、同時に、特定の事前確率をオン/オフすることによって制御 (調整) したいと考えています。これは、多くの興味深い研究の方向性を開くことができます。ただし、このトレードオフを制御することは困難です。

2.2 画像とグラフの畳み込み

N 個のノードを持つ無向グラフ G を考えてみましょう。エッジ E は、ノード間の無向接続を表します。ノードとエッジは通常、問題に関する直感から生じます。画像の場合、私たちの直感では、ノードはピクセルまたはスーパーピクセル (奇妙な形のピクセルのグループ) であり、エッジはそれらの間の空間距離です。たとえば、左下の MNIST 画像は通常、28×28 のサイズのマトリックスとして表されます。これを N = 28 * 28 = 784 ピクセルのセットとして表すこともできます。したがって、グラフ G には N = 784 個のノードがあり、エッジ位置が近いピクセルのエッジは値が大きくなり (下の画像ではエッジが太くなります)、遠いピクセルのエッジは値が小さくなります (エッジが細くなります)。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

画像でニューラル ネットワークまたは ConvNet をトレーニングする場合、暗黙的にグラフ上に画像を定義します。以下の画像は通常の 2D グリッドです。このグリッドはすべてのトレーニング画像とテスト画像で同じであり、規則的であるため、つまり、グリッドのすべてのピクセルは、すべての画像でまったく同じ方法で互いに接続されています (つまり、隣接するピクセルの数と辺の長さが同じです)。この通常のグリッド ダイアグラムには、ある画像を別の画像と区別するのに役立つ情報がありません。以下に、ノードの順序が色分けされた 2D および 3D の規則的なグリッドをいくつか視覚化します。ちなみに、私はこれを行うために Python で NetworkX を使用しています。 g. G = ネットワーク x。 grid_graph([4, 4])。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

この 4×4 の通常のグリッドを使用して、2D 畳み込みがどのように機能するかを簡単に見て、この演算子をグラフに変換するのが非常に難しい理由を理解しましょう。通常のグリッドのフィルターはノードの順序が同じですが、最新の畳み込みネットワークは通常、以下の例の 3×3 のように小さいフィルターを使用します。このフィルターには、W 1、W 2、…、W 3 の 9 つの値があります。これらは、損失を最小限に抑え、下流のタスクを解決するためにバックプロパゲーターでトレーニング中に更新する値です。以下の例では、このフィルターをエッジ検出器としてヒューリスティックに初期化します。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

畳み込みを行うとき、このフィルターを右と下の 2 方向にスライドさせますが、下隅から開始することを妨げるものは何もありません。考えられるすべての位置でスライドすることが重要です。各位置で、グリッド上の値 (X で示される) とフィルター値 W の間の内積を計算します: W:X? え? + X? え? +…+X? え? 、結果を出力イメージに保存します。このビジュアライゼーションでは、スライド中にノードの色を変更して、グリッド内のノードの色と一致させます。通常のグリッドでは、いつでも X? を置くことができます。 え?メッシュのノードは、グリッドのノードと一致します。残念ながら、これはグラフには当てはまりません。これについては以下で説明します。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

上記で使用されている内積は、いわゆる「集約演算子」の 1 つです。大まかに言えば、集計演算子の目的は、データを単純化された形式に要約することです。上記の例では、ドット積によって 3×3 マトリックスが 1 つの値に集約されます。もう 1 つの例は、ConvNets でのプーリングです。 max pooling や total pooling などの方法は順列不変であることに注意してください。つまり、領域内のすべてのピクセルをランダムにシャッフルしても、空間領域から同じ値をマージします。明確にするために、内積は順列不変ではありません。一般に、X? え? +X? え? ≠×? え? +X? え? .

それでは、MNIST 画像を使用して、通常のグリッド、フィルター、畳み込みが何を意味するかを説明しましょう。グラフの用語を思い出してください。この通常の 28×28 グリッドはグラフ G になるため、このグリッドの各セルはノードであり、ノードの特徴は実際の画像 X、つまり各ノードです。特徴は 1 つだけです – 0 からのピクセル強度 (黒) を 1 (白) にします。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

次に、フィルターを定義し、いくつかの (ほとんど) 任意のパラメーターを持つ既知のガボール フィルターにします。画像とフィルターを取得したら、その画像上でフィルター (この場合は 7 ビット) をスライドさせ、内積の結果を出力行列に配置することで、畳み込みを実行できます。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

これはすばらしいことですが、前述したように、畳み込みをグラフに一般化しようとすると扱いにくくなります。

ノードはコレクションであり、そのコレクションの順列はそれを変更しません。したがって、人々が適用する集計演算子は順列不変でなければなりません

既に述べたように、各ステップで畳み込みを計算するために上記で使用された内積は順序に依存します。この感度により、ガボール フィルターに似たエッジ検出器を学習できます。これは、画像の特徴をキャプチャするために重要です。問題は、グラフ内のノードの順序が明確に定義されていないことです。ノードの順序付けを学習するか、ヒューリスティックを考え出さない限り、グラフ間で一貫した順序 (ノルム) が得られます。つまり、ノードはコレクションであり、このコレクションを順列してもノードは変更されません。したがって、人々が適用する集計演算子は順列不変でなければなりません。最も一般的なオプションは、すべての近傍の平均 (GCN、Kipf & Welling、ICLR、2017) および合計 (GIN、Xu et al.、ICLR、2019) です。つまり、合計または平均プーリングの後にトレーニング可能なベクトル W 射影が続きます。その他のアグリゲーターについては、(Hamilton et al., NIPS, 2017) を参照してください。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

たとえば、上の左上のグラフでは、ノード 1 の合計アグリゲーターの出力は X? です。 = (X? +X? +X? +X?) W? 、ノード 2 の場合: X? =(X?+X?+X?+X?) W?ノード 3、4、5 など、つまり、このアグリゲーターをすべてのノードに適用する必要があります。その結果、同じ構造のグラフが得られますが、ノード フィーチャには隣接フィーチャが含まれるようになります。右側のグラフでも同じ考え方を使用できます。

口語的に、この平均化または合計は「畳み込み」と呼ばれます。これは、あるノードから別のノードに「スライド」し、各ステップで集計演算子を適用するためです。ただし、これは非常に特殊な形式の畳み込みであり、フィルターには方向感覚がないことに留意することが重要です。以下では、これらのフィルターがどのように見えるかを示し、それらをさらに良くする方法についてのアイデアを示します。

3.ニューラル ネットワークをグラフ ニューラル ネットワークにするもの

古典的なニューラル ネットワークがどのように機能するか知っていますよね?ネットワークへの入力としていくつかの C 次元の特徴 X があります。実行中の MNIST の例を使用すると、X は C=784 次元のピクセル機能 (つまり、「平坦化された」画像) になります。これらの機能は、出力を期待に近づけるためにトレーニング中に更新する C×F 次元の重み W で乗算されます。結果は、タスクを解決するために直接使用できます (回帰の場合など)。または、ReLU やその他の微分可能な (より正確には微分可能な) 関数などの非線形性 (活性化) にさらに入力して、複数の関数を形成することもできます。層ネットワーク。通常、一部のレイヤーの出力は次のとおりです。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

MNIST のシグナルは非常に強力であるため、上記の式と交差エントロピー損失を使用するだけで、非線形性やその他のトリックを使用せずに 91% の精度を得ることができます (この時点でこれを行うために、わずかに変更された PyTorch の例を使用しました)。この種のモデルは、多項 (10 クラスの数値があるため、多クラス) ロジスティック回帰と呼ばれます。

では、通常のニューラル ネットワークをグラフ ニューラル ネットワークに変換するにはどうすればよいでしょうか。ご存知のように、GNN の背後にある中心的な考え方は、「近隣」による集約です。ここで、多くの場合、実際に「隣人」を指定するのはあなたであることを理解することが重要です。
いくつかのグラフを取得するときに、最初に単純なケースを考えてみましょう。たとえば、これは 5 人のソーシャル ネットワークのフラグメント (サブグラフ) であり、2 人が友達であるかどうか (または少なくとも 1 人がそう思っているかどうか) を示すノードのペア間のエッジを持ちます。右下の図の隣接行列 (通常は A で表されます) は、これらのエッジを行列形式で表す方法であり、ディープ ラーニング フレームワークにとって非常に便利です。行列の黄色のセルはエッジを表し、青色はエッジがないことを意味します。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

ここで、ピクセル座標に基づいて MNIST の例の隣接行列 A を作成しましょう (完全なコードは記事の最後に記載されています)。

numpy を np としてインポート

スパイから。 空間的な。 距離インポート CDIST

img_size = 28 # MNIST 画像の長さと幅

列、行 = np。 meshgrid(np.arange(img_size), np.arange(img_size))

座標 = np。 スタック ((列、行)、軸 = 2)。 reshape(-1, 2) / img_size

dist = cdist(coord, coord) # 左下参照

シグマ = 0.2 * np。 pi # ガウス分布の幅

A = np。 exp (-dist / sigma ** 2) # 下図中段参照

これは視覚タスクの隣接行列を定義する典型的な方法ですが、唯一の方法ではありません (Defferrard et al., NIPS, 2016; Bronstein et al., 2016)。この隣接行列は、私たちの誘導バイアスである前の行列であり、近くのピクセルを直感的に接続しますが、遠くのピクセルは非常に細いエッジ (小さなエッジ) を持つべきではありません。これは、自然画像では、近くのピクセルが同じオブジェクトまたは頻繁に相互作用するオブジェクトに対応することが多いという観察によるものであり (セクション 2.1 で説明した局所性の原則)、そのようなピクセルを接続することは非常に有用な意味を持ちます。

コンピューター ビジョンとその先のためのグラフ ニューラル ネットワークのチュートリアル (パート 1)

したがって、機能 X だけでなく、[0, 1]の範囲の値を持つファンシーな行列 A があります。入力がグラフであることがわかったら、データセット内の他のすべてのグラフで一貫したノードの標準的な順序がないと仮定することに注意することが重要です。画像の場合、これは、ピクセルがランダムにシャッフルされると想定されることを意味します。実際には、ノードの標準的な順序を見つけることは、組み合わせ的に解決できません。技術的には MNIST の場合、この順序を知ることでごまかすことができますが (データは元は通常のグリッドからのものであるため)、実際のグラフ データセットでは機能しません。

The Links:   NL6448BC33-50 LM64C35P