{"notes":[{"id":"graph-learning/gat","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"GAT","subtitle":"隣の重みにも差がある","author":"Z. Yuan","paperDate":"2017-10-30","publishedOn":"2023-11-10","world":"external/gat","paperTitle":"Graph Attention Networks","paperUrl":"https://arxiv.org/abs/1710.10903","bibliography":{"title":"Graph Attention Networks","authors":["Petar Veličković","Guillem Cucurull","Arantxa Casanova","Adriana Romero","Pietro Liò","Yoshua Bengio"],"url":"https://arxiv.org/abs/1710.10903","pdfUrl":"https://arxiv.org/pdf/1710.10903v3","codeUrl":"https://github.com/PetarV-/GAT","preprint":{"id":"1710.10903","submittedOn":"2017-10-30","url":"https://arxiv.org/abs/1710.10903"},"publication":{"venue":"ICLR","year":2018,"kind":"conference","url":"https://arxiv.org/abs/1710.10903"},"citation":"@misc{graphlearninggat2017,\n  title = {{Graph Attention Networks}},\n  author = {Petar Veličković and Guillem Cucurull and Arantxa Casanova and Adriana Romero and Pietro Liò and Yoshua Bengio},\n  year = {2017},\n  eprint = {1710.10903},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1710.10903}\n}\n","citationPath":"/content/papers/citations/graph-learning/gat.402fa57986a5.bib"},"thumbnail":{"src":"/content/papers/assets/1a68144470e25ef01f2cd6ccf405483bc7960ca1cc9f7ebf5991060fb3a92010.png","width":1124,"height":540},"locale":"ja","path":"/content/papers/ja/graph-learning/gat.605c9e3ac92e.md","headings":[{"id":"問題設定","text":"問題設定","depth":2},{"id":"解決方法","text":"解決方法","depth":2},{"id":"注意ヘッド一つ","text":"注意ヘッド一つ","depth":3},{"id":"マルチヘッド","text":"マルチヘッド","depth":3},{"id":"コストと性質","text":"コストと性質","depth":3},{"id":"議論","text":"議論","depth":2},{"id":"実験設定","text":"実験設定","depth":3},{"id":"主な結果","text":"主な結果","depth":3},{"id":"何を学んだか","text":"何を学んだか","depth":3},{"id":"著者が挙げる制約","text":"著者が挙げる制約","depth":3},{"id":"静的な注意","text":"静的な注意","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/gcn","relation":"referenced","topic":""},{"id":"graph-learning/graphsage","relation":"referenced","topic":""}]},{"id":"graph-learning/gcn","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"GCN","subtitle":"一つのパラメーターで足りる？","author":"Z. Yuan","paperDate":"2016-09-09","publishedOn":"2023-10-01","world":"external/gcn","paperTitle":"Semi-Supervised Classification with Graph Convolutional Networks","paperUrl":"https://arxiv.org/abs/1609.02907","bibliography":{"title":"Semi-Supervised Classification with Graph Convolutional Networks","authors":["Thomas N. Kipf","Max Welling"],"url":"https://arxiv.org/abs/1609.02907","pdfUrl":"https://arxiv.org/pdf/1609.02907v4","codeUrl":"https://github.com/tkipf/gcn","preprint":{"id":"1609.02907","submittedOn":"2016-09-09","url":"https://arxiv.org/abs/1609.02907"},"publication":{"venue":"ICLR","year":2017,"kind":"conference","url":"https://arxiv.org/abs/1609.02907"},"citation":"@misc{graphlearninggcn2016,\n  title = {{Semi-Supervised Classification with Graph Convolutional Networks}},\n  author = {Thomas N. Kipf and Max Welling},\n  year = {2016},\n  eprint = {1609.02907},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1609.02907}\n}\n","citationPath":"/content/papers/citations/graph-learning/gcn.43058ec3e77e.bib"},"thumbnail":{"src":"/content/papers/assets/ded600c9ca8f4eda09d39ffb16b3c9b0ec730780063e55948b29924d00f14794.png","width":1122,"height":400},"locale":"ja","path":"/content/papers/ja/graph-learning/gcn.f7c10b90f2d7.md","headings":[{"id":"問題設定","text":"問題設定","depth":2},{"id":"グラフを正則化項にする","text":"グラフを正則化項にする","depth":3},{"id":"解決方法","text":"解決方法","depth":2},{"id":"スペクトル領域から削っていく","text":"スペクトル領域から削っていく","depth":3},{"id":"gcn-の一層","text":"GCN の一層","depth":3},{"id":"二層で十分","text":"二層で十分","depth":3},{"id":"議論","text":"議論","depth":2},{"id":"実験設定","text":"実験設定","depth":3},{"id":"主な結果","text":"主な結果","depth":3},{"id":"どの伝播がよいか","text":"どの伝播がよいか","depth":3},{"id":"もっと深くすると","text":"もっと深くすると","depth":3},{"id":"wl-アルゴリズムとの関係","text":"WL アルゴリズムとの関係","depth":3},{"id":"四日後の評論","text":"四日後の評論","depth":3},{"id":"論文が挙げる制約","text":"論文が挙げる制約","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/spectral-networks","relation":"referenced","topic":""},{"id":"graph-learning/chebnet","relation":"referenced","topic":""}]},{"id":"graph-learning/graphsage","category":"graph-learning","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"GraphSAGE","subtitle":"サンプリングで点呼","author":"Z. Yuan","paperDate":"2017-06-07","publishedOn":"2023-10-21","world":"external/graphsage","paperTitle":"Inductive Representation Learning on Large Graphs","paperUrl":"https://arxiv.org/abs/1706.02216","bibliography":{"title":"Inductive Representation Learning on Large Graphs","authors":["William L. Hamilton","Rex Ying","Jure Leskovec"],"url":"https://arxiv.org/abs/1706.02216","pdfUrl":"https://arxiv.org/pdf/1706.02216v4","codeUrl":"https://github.com/williamleif/GraphSAGE","preprint":{"id":"1706.02216","submittedOn":"2017-06-07","url":"https://arxiv.org/abs/1706.02216"},"publication":{"venue":"NeurIPS","year":2017,"kind":"conference","url":"https://papers.nips.cc/paper_files/paper/2017/hash/5dd9db5e033da9c6fb5ba83c7a7ebea9-Abstract.html"},"citation":"@misc{graphlearninggraphsage2017,\n  title = {{Inductive Representation Learning on Large Graphs}},\n  author = {William L. Hamilton and Rex Ying and Jure Leskovec},\n  year = {2017},\n  eprint = {1706.02216},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/1706.02216}\n}\n","citationPath":"/content/papers/citations/graph-learning/graphsage.1a0b3fd6e8b8.bib"},"thumbnail":{"src":"/content/papers/assets/88f6d9397f20155603c7ee0daef374fb944aac5fb73ed6573a573560b5b9c6aa.png","width":1090,"height":384},"locale":"ja","path":"/content/papers/ja/graph-learning/graphsage.66cf75c22e3b.md","headings":[{"id":"問題設定","text":"問題設定","depth":2},{"id":"transductive-と-inductive","text":"transductive と inductive","depth":3},{"id":"隣が多すぎる","text":"隣が多すぎる","depth":3},{"id":"解決方法","text":"解決方法","depth":2},{"id":"アルゴリズム","text":"アルゴリズム","depth":3},{"id":"隣接ノードを抽出する","text":"隣接ノードを抽出する","depth":3},{"id":"三つの集約器","text":"三つの集約器","depth":3},{"id":"ラベルなしでも学べる","text":"ラベルなしでも学べる","depth":3},{"id":"wl-テストとの関係","text":"WL テストとの関係","depth":3},{"id":"議論","text":"議論","depth":2},{"id":"三つのデータセット","text":"三つのデータセット","depth":3},{"id":"主な結果","text":"主な結果","depth":3},{"id":"速度とサンプリングのトレードオフ","text":"速度とサンプリングのトレードオフ","depth":3},{"id":"その後","text":"その後","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[{"id":"graph-learning/gat","relation":"citing","topic":""}]}],"text":"注意機構が機械翻訳で力を示したあと、2017 年 6 月の Transformer は注意だけにして RNN を丸ごと取り除きました。\n\n注意の仕事は単純です。各位置がほかを見て、類似度に応じて取り分を決め、加重してまとめます。GNN の集約とほぼ同じで、違うのは重みの出所です。\n\nGCN では次数に由来し、$i$ が隣の $j$ から受け取る比率は $1/\\sqrt{\\tilde d_i\\tilde d_j}$ に固定です。Cambridge の Petar Veličković、Bengio らは特徴量に決めさせたいと考え、GAT が生まれました。\n\n## 問題設定\n\n著者は当時の二つの道の難点を整理します。\n\nスペクトル法はラプラシアンの固有値分解に基づき、フィルターがそのグラフの固有ベクトルに結び付きます。構造の異なるグラフに直接使えません。GCN は一歩先だけを見る形に簡略化して速くしましたが、各隣接ノードの取り分は次数だけで決まります。\n\n空間法には隣の数が異なる問題があります。GraphSAGE は固定数を抽出するので、推論で全近傍を見ません。最良の LSTM は順序を仮定するので、毎回ランダムに並べ替えて入力します。\n\n欲しい層には、並列計算、異なる次数への対応、同じ近傍内で異なる取り分、全体構造を事前に知らず未知のグラフに使えること、が必要です。\n\n## 解決方法\n\n### 注意ヘッド一つ\n\n入力は各ノードの特徴量 $h_i\\in\\mathbb{R}^F$ です。まず共通の線形変換 $W\\in\\mathbb{R}^{F'\\times F}$ を使い、ノードのペアにスコアを付けます。\n\n$$\ne_{ij}=a\\left(Wh_i,\\ Wh_j\\right)\n$$\n\n$e_{ij}$ は $j$ の特徴量の $i$ にとっての重要度です。一般形では全ノードを見られますが、それではグラフ構造を捨ててしまいます。**マスク付き注意**で、自分を含む隣 $\\mathcal N_i$ だけに制限し、softmax で正規化します。\n\n$$\n\\alpha_{ij}=\\mathrm{softmax}_j(e_{ij})=\\frac{\\exp(e_{ij})}{\\sum_{k\\in\\mathcal N_i}\\exp(e_{ik})}\n$$\n\n注意機構 $a$ は一層のフィードフォワードネットワークで、重みベクトル $a\\in\\mathbb{R}^{2F'}$ のあとに負の領域の傾きが 0.2 の LeakyReLU を置きます。展開すると、こうなります。\n\n$$\n\\alpha_{ij}=\\frac{\\exp\\left(\\mathrm{LeakyReLU}\\left(a^\\top\\left[Wh_i\\,\\|\\,Wh_j\\right]\\right)\\right)}{\\sum_{k\\in\\mathcal N_i}\\exp\\left(\\mathrm{LeakyReLU}\\left(a^\\top\\left[Wh_i\\,\\|\\,Wh_k\\right]\\right)\\right)}\n$$\n\n$\\|$ は連結です。係数で隣の加重和を取り、$h'_i=\\sigma\\left(\\sum_{j\\in\\mathcal N_i}\\alpha_{ij}Wh_j\\right)$ とします。\n\n五ノードのグラフで一ヘッド動かします。$a^\\top[Wh_i\\|Wh_j]$ を、$i$ だけを見る前半と $j$ だけを見る後半に分けると、スコア行列を一度に計算できます。\n\n```python\nimport numpy as np\nnp.set_printoptions(precision=2, suppress=True)\nrng = np.random.default_rng(1)\n\n# 五ノード：0-1、0-2、1-2、2-3、3-4、自己ループ追加\nA = np.eye(5)\nfor i, j in [(0, 1), (0, 2), (1, 2), (2, 3), (3, 4)]:\n    A[i, j] = A[j, i] = 1\n\nh = rng.normal(size=(5, 3))          # 各ノード 3 次元特徴量\nW = rng.normal(size=(3, 2))          # 共有線形変換、出力 2 次元\na = rng.normal(size=4)               # 注意ベクトル、長さ 2F' = 4\n\ndef leaky_relu(z, slope=0.2):\n    return np.where(z > 0, z, slope * z)\n\ndef gat_head(h, W, a):\n    Wh = h @ W                                             # (5, 2)\n    e = leaky_relu((Wh @ a[:2])[:, None] + (Wh @ a[2:])[None, :])   # a^T [Wh_i || Wh_j]、(5, 5)\n    e = np.where(A > 0, e, -np.inf)                        # マスク：隣だけ残す\n    alpha = np.exp(e - e.max(1, keepdims=True))\n    alpha /= alpha.sum(1, keepdims=True)                   # 各行の隣だけで softmax\n    return alpha, alpha @ Wh\n\nalpha, out = gat_head(h, W, a)\nprint(\"注意係数:\")\nprint(alpha)\nprint(\"出力:\", out.shape)\n```\n\n```text\n注意係数:\n[[0.52 0.26 0.23 0.   0.  ]\n [0.52 0.26 0.22 0.   0.  ]\n [0.45 0.23 0.19 0.14 0.  ]\n [0.   0.   0.51 0.26 0.23]\n [0.   0.   0.   0.58 0.42]]\n出力: (5, 2)\n```\n\n各行の合計は 1、隣でない位置は 0 です。どちらも隣が三つの 0 番と 1 番に対し、GCN は近い取り分を与えます。ここでは特徴量が取り分を決め、0 番の特徴量にもっとも大きな重みが付きます。\n\n### マルチヘッド\n\nTransformer と同じく、多ヘッドで訓練が安定します。$K$ ヘッドはそれぞれ $W^k$ と $a^k$ を持ち、独立に計算します。中間層は連結して $KF'$ 次元にします。最終層では連結せず平均し、softmax または sigmoid につなぎます。\n\n$$\nh'_i=\\Big\\|_{k=1}^{K}\\sigma\\left(\\sum_{j\\in\\mathcal N_i}\\alpha^k_{ij}W^kh_j\\right),\\qquad\nh'_i=\\sigma\\left(\\frac1K\\sum_{k=1}^K\\sum_{j\\in\\mathcal N_i}\\alpha^k_{ij}W^kh_j\\right)\n$$\n\n先の例に三組の重みを使い、二つの統合方法の形を見ます。\n\n```python\nheads = [gat_head(h, rng.normal(size=(3, 2)), rng.normal(size=4))[1] for _ in range(3)]\nhidden = np.concatenate([np.where(o > 0, o, np.exp(o) - 1) for o in heads], axis=1)   # 中間層：ELU 後に連結\nfinal = np.mean(heads, axis=0)                                                          # 出力層：そのまま平均\nprint(\"三ヘッド連結:\", hidden.shape, \" 三ヘッド平均:\", final.shape)\n```\n\n```text\n三ヘッド連結: (5, 6)  三ヘッド平均: (5, 2)\n```\n\n[![原論文 Figure 1：左は注意機構。Wh_i と Wh_j を連結し、a と内積、LeakyReLU、j に対する softmax で α_ij を得る。右はノード 1 が六つの隣へ三ヘッドの注意を向け、三種類の線がヘッドを示す。結果を連結または平均して h'_1 にする。](/content/papers/assets/1a68144470e25ef01f2cd6ccf405483bc7960ca1cc9f7ebf5991060fb3a92010.png)](/content/papers/assets/1a68144470e25ef01f2cd6ccf405483bc7960ca1cc9f7ebf5991060fb3a92010.png)\n\n*原論文 Figure 1（Veličković ら）、[**PDF 4 ページ**](https://arxiv.org/pdf/1710.10903v3#page=4)より。原キャプションは省略。*\n\n### コストと性質\n\n一ヘッドは $O(|V|FF'+|E|F')$ で GCN と同程度です。注意は全エッジ、出力は全ノードで並列化でき、固有値分解も不要です。多ヘッドの保存量とパラメーターは $K$ 倍ですが、ヘッド同士は独立です。\n\n注意機構を全エッジで共有するため、全グラフを先に知る必要がありません。有向グラフも、$j\\rightarrow i$ がなければ $\\alpha_{ij}$ を計算しなければ済み、未知のグラフにも使えます。GraphSAGE と違い全近傍を見て、順序も仮定しません。\n\n## 議論\n\n### 実験設定\n\ntransductive 実験は Cora、Citeseer、Pubmed で、GCN と同じ分割、各クラス 20 ラベルです。二層で、最初は 8 ヘッド×8 次元の計 64 次元に ELU、次は一ヘッドでクラス数を出します。小訓練セットなので L2 は 0.0005、dropout は 0.6 と強く、注意係数にも適用します。各反復でランダムな近傍を見ることに相当すると著者は強調します。訓練ノードが 60 だけの Pubmed は出力も 8 ヘッド、L2 は 0.001 です。\n\ninductive は PPI で、訓練 20、検証 2、未知のテスト 2 グラフです。三層で、前二層は各 4 ヘッド×256 次元、最後は 6 ヘッド×121 次元を平均し sigmoid で多ラベル分類します。データが多いので L2 と dropout は使わず、中間層に skip connection を加えます。\n\n### 主な結果\n\n| 方法 | Cora | Citeseer | Pubmed |\n| --- | ---: | ---: | ---: |\n| GCN | 81.5% | 70.3% | 79.0% |\n| GCN-64* | 81.4 ± 0.5% | 70.9 ± 0.5% | 79.0 ± 0.3% |\n| **GAT** | **83.0 ± 0.7%** | **72.5 ± 0.7%** | **79.0 ± 0.3%** |\n\nGCN-64* は注意そのものを公平に比べるため、GCN を同じ 64 次元に広げ、ReLU と ELU を試した最良値です。GAT は Cora、Citeseer の両方で GCN-64* を 1.6 ポイント上回り、Pubmed では同等です。\n\nPPI の差はさらに大きくなります。\n\n| 方法 | PPI micro-F1 |\n| --- | ---: |\n| GraphSAGE-LSTM（原論文） | 0.612 |\n| GraphSAGE*（構成を調整） | 0.768 |\n| Const-GAT | 0.934 ± 0.006 |\n| **GAT** | **0.973 ± 0.002** |\n\n表は二段階で読みます。Const-GAT は同構成で注意を定数に替え、全隣接ノードが同じ重みの GCN 風集約です。0.768 から 0.934 は主に全近傍と大きな構成の効果で、0.934 から 0.973 の 3.9 ポイントが注意自体の寄与です。\n\n### 何を学んだか\n\nCora の訓練済みモデルの一層目を t-SNE にすると、七クラスが二次元で明確に分かれます。エッジの太さは八ヘッド平均の注意です。ただし正しい解釈にはデータセットの領域知識がさらに必要で、今後の仕事としています。\n\n### 著者が挙げる制約\n\n- 疎行列版は保存量をノード・エッジ数に線形にできますが、当時のフレームワークは二次元テンソルの疎な積だけを扱い、複数グラフのバッチ処理は制約されます。\n- グラフの規則性によっては、疎演算で GPU が CPU を大きく上回るとは限りません。\n- 受容野はネットワークの深さに制限され、GCN と同じです。\n- 全エッジの並列計算は、近傍が大きく重なるグラフで重複が多くなります。\n\n### 静的な注意\n\n2021 年、Technion の Brody、Alon、Yahav は〈How Attentive are Graph Attention Networks?〉で GAT の構造上の限界を指摘しました。[GATv2 要旨](https://arxiv.org/abs/2105.14491v3)\n\nスコア $a^\\top[Wh_i\\|Wh_j]$ は $i$ だけの項と $j$ だけの項の和に分解できます。LeakyReLU と softmax は単調なので、隣の**順位**は $j$ の項だけで決まり、クエリ $i$ に依存しません。先のグラフを全結合にして全員が全員を見ます。\n\n```python\nA = np.ones((5, 5))                      # 全結合にして全員から全員を見る\nalpha, _ = gat_head(h, W, a)\nprint(alpha)\nprint(\"各行の最大位置:\", alpha.argmax(1))\n```\n\n```text\n[[0.37 0.19 0.17 0.15 0.13]\n [0.39 0.19 0.16 0.14 0.12]\n [0.4  0.2  0.17 0.12 0.11]\n [0.43 0.22 0.18 0.09 0.08]\n [0.44 0.22 0.18 0.09 0.07]]\n各行の最大位置: [0 0 0 0 0]\n```\n\n五ノードの順位は同じで、0 番が最重要、4 番が最下位です。違うのは比率だけです。元のグラフではマスクにより候補が異なり、好みも異なるように見えますが、候補が重なる部分では順位が一致します。\n\nBrody らは**静的注意**と呼びました。修正では、$[h_i\\|h_j]$ に重みを掛けて LeakyReLU を通し、最後に $a$ との内積にします。非線形性を間に置くと順位がクエリに応じて変わります。GATv2 は同程度のパラメーターで、OGB など 11 ベンチマークすべてで GAT を上回りました。\n\n\n> [!TIP]\n> \n> 先行する GCN と、同じく隣の重みを扱う GraphSAGE は、こちらのノートをどうぞ。\n> \n> - **[[16.09] GCN：一つのパラメーターで足りる？](/blog/papers/graph-learning/gcn)**\n> - **[[17.06] GraphSAGE：サンプリングで点呼](/blog/papers/graph-learning/graphsage)**\n\n\n## 結論\n\nGAT は注意を GNN に持ち込み、同じ近傍でも特徴量に応じた異なる重みを学べるようにしました。マスクでグラフ構造を残し、マルチヘッドで訓練を安定させます。\n\n引用ネットワークでは GCN より 1〜2 ポイント改善し、PPI の同構成比較は注意自体の寄与を明確に測りました。\n\n使うなら注意係数にも dropout を忘れずに。小データセットで論文が頼った工夫です。「ノードによって好む隣が違う」タスクなら、GATv2 と比べてみてください。\n\nマスクを外し全ノードを見ると、Transformer の注意になります。のちの Graph Transformer が扱うのは、この一歩で失うグラフ構造です。\n","imageSizes":{"/content/papers/assets/1a68144470e25ef01f2cd6ccf405483bc7960ca1cc9f7ebf5991060fb3a92010.png":{"width":1124,"height":540}}}
