グラフ畳み込みネットワークの作り方は?これは最小限のNumpy実装です

グラフ畳み込みネットワークの作り方は?これは最小限のNumpy実装です

グラフは非常に複雑な構造を持ち、大量の情報を含んでいるため、グラフ上での機械学習は困難な作業です。この記事では、グラフ上で直接動作し、その構造情報を活用する強力なニューラル ネットワークであるグラフ畳み込みネットワーク (GCN) を使用して、グラフ上でディープ ラーニングを実行する方法について説明します。

この記事では GCN を紹介し、コード例を使用して、情報が GCN の隠しレイヤーを通じてどのように伝播するかを説明します。読者は、GCN が前のレイヤーから情報をどのように集約し、このメカニズムがグラフ内のノードの有用な特徴表現をどのように生成するかを確認します。

グラフ畳み込みネットワークとは何ですか?

GCN は、グラフ データ用の非常に強力なニューラル ネットワーク アーキテクチャのクラスです。実際、これは非常に強力であるため、ランダムに初期化された 2 層 GCN でも、グラフ ネットワーク内のノードの有用な特徴表現を生成できます。下の図は、この 2 層 GCN によって生成された各ノードの 2 次元表現を示しています。トレーニングを行わなくても、これらの 2D 表現はグラフ内のノードの相対的な近接性を維持できることに注意してください。

より正式には、グラフ畳み込みネットワーク (GCN) は、グラフ データに対して動作するニューラル ネットワークです。グラフ G = (V, E) が与えられた場合、GCN の入力は次のようになります。

  • N × F⁰ 次元の入力特徴行列 X。ここで、N はグラフ ネットワーク内のノード数、F⁰ はノードあたりの入力特徴の数です。
  • グラフ構造は、グラフ G の隣接行列 A など、N × N 次元の行列で表されます。 [1]

したがって、GCN の隠れ層は Hⁱ = f(Hⁱ⁻¹, A)) と表すことができます。ここでH⁰ = Xであり、fは伝播則である[1]。各隠れ層 Hⁱ は次元 N × Fⁱ の特徴行列に対応し、行列の各行はノードの特徴表現です。各レイヤーでは、GCN は伝播ルール f を使用してこの情報を集約し、次のレイヤーの特徴を形成します。このようにして、各レイヤーごとに機能がますます抽象化されます。この枠組みの下では、GCNのさまざまな変種は伝播規則fの選択のみが異なる[1]。

伝播ルールの簡単な例

以下、この記事では最も単純な伝播ルールの例を示します[1]。

  1. f(Hⁱ, A) = σ(AHⁱWⁱ)

ここで、Wⁱ は i 番目の層の重み行列であり、σ は非線形活性化関数 (ReLU 関数など) です。重み行列の次元はFⁱ×Fⁱ⁺¹です。つまり、重み行列の2番目の次元のサイズによって、次の層の特徴の数が決まります。畳み込みニューラル ネットワークに精通している場合は、これらの重みがグラフ内のノード間で共有されるため、この操作は畳み込みカーネル フィルタリング操作に似ていることがわかります。

簡素化する

次に、最も単純なレベルでの伝播ルールを学習します。作る:

  • i = 1、(制約fは入力特徴行列に作用する関数です)
  • σは恒等関数である
  • 重みを選択(制約:AH⁰W⁰ =AXW⁰ = AX)

つまり、f(X, A) = AXです。この伝播ルールは単純すぎる可能性があるため、不足している部分はこの記事の後半で補足します。さらに、AX は多層パーセプトロンの入力層に相当します。

1. 簡単なグラフの例

簡単な例として次の図を使用します。

単純な有向グラフ。

