このレポは、元のGATペーパーのPytorch実装が含まれています(:link:veličkovićetal。)。
GATとGNN全般について簡単にプレイして学習できるようにすることを目的としています。
グラフニューラルネットワークは、グラフ上で定義された信号を扱っているニューラルネットワークのファミリーです!
グラフは多くの興味深い自然現象をモデル化できますので、どこからでも使用されているのがわかります。
そして、大型ヘドロンコリダー(LHC)、偽のニュース検出、リストは延々と続く粒子物理学までずっと先に進みます!
GATは、空間(畳み込み)GNNの代表です。 CNNSはコンピュータービジョンの分野で大成功を収めたため、研究者はそれをグラフに一般化することを決めたので、ここにいます! ?
GATの構造の概略図は次のとおりです。

単一の最も有名なグラフデータセット-Coraに言及せずに、GNNについて話すことはできません。
Coraのノードは研究論文を表しており、リンクはそれらの論文間の引用です。
Coraを視覚化し、基本的なネットワーク分析を行うためのユーティリティを追加しました。 Coraがどのように見えるかは次のとおりです。

ノードのサイズは、その程度に対応します(つまり、IN/発信エッジの数)。エッジの厚さは、そのエッジがどのように「人気がある」または「接続」されているかにほぼ対応しています(エッジ間の間、オタクの用語はコードをチェックしてください)。
そして、ここにCORAの程度分布を示すプロットがあります。

無向グラフを扱っているため、程度のプロットと程度のプロットは同じです。
ボトムプロット(次数分布)では[2, 4]範囲で興味深いピークが起こっているのを見ることができます。これは、ノードの大部分に少数のエッジがあることを意味しますが、169のエッジを持つ1つのノードがあります! (ビッググリーンノード)
完全に訓練されたGATモデルを取得したら、特定の「ノード」が学習した注意を視覚化できます。
ノードは注意を払って、近所を集約する方法を決定し、十分な話をしましょう。見てみましょう。

これは、最もエッジ(引用)を持つCoraのノードの1つです。色は同じクラスのノードを表します。このプロットから2つのことをはっきりと見ることができます。
同様のルールは、より小さな地域に保持されます。また、セルフエッジに注意してください。


一方、PPIはもっと興味深い注意パターンを学んでいます:


左側では、6人の隣人が無視できない量の注意を払っていることがわかります。右側では、すべての注意が一人の隣人に集中していることがわかります。
最後に、さらに2つの興味深いパターン - 左側と右側の強い自己エッジは、一人の隣人が大部分の注意を払っているのに対し、残りは近隣の残りの部分に等しく分布していることがわかります。


重要な注意: PPI視覚化はすべて、最初のGAT層でのみ可能です。何らかの理由で、2番目と3番目のレイヤーの注意係数はほぼすべての0です(公開された結果を達成しましたが)。
GATがCoraの興味深い注意パターンを学んでいないことを理解する別の方法(つまり、Constの注意を習得していること)は、ノード近隣の注意の重みを確率分布として扱い、エントロピーを計算し、すべてのノードの近隣に情報を蓄積することです。
ガットの注意の分布が歪んでいることを望んでいます。オレンジでは、理想的な均一な分布のヒストグラムがどのように見えるかを見ることができ、ライトブルーで学んだ分布を見ることができます - それらはまったく同じです!


最初のレイヤー(8のうち)から1つの注意ヘッドのみをプロットしました。
一方、PPIはもっと興味深い注意パターンを学んでいます:

予想どおり、均一な分布の分布はエントロピーが最も高いため、均一な分布エントロピーヒストグラムは右(オレンジ)にあります。
わかりました、私たちは注目を集めました!視覚化するために他に何がありますか?さて、GATの最後の層から学んだ埋め込みを視覚化しましょう。 GATの出力は形状のテンソル=(2708、7)で、2708はCORAのノードの数、7はクラスの数です。これらの7-DIMベクターを2Dに投影したら、T-SNEを使用して、これを取得します。

同じラベル/クラスのノードが大まかにクラスター化されていることがわかります。これらの表現では、ノードがどのクラスに属しているかを示すシンプルな分類器を上にトレーニングするのが簡単です。
注:UMAPも試しましたが、結果が得られませんでした +プロットUTILを使用する場合、多くの依存関係があります。
それで、私たちはGNNが何であるか、そして彼らがあなたのために何ができるか(とりわけ)について話しました。
このことを実行しましょう!次のステップに従ってください:
git clone https://github.com/gordicaleksa/pytorch-GATcd path_to_repoに移動しますconda env create実行します(これにより、新しいConda環境が作成されます)。activate pytorch-gatすること(コンソールからスクリプトを実行するか、IDEでインタープリターをセットアップするため)それでおしまい!依存関係を扱うboxの実行環境を実行する環境を実行する必要があります。
Pytorch Pipパッケージには、Cuda/Cudnnのバージョンがバンドルされますが、主にGPUドライバーのおかげで、システム全体のCUDAを事前にインストールすることを強くお勧めします。また、Minicondaインストーラーをシステムに搭載する方法として使用することをお勧めします。このセットアップのポイント1と2をフォローし、システムに最新のバージョンとCUDA/CUDNNを使用します。
Anacondaコンソールからjupyter notebookを実行するだけで、デフォルトのブラウザでセッションを開きます。
The Annotated GAT.ipynbを開くと、プレイする準備ができています!
注: DLL load failed while importing win32api: The specified module could not be found
pip uninstall pywin32実行するだけで、 pip install pywin32またはconda install pywin32修正するだけです!
セットアップセクションで作成したPython環境をリンクするだけです。
参考までに、私のGAT実装は公開された結果を達成します:
82-83%精度を取得します0.973 Micro-F1スコアを達成しました(実際にはさらに高く) CoraでGATをトレーニングするために必要なものはすべて既にセットアップされています。 (コンソールから)実行するには、次のように電話してください。
python training_script_cora.py
潜在的に:
--should_visualizeを追加して、グラフデータを視覚化します--should_testを追加する - データのテスト部分でGATを評価する--enable_tensorboardを追加する - メトリックの保存を開始する(精度、損失)コードはよくコメントされているため、トレーニング自体がどのように機能するかを(できれば)理解できます。
スクリプトは次のとおりです。
models/checkpoints/models/binaries/runs/ 、 tensorboard --logdir=runsて視覚化PPIでのトレーニングにも同じことが言えます。PythonTraining_script_ppi.py python training_script_ppi.py実行するだけです。 PPIははるかにGPUハングリーですので、少なくとも8 GBの強力なGPUがない場合は、CPUでGATをトレーニングするために--force_cpuフラグを追加する必要があります。代わりに、バッチサイズを1に減らすか、モデルをスリムにすることができます。
トレーニング中にメトリックを視覚化することができます。Tensorboard tensorboard --logdir=runs 、 http://localhost:6006/ urlをブラウザに貼り付けることができます。


