説明できるAI ~Graph Neural Networksに対する説明法~

22日目を担当します、よろしくお願いします
スマホで見る方のために？ページ内リンク付き目次です
(インラインで数式いれるとスマホで見たとき変なところで改行される?からか, 見づらいかもしれません)
1. [この記事の概要](#この記事の概要)
2. [論文に入る前に](#論文に入る前に) 
3. [Intro](#intro)
4. [GNNExplainer](#gnnexplainer)
5. [Experiments Setup](#experiments-setup)
6. [Results](#results)
7. [ちょっと触る](#ちょっと触る)
8. [Conclusion](#conclusion)


# この記事の概要
[NeurIPS 2019 pre-proceedings](https://papers.nips.cc/book/advances-in-neural-information-processing-systems-32-2019) から選んだGNN(Graph Neural Networks)に関する説明法の論文(from Stanford Uni), [GNNExplainer: Generating Explanations for Graph Neural Networks](https://papers.nips.cc/paper/9123-gnnexplainer-generating-explanations-for-graph-neural-networks) に関して紹介します.

# 論文に入る前に
さらっと説明できるAI(XAI)について書いておきます.

- [16日目の方の投稿](https://qiita.com/ToshihiroNakae/items/c8604d19d48889be271c)にもありましたように, GoogleからeXplanable AI(XAI)についての発表が11月にありました.[^1]

- XAIはアメリカ国防高等研究計画局(DARPA)もプロジェクトの1つとして研究を進めています[^2]
- XAIに関する論文数は2015年から右肩上がりです[^3]
- AIの説明法は様々な物が提案されています.
    - 局所的説明(1つのデータに対する予測の説明)[^4]
    - 大域的説明(モデル全体の説明)[^5]
    - Example-basedな説明[^6]
* 解釈性の高いモデル, 説明法の分類はいくらかあります[^7]
    * intrinsic or post-hoc
        * 決定木等の元から解釈性が高いアルゴリズムか, 学習済みのモデルに対する解析を行うアルゴリズムか 
    * model-specific or model-agnostic
        * あるモデルのみに対するアルゴリズムか, 機械学習におけるモデルすべてに適応できるアルゴリズムか
    * local or global
        * localのみを考慮するアルゴリズムか(LIMEのように,説明したいデータ近傍で解釈性の高いモデルを作成し説明するなど), モデルの全体的な説明をするアルゴリズムか
    * semantic or syntactic
        * LIME,SHAP等のモデルが何を重視しているかの"意味"を出すアルゴリズムか,[Feat](https://arxiv.org/abs/1807.00981)のような"構造的"にモデルを表すアルゴリズムか(これはまだ少ない？)

今回紹介する論文では, AbstractでGNNExplainerはmodel-agnosticなアプローチと書いてありますが, おそらくGNNのモデルならすべて適応できるという意味で用いているのだと思います. つまり, GCNでもほかのモデルでも, GNNのモデルならすべて適応できるという意味でmodel-agnosticな手法ということです.

# Intro
では,本題に入っていきます.GNNのサーベイ論文等を読むとIntroによく書いてある？？ように,グラフは様々な実世界の問題を表現でき,GNNによって近傍データの特徴を良く加味した学習が可能になりました.

しかしGNNもその他高精度の手法と同様に？,透明性・解釈性が非常に高いわけではありません.そこで本論文はGNNに対する説明法,GNNExplainerを提案しています.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/3713284e-a696-2ea2-6602-10a539b51364.png)
GNNExplainerの概要図は上の通りです.上のグラフは,ノードの1つ1つを1人の人間に対応するとします.タスクとしてはNode Classificationで,そのノードの人の好きなスポーツを予測するとすると,左図の赤いノード$v\_i$をモデル$Φ$はバスケットボールと予測しています. その理由として, GNNExplainerはsubgraphを右図のように構築し, 周りにボールを使うスポーツが好きなノードが多いことからバスケットという予測を下したという説明ができます.

上の図からわかるように, GNNExplainerの入力は学習済みのGNNのモデルと説明したいインスタンスで, 出力は説明とするサブグラフを返します(サブ特徴量も返します,これについては次の章で).

Node Classificationなら, 近傍k-nodesをテキトｰに持ってきてもそれっぽい説明になりそうだと思いましたが, GNNExplainerは, Graph Classification,Link Prediction等の別タスクに対しても適応可能で, 繰り返しですがGNNのモデルならすべて適応可能なアルゴリズムであることが, 論文中で主張されています.

# GNNExplainer
では, GNNExplainerはどのようにSubgraphを決定するのか見ていきます.

GNNExplainerは以下の仮定の下で,サブグラフの隣接行列$A_{s}$の獲得を目指します($A_{c}$は元のグラフの隣接行列).

```math
A_{S}[j, k] \leq A_{c}[j, k]
```

GNNExplainerのゴールは, あるノード$v$と学習済みのGNNモデルが与えられたときに, $v$に対するモデルの予測根拠をよく説明するようなサブグラフ$G_{S} \subseteq G_{c}$を獲得することです($G_{c}$は元のグラフ).

では,どのような$G_{S}$を獲得することを目指すかというと, 以下を最適化する$G_{S}$を最も良いグラフとします. ここで,$MI$は相互情報量, $X_{S}$をサブグラフの特徴量, $Y$を訓練後のGNNの予測ラベル分布とします.

```math
\max _{G_{S}} M I\left(Y,\left(G_{S}, X_{S}\right)\right)=H(Y)-H\left(Y | G=G_{S}, X=X_{S}\right) \tag{1}
```

ここで, $H(Y)$は定数であるため(当たり前ですが,GNNモデル訓練後にGNNExplainerを使うため,$H(Y)$は固定), (1)を以下のように変換できます.

```math
\min_{G_{S}} H\left(Y | G=G_{S}, X=X_{S}\right) \tag{2}
```

```math
H\left(Y | G=G_{S}, X=X_{S}\right)=-\mathbb{E}_{Y | G_{S}, X_{S}}\left[\log P_{\Phi}\left(Y | G=G_{S}, X=X_{S}\right)\right]
```

(1)の最大化問題は, (2)のような条件付きエントロピーの最小化問題と言えます. (2)の下の式は, 期待値を使って条件付きエントロピーを表しています. 

ハイパーパラメタとして,$K_{M}$を決め,$\left|G_{S}\right| \leq K_{M}$となるように元のグラフ$G_{C}$からエッジを取り除いていくのがGNNExplainerのアルゴリズムです. 学習済みモデル$Φ$の予測の曖昧さを最小にするように, 取り除くエッジを決め, サブグラフを決定します.

サブグラフの選択肢としては, 元のグラフが大きいほど指数関数的に多くあり, 直接最適化することは困難なため, サブグラフを$\mathcal{G}$から生じる確率変数と考えます($G_{S} \sim \mathcal{G}$).


```math
\min _{\mathcal{G}} \mathbb{E}_{G_{S} \sim \mathcal{G}} H\left(Y | G=G_{S}, X=X_{S}\right) \tag{3}
```

凸性の仮定の下で, [イェンセンの不等式](https://qiita.com/kenmatsu4/items/26d098a4048f84bf85fb)から(3)の上界が以下のようになります. 凸性の仮定はGNN,DNNの複雑さから保たれないことが考えられますが, 実験的に正則化項とともに最適化して得たサブグラフが良い結果を得られていることを主張しています(論文中のp5, in practice~辺り).

```math
\min _{\mathcal{G}} H\left(Y | G=\mathbb{E}_{\mathcal{G}}\left[G_{S}\right], X=X_{S}\right) \tag{4}
```
次のトリックですが, (4)の$\mathbb{E}_{\mathcal{G}}$を推定するために, 以下のように[平均場近似](https://www.cs.cmu.edu/~epxing/Class/10708-17/notes-17/10708-scribe-lecture13.pdf)を用います.

```math
P_{\mathcal{G}}\left(G_{S}\right)=\prod_{(j, k) \in G_{c}} A_{S}[j, k]
```
これにより, サブグラフの隣接行列$A_{s}$の$(j, k)$要素, すなわち$\left(v_{j}, v_{k}\right)$にエッジが存在するかどうかをあらわす値をそれぞれ推定できます. よって(4)の期待値部分をサブグラフの隣接行列$A_{s}$に置き換えることができました.

サブグラフの隣接行列$A_{s}$は以下の式のように, 元グラフの隣接行列$A_{c}$にマスクをかけて獲得します.
$$A_{c} \odot \sigma(M)$$
これによって得られたサブグラフの隣接行列$A_{s}$にたいして, 適当なしきい値(0.5とか)を基準に最終的な隣接行列を決定します(隣接行列なので, 0か1にする). だらだら書いてきましたが, 最終的には以下のように, **最適なマスクMの獲得**をGNNExplainerは目指します(中身はクロスエントロピーloss).

```math
\min _{M}(-\sum_{c=1}^{C} \mathbb{1}[y=c] \log P_{\Phi}\left(Y=y | G=A_{c} \odot \sigma(M), X=X_{S}\right)) \tag{5}
```

(5)から得られたマスク$M$を元に, サブグラフ$G_{s}$を決定し, GNNExplainerの出力とします.

以上がサブグラフ決定のアルゴリズムです. ここからはサブ特徴量をどう獲得するか書いていきますが, [是非読み飛ばしてください](#experiments-setup)(なんか長くなってきたから(^ω^))

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/b6c5775d-27e3-ad8f-c6c0-7006e929bfe1.png)
上の右図のように, GNNExplainerは予測に効いた特徴量の決定もします(赤い×が予測にあまり有用でない特徴量). 流れはサブグラフ決定と同じで, 元々の特徴量$X_{S}$にマスクを利用してサブ特徴量$X_{S}^{F}$の獲得を目指します. 式としては以下のようになります. $F$が有用な特徴量を選択するselectorです.

```math
X_{S}^F = X_{S} \odot F  \\
F \in\{0,1\}^{d}
```
よって学習するのは, マスク$F$となります. 両方を考慮した下式を, GNNExplainerは同時最適化します.

```math
\max _{G_{S}, F} M I\left(Y,\left(G_{S}, F\right)\right)=H(Y)-H\left(Y | G=G_{S}, X=X_{S}^{F}\right) \tag{6}
```

シンプルな選択法として, GNNの重み行列に応じて, 値が小さい特徴量は選択しないという手法が考えられます. しかしこれでは, 本当は有用なのに重み行列の値が小さい特徴量を選択できないので, すべてのサブ特徴量に関して周辺化を行い[(参考)] (https://arxiv.org/abs/1702.04595),学習中にモンテカルロ推定を用いてサンプルします. 

また, 誤差逆伝搬の際に(6)の勾配をマスク$F$に流すために, [再パラメータ化トリック](https://stats.stackexchange.com/questions/199605/how-does-the-reparameterization-trick-for-vaes-work-and-why-is-it-important/)を用います.具体的には, 確率変数Xを以下のように再パラメータ化します($Z$は経験分布に対する$d$次元の確率変数で,$K_{F}$は選択する特徴量の上限です).

```math
X=Z+\left(X_{S}-Z\right) \odot F \text { s.t. } \sum_{j} F_{j} \leq K_{F}
```
ここらへんは良く理解できてないです




# Experiments Setup
実験についてここから触れていきます.
使用するデータセットは以下の3つです.

1. Synthetic Datasets
    - 著者自作のデータセットです. 以下の図のような構成になっています.![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/c882732c-5f71-9bf0-1241-7fb8b6e99e57.png)
    - 一番左のBA-shapesというのは,Baseのグラフとしてscale-freeなネットワークモデルの1つである[BAモデル](https://en.wikipedia.org/wiki/Barab%C3%A1si%E2%80%93Albert_model)を作成し, motifとして家(house)のネットワークをbaseのノードに対してランダムに取り付けます. ラベルの種類としては, 家のトップノード, ミドルノード, ボトムノードと, baseのノードの4種類です.
    - 他の自作データセットも作成の流れは同様で, ネットワークの"base"があり, "motif"がランダムに取り付けられます. motifをベースにラベルが決まっているので, GNNExplainerがこれを取得できるかどうかを実験で確かめています[(Figure 3)](#自作データセットの説明結果).


2. MUTAG Datasets
   - Molecule Graph(分子構造グラフ)のデータセットで, その分子に[変異原性](https://ja.wikipedia.org/wiki/%E5%A4%89%E7%95%B0%E5%8E%9F)があるかどうかを判別するGraph Classificationタスクのモデルを学習し, それに対してGNNExplainerを用いています[(Figure 4)](#graph-classificationの説明結果).


1. Reddit Bianary Datasets
    - redditのスレでのやりとりを集めたデータセットです. タスクはGraph Classificationで, そのグラフがOnline DiscussionかQuestion Answeringかのどちらのスレッドを表しているかを判別するGNNを学習し, GNNExplainerで説明を作成しています[(Figure 4)](#graph-classificationの説明結果).  <br>   
    - ノードの1つ1つがユーザーを表し, エッジはあるユーザーからあるユーザーへコメントが送られたなら, 結ばれています. Online Discussionの有名なsubredditとしては[r/atheism](https://www.reddit.com/r/atheism/), Quesion Answeringとしては[r/IAmA](https://www.reddit.com/r/IAmA/)などが有名？です. 2chとかでいう,「○○で働いてたけど, 質問ある??」みたいな感じですね


グラフニューラルに対する説明法の提案はこの論文が初めてだと思いますが, 比較手法として勾配ベースの説明と, Attentionベースの説明を使用しています. 余談ですが, 自然言語処理モデルで内部挙動を示していると考えられているAttentionですが, [Attention is not Explanation](https://www.aclweb.org/anthology/N19-1357/)という論文も出ています. さらに余談ですが, これを否定する, [Attention is not not Explanation](https://arxiv.org/abs/1908.04626)という論文も出ています.

MUTAG, Reddit Binary Datasetsは[ここ](https://ls11-www.cs.tu-dortmund.de/staff/morris/graphkerneldatasets)からダウンロードできます.


# Results
結果画像は3枚, [自作データセット](#自作データセットの説明結果)・[MUTAG,REDDIT](#graph-classificationの説明結果)・[サブ特徴量抽出](#予測に重要であったサブ特徴量の獲得)の結果3つです.

## 自作データセットの説明結果
下図が結果です. 赤いノードが予測したノードで, その予測のキモとなったサブグラフを各手法は出力します. 例として左上のBA-shapesに対する説明を見てみると,他手法と比べて分類の鍵であるmotifの家構造(ground-truth)を取れているのがわかります. その他の自作データセットに対する結果も良い出来です.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/742fc49e-e537-140e-6e77-5b56160d5295.png)

## Graph Classificationの説明結果
次がGraph Classificationタスクに対する説明結果です. 上2つがMUTAGの結果,下2つがREDDITの結果です.  
MUTAGのground-truthであるring構造(これがあると変異原性がある？？)と$NO_2$のgroupがGNNExplainerはサブグラフとして取れています. [変異原もいろいろあるっぽく](https://ja.wikipedia.org/wiki/%E5%A4%89%E7%95%B0%E5%8E%9F), ground-truthが本当に正しいのか等はわかりません. 化学に詳しい人教えてください.  
REDDITの方は, 左下がOnline Discussionのグラフで, 右下がQuestion Answeringのグラフです. Online Discussionはある1つのトピックに対して多くの人がコメントするスレ, Question Answeringは1人または数人がどんどん質問に答えていくスレであるので, ground-truthが下図のようにそれぞれなっており, それに対してGNNExplainerは良い感じにサブグラフを取れているという主張です.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/74774755-9d87-a50d-faba-5a89706c34f1.png)

## 予測に重要であったサブ特徴量の獲得
ラストがサブ特徴量抽出の結果です.左がMUTAGからの1インスタンス, 右が自作データセット1インスタンスに対する結果です. GNNExplainerがGradientベースの手法と比べて, Ground-Truthにかなり近い特徴量の重量度を獲得できています. Attentionベースの手法はサブ特徴量獲得には利用できないので, この図には出てきません.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/2b78103f-8e59-079e-b42b-c29c483d2019.png)

# ちょっと触る
原著の方のコードは[ここ](https://github.com/RexYing/gnn-model-explainer)にあります.

クローンして, Google Driveに置いておき, Google Colab上で実行しました. 実行したファイルを[ここ](https://github.com/matsutakk/qiita/tree/master/gnn-model-explainer-master)に置いておきます.

自作データセットの1つ, BA-shapesのタスクに対してGNNExplainerを使ってみました. Tensorboardを利用しているので, サブグラフの結果を載せておきます.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/7ed088c7-0ffe-f344-0d8d-28d9c20c13e6.png)

motifの家構造がしっかりと取れています.

また, ノートブック上でインタラクティブに使えるようにもなっています. threshからしきい値を変更でき, すぐにそれに応じたグラフが出力されます.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/2b2c472f-a765-5d47-2449-436327a2d9cd.png)

threshを0にしてみると, すべて残すことになるので, 以下のようになります(多くてぐちゃぐちゃ).
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223338/2bce6011-f7ed-62b0-9cb4-5baf013e8568.png)


# Conclusion
GNNに対する説明法として, GNNExplainerというアルゴリズムを提案したというのが本論文でした. この論文がおそらくGNNに対するmodel-agnosticな説明法としては初で, Node Classificationに限らず, GNNにおける別タスクにも適応可能な手法となっています. 

最後まで読んでくれてありがとう
良いクリスマスを！

[^1]: [Google Cloud Explanable AI](https://cloud.google.com/explainable-ai/) / [Whitepaper](https://storage.googleapis.com/cloud-ai-whitepapers/AI%20Explainability%20Whitepaper.pdf)
[^2]: [Explainable Artificial Intelligence (XAI)](https://www.darpa.mil/program/explainable-artificial-intelligence)
[^3]: [XAIの研究者, Been Kimのスライドp7より] (http://people.csail.mit.edu/beenkim/papers/BeenK_FinaleDV_ICML2017_tutorial.pdf)
[^4]: [LIME](https://github.com/marcotcr/lime), [SHAP](https://github.com/slundberg/shap)等
[^5]: [ニューラルネットの決定木近似](https://pdfs.semanticscholar.org/b6ba/5374ed8e09845996626bc62cc6d938e83fee.pdf)等
[^6]: [MMD-critic](https://github.com/BeenKim/MMD-critic),[Influence Funtion](https://github.com/kohpangwei/influence-release)等
[^7]: [Interpretable Machine Learning](https://christophm.github.io/interpretable-ml-book/taxonomy-of-interpretability-methods.html)