numpy を使用して記述された上記の有向グラフの隣接行列は次のように表されます。

  1. A = np.matrix ([
  2. [0, 1, 0, 0],
  3. [0, 0, 1, 1],
  4. [0, 1, 0, 0],
  5. [1, 0, 1, 0]],
  6. dtype =浮動小数点数 

次に、特徴を抽出する必要があります。インデックスに基づいて各ノードに 2 つの整数特徴を生成します。これにより、この記事の後半で行列演算を手動で検証するプロセスが簡素化されます。

  1. [3]では、 X = np .matrix([
  2. [私、-私]
  3. i が範囲内(A.shape[0])にある場合
  4. ]、 dtype = float )
  5. バツ
  6. 出力[3]: 行列([
  7. [ 0., 0.],
  8. [ 1., -1.],
  9. [ 22。]、
  10. [3.、-3.]
  11. ])

2. 伝播ルールを適用する

これで、隣接行列 A と入力特徴のセット X を持つグラフが構築されました。伝播ルールを適用すると何が起こるか見てみましょう。

  1. [6]において: A * X
  2. 出力[6]: 行列([
  3. [ 1., -1.],
  4. [5., -5.],
  5. [ 1., -1.],
  6. [ 22。]]

各ノード (各行) の表現は、隣接するノードの特徴の合計になります。つまり、グラフ畳み込み層は、各ノードを隣接するノードの集約として表現します。この計算プロセスは自分で検証することができます。この場合、v から n へのエッジがある場合、ノード n はノード v の隣接ノードであることに注意してください。

質問

問題に気づいたかもしれません:

  • ノードの集約表現には、そのノード自身の特徴は含まれません。この表現は、隣接ノードからの特徴の集約であるため、自己ループを持つノードのみが集約に独自の特徴を含みます [1]。
  • 次数が大きいノードは特徴表現でより大きな値を持ち、次数が小さいノードはより小さな値を持ちます。これにより、勾配が消失したり爆発したりする可能性がある[1, 2]。また、確率的勾配降下アルゴリズム(このようなネットワークのトレーニングに一般的に使用され、各入力特徴のスケール(または値の範囲)に敏感)にも影響を与える可能性があります。

次に、この記事ではこれらの問題について個別に説明します。

1. 自己ループを追加する

最初の問題を解決するには、各ノードに自己ループを直接追加することができます[1, 2]。具体的には、伝播規則を適用する前に、隣接行列 A を単位行列 I に追加することでこれを実現できます。

  1. [4]において: I = np .matrix(np.eye(A.shape[0]))
  2. 出力[4]: 行列([
  3. [1., 0., 0., 0.],
  4. [0., 1., 0., 0.],
  5. [0., 0., 1., 0.],
  6. [0., 0., 0., 1.]
  7. ])
  8. [8]において: A A_hat = A + I
  9. A_hat * X
  10. 出力[8]: 行列([
  11. [ 1., -1.],
  12. [6., -6.],
  13. [3., -3.],
  14. [ 5., -5.]])

現在、すべてのノードはそれ自体の隣接ノードであるため、隣接ノードの特徴を合計するときに、各ノードには独自の特徴も含まれます。

2. 特徴表現を正規化する

隣接行列 A は、次数行列 D の逆行列を乗算することによって変換され、それによって特徴表現がノード次数によって正規化されます。したがって、簡略化された伝播ルールは次のようになります。

  1. f(X, A) = D⁻¹AX

何が起こったのか見てみましょう。まず、ノードの次数行列を計算します。

  1. [9]では: D = np .array(np.sum(A, axis = 0 ))[0]
  2. D = np.matrix (np.diag(D))
  3. 出力[9]: 行列([
  4. [1., 0., 0., 0.],
  5. [0., 2., 0., 0.],
  6. [0., 0., 2., 0.],
  7. [0., 0., 0., 1.]
  8. ])

伝播ルールを適用する前に、隣接行列を変換すると何が起こるかを確認しておくと役立ちます。

変身前

  1. A = np.matrix ([
  2. [0, 1, 0, 0],
  3. [0, 0, 1, 1],
  4. [0, 1, 0, 0],
  5. [1, 0, 1, 0]],
  6. dtype =浮動小数点数 

変身後

  1. [10]では: D**-1 * A
  2. 出力[10]: 行列([
  3. [0. , 1. , 0. , 0. ],
  4. [0. , 0. , 0.5, 0.5],
  5. [0. , 0.5, 0. , 0. ],
  6. [0.5, 0. , 0.5, 0. ]
  7. ])

隣接行列の各行の重み(値)が、その行に対応するノードの次数で割られていることがわかります。次に、変換された隣接行列に伝播規則を適用します。

  1. [11]では: D**-1 * A * X
  2. 出力[11]: 行列([
  3. [ 1. , -1. ],
  4. [ 2.5, -2.5],
  5. [ 0.5, -0.5],
  6. [ 22。 ]
  7. ])

隣接ノードの特徴平均に対応するノード表現が得られます。これは、(変換された)隣接行列の重みが、隣接ノードの特徴の加重合計の重みに対応するためです。この結果はあなた自身で確認できます。

統合

ここで、自己ループと正規化の手法を組み合わせます。さらに、議論を簡略化するために、先ほど省略した重みと活性化関数の操作を再度導入します。

1. 重みを加える

最初に行うことは、重量を加えることです。ここでの D_hat は、A_hat = A + I に対応する次数行列、つまり強制的な自己ループを持つ行列 A の次数行列であることに注意してください。

  1. [45]において: W = np .matrix([
  2. [1, -1],
  3. [-1, 1]
  4. ])
  5. D_hat**-1 * A_hat * X * W
  6. 出力[45]: 行列([
  7. [ 1., -1.],
  8. [4., -4.],
  9. [ 22。]、
  10. [ 5., -5.]
  11. ])

出力特徴表現の次元を減らしたい場合は、重み行列 W のサイズを減らすことができます。

  1. [46]において: W = np .matrix([
  2. [1]、
  3. [-1]
  4. ])
  5. D_hat**-1 * A_hat * X * W
  6. 出力[46]: 行列([[1.],
  7. [4.]、
  8. [2.]、
  9. [5.]]

2. 活性化関数を追加する

この論文では、特徴表現の次元を維持し、ReLU 活性化関数を適用することを選択します。

  1. [51]において: W = np .matrix([
  2. [1, -1],
  3. [-1, 1]
  4. ])
  5. relu(D_hat**-1 * A_hat * X * W)
  6. 出力[51]: 行列([[1., 0.],
  7. [4., 0.],
  8. [2., 0.],
  9. [5., 0.]])

これは、隣接行列、入力機能、重み、および活性化関数を備えた完全な隠し層です。

現実世界のシナリオへの応用

***、グラフ畳み込みネットワークを実際のグラフに適用します。この記事では、上記の機能表現を生成する方法を説明します。

1. ザカリー空手クラブ

Zachary Karate Club は、ノードが空手クラブのメンバーを表し、エッジがメンバー間の関係を表す、広く使用されているソーシャル ネットワークです。ザカリーさんが空手クラブを調査していたとき、管理者とインストラクターの間で対立が起こり、クラブは二つに分裂しました。下の図は、ネットワークのグラフ表現を示しています。ノードは、クラブのどの部分に属するかに応じてラベル付けされており、「A」と「I」は、それぞれ管理者キャンプとインストラクター キャンプに属するノードを表しています。

ザカリー空手クラブネットワーク

2. GCNの構築

次に、グラフ畳み込みネットワークを構築します。実際にこのネットワークをトレーニングするのではなく、単にランダムに初期化して、この記事の冒頭で見た特徴表現を生成します。簡単に実装できる Zachary's Karate Club のグラフ表現を持つ networkx を使用します。次に、A_hat 行列と D_hat 行列を計算します。

  1. networkx から to_numpy_matrix をインポートします
  2. zkc =空手クラブグラフ()
  3. 順序=ソート済み(リスト(zkc.nodes()))
  4. A = to_numpy_matrix (zkc、ノードリスト=順序)
  5. I = np .eye(zkc.number_of_nodes())
  6. A A_hat = A + I
  7. D_hat = np .array(np.sum(A_hat,= 0 ))[0]
  8. D_hat = np.matrix (np.diag(D_hat))

次に、重みをランダムに初期化します。

  1. W_1 = np.ランダム.正規分布(
  2. 位置= 0 スケール= 1 サイズ= (zkc.number_of_nodes(), 4))
  3. W_2 = npランダム正規分布(
  4. 位置= 0 サイズ= (W_1.shape[1]、2))

次に、GCN レイヤーを積み重ねます。ここでは、特徴表現として単位行列のみを使用します。つまり、各ノードはワンホットエンコードされたカテゴリ変数として表されます。

  1. gcn_layer(A_hat, D_hat, X, W)を定義します。
  2. relu(D_hat**-1 * A_hat * X * W) を返します
  3. H_1 = gcn_layer (A_hat、D_hat、I、W_1)
  4. H_2 = gcn_layer (A_hat、D_hat、H_1、W_2)
  5. 出力= H_2  

さらに特徴表現を抽出します。

  1. 機能表現= {
  2. ノード: np.array(出力)[ノード]
  3. zkc.nodes() 内のノードの場合}

ご覧のとおり、この描写はザカリーの空手クラブの 2 つのコミュニティをうまく区別しています。この時点では、モデルのトレーニングはまだ始まっていません。

ザカリー空手クラブグラフネットワークのノードの特性

この例では、ReLU 関数の影響により、x 軸または y 軸上のランダムに初期化された重みが 0 になる可能性が高いため、上記の図を生成するには複数のランダム初期化が必要になることに注意してください。

結論

この記事では、グラフ畳み込みネットワークの概要を説明し、GCN 内の各ノード層の特徴表現が、隣接ノードの集約に基づいてどのように構築されるかを説明します。 NumPy を使用してこれらのネットワークを構築する方法とその強力さを学ぶことができます。ランダムに初期化された GCN でも、Zachary の空手クラブ ネットワーク内のコミュニティを分離できます。

参考文献

  • Thomas Kipf によるグラフ畳み込みネットワークに関するブログ投稿。
  • Thomas Kipf と Max Welling による「グラフ畳み込みネットワークによる半教師付き分類」という論文。

オリジナルリンク:

https://towardsdatascience.com/how-to-do-deep-learning-on-graphs-with-graph-convolutional-networks-7d2250723780

[この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id:almosthuman2014)」によるオリジナル翻訳です]

この著者の他の記事を読むにはここをクリックしてください

<<:  人工知能の知能を実現する方法

>>:  2019 年に登場する 10 の機械学習アプリケーション

ブログ    
ブログ    

推薦する

この線虫は単純ではありません!脳は高精度に修復され、ダイナミックに前進できる

最高精度の「線虫脳」、ここに登場。この「脳」は、Caenorhabditis elegans 線虫の...

中山大学、AIGCの大規模応用を促進するためにソース拡散モデル統合コードフレームワークを公開

近年、拡散モデルに基づく画像生成モデルが次々と登場し、驚くべき生成効果を示しています。しかし、関連す...

Hacker Newsのランキングアルゴリズムの仕組み

[[83666]]この記事では、Hacker News ウェブサイトの記事ランキング アルゴリズムの...

外国人の機械学習エンジニアは失業に直面しているのに、なぜ彼らはまだMLの学習にこだわるのでしょうか?

機械学習の分野では悲観的な見通しが広がっています。機械学習の人材の採用は減速しています。 [[334...

AIによる価格比較、本当にあなたに代わって価格を比較してくれるのでしょうか?

ダブルイレブンの割引を計算するために、昨年どれだけの髪の毛が抜けたか覚えていますか?昨年、天猫は総取...

ランサムウェア対策における人工知能の重要な役割

人工知能技術は、企業が多くのビジネス課題を解決するために不可欠です。最も重要なアプリケーション領域の...

RPAとは何ですか?ビジネスプロセス自動化の革命

CISO は、日常的なタスクを排除し、従業員がより価値の高い仕事に集中できるようにするために、ロボ...

人工知能の旅:プロトタイピングは始まりに過ぎない

国内外で人工知能や機械学習のチームが大きな成果のニュースを共有し続けているのをよく見かけますが、実用...

2018 年のビッグデータ、機械学習、人工知能の予測!

AI へのビッグデータ投資は減速の兆しを見せていません。今後 1 年間の予測をいくつかご紹介します...

大規模モデルをより強力にするには、検索拡張生成を使用します。ここでは、Python による実装手順を示します。

この記事では、まず RAG の概念と理論に焦点を当てます。次に、オーケストレーション用の LangC...

...

2つのセッションにおけるインターネット大手の提案の要約:デジタル経済とスマートカーが頻出語に

[[385182]]中国人民政治協商会議第13期全国委員会第4回会議が2021年3月4日に北京で開催...

数量を増やして価格を下げます! OpenAIが史上最強のChatGPTをリリース。誰でもGPTをカスタマイズ可能。GPTストアは今月開始予定

まもなく、すべての GPT コレクションが GPT ストアを通じてアクセスできるようになります。はい...

2020 年に台頭する AI と機械学習の 6 つのトレンド

人工知能ソリューションの市場は急速に成長を続けており、数百億ドルの収益をもたらしています。調査会社I...

自動運転のためのエンドツーエンドの計画方法の概要

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...