注:Coraの列車の分割は、喪失と精度のメトリックを見て、検証とテストの分割よりもはるかに難しいようです。
楽しさのほとんどは実際にはplayground.pyスクリプトにあると言っています。
3つのGAT実装を追加しました - いくつかは概念的に理解しやすいものもあります。最も興味深く、最も難しいのは、実装3です。実装1と実装2は微妙な詳細が異なりますが、基本的には同じことをします。
コードへのアプローチ方法に関するアドバイス:
3つの実装をプロファイルする場合はplayground.py Playground.profile_gatにplayground_fn変数をPLAYGROUND.PROFILE_GATに設定してください。
あなたが気にすることができる2つのパラマーがあります:
store_cache実行後にメモリ/時間プロファイリングの結果を保存したい場合はTrueに設定しますskip_if_profiling_info_cachedプロファイリング情報をキャッシュからプルしたい場合はTrueに設定結果はdata/ in memory.dict and timing.dict dictionaries(pickle)に保存されます。
注:実装#3は、最も最適化されたものです。コードの詳細を見ることができます。
また、 COO 、 CSR 、 CSC 、 LILなどのさまざまなマトリックススパースフォーマットに精通したい場合はprofile_sparse_matrix_formatsを追加しました。
T-sne埋め込み、注意または埋め込みを視覚化する場合は、 playground_fn変数をPLAYGROUND.VISUALIZE_GATに設定し、 visualization_typeを次のように設定します。
VisualizationType.ATTENTIONノード近隣全体で注意を視覚化したい場合VisualizationType.EMBEDDING埋め込みを視覚化する場合(T -SNE経由)VisualizationType.ENTROPYエントロピーヒストグラムを視覚化する場合そして、これらのような視覚化はクレイジーになります( VisualizationType.ATTENTIONオプション):


左側には、CORAデータセット全体で最高度のノードが表示されます。
なぜこれらが円のように見えるのか疑問に思っているなら、それはm-ary layout_reingold_tilford_circularレイアウトを使用したからです。
ただし、 kamada kawai (右側)などのさまざまな描画アルゴリズムを使用することもできます。
自由にコードを調べて、さまざまなGATレイヤーから注目を集めて、さまざまなノード近隣または注意ヘッドをプロットすることで遊んでください。 GATのレイヤー数を簡単に変更することもできますが、浅いGNNSは小世界の同性愛のグラフデータセットで最高のパフォーマンスを発揮する傾向があります。
cora/ppiを視覚化する場合は、 playground_fn PLAYGROUND.VISUALIZE_DATASETに設定するだけで、このreadmeの結果が得られます。
HW要件は、使用するグラフデータに大きく依存しています。 Coraで遊びたいだけなら、 2+ GBS GPUを使用するのは良いことです。
(Cora Citation Networkで)かかります:
これを、最小の変圧器でも必要なハードウェアと比較してください!
一方、 PPIデータセットははるかにGPUになります。 8以上のGBSのVRAMを備えたGPUが必要です。または、バッチサイズを1に減らしてモデルを「スリム」にするために、VRAMの消費量を削減しようとすることができます。
sparse APIを活用する実装を追加する可能性がありますPytorchのスパースAPIを使用してGATを実装する方法を知っている場合は、PRをお気軽に送信してください。私は個人的に彼らのAPIで困難を抱えていました、それはベータ版であり、実装3を使用して実装を効率的にすることが可能であるかどうかは疑わしいです。
第二に、GATがPPIで報告された結果を達成している理由はまだわかりませんが、すべての注意係数が0に等しいことによって明らかにされるように、より深い層にいくつかの明らかな数値の問題があります。
GATを理解するのが難しい場合は、このビデオで論文の詳細な概要を説明しました。
また、このリポジトリ(潜在的な問題点に焦点を当てている)のウォークスルービデオと、一般的にグラフMLを始めるためのブログを作成しました! ❤❤️
GNNSをさらに理解するのに役立つビデオがあります。
これらのリポジトリは便利であることがわかりました(これを開発している間):
このコードが便利だと思う場合は、以下を引用してください。
@misc{Gordić2020PyTorchGAT,
author = {Gordić, Aleksa},
title = {pytorch-GAT},
year = {2020},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/gordicaleksa/pytorch-GAT}},
}