機械学習とかコンピュータビジョンとか

CVやMLに関する勉強のメモ書き。

Graph U-Netsを読んだのでメモ

はじめに

Graph U-Netsを読んだのでメモ.

概要

Graph Neural NetworkでU-Netを作りたいというもの.そのためにgraph Pooling (gPool)とgraph Unpool (gUnpool)を提案する.

Graph Pooling Layer

ここでの目標は,グラフから情報量の多いノードをサンプリングして部分集合を得ること.学習パラメータ\mathbf{p},ノード上の特徴ベクトルを\mathbf{x}_iで定義して,ノードの情報量を次のスカラー値で定義する.

\displaystyle
y_i=\mathbf{x}_i\mathbf{p}/\|\mathbf{p}\|

最終的にy_iが大きいノードをサンプリングして新たなグラフを得る.

より具体的な話に入るためいくつかの変数を導入する.ここではN個のノードを持つグラフ\mathbb{G}を考え,このグラフは隣接行列A^l\in\mathbb{R}^{N\times N}とノード上のC次元特徴ベクトルを表す特徴行列をX^l\in\mathbb{R}^{N\times C}として定義する.

すると,graph pooling layerは次のように定義される.

\displaystyle
\mathbf{y}=X^l\mathbf{p}^l/\|\mathbf{p}^l\|,\\
\mathrm{idx}=\mathrm{rank}(\mathbf{y},k),\\
\tilde{\mathbf{y}}=\mathrm{sigmoid}(\mathbf{y}(\mathrm{idx})),\\
\tilde{x}^l=X^l(\mathrm{idx},:),\\
A^{l+1}=A^l(\mathrm{idx},\mathrm{idx}),\\
X^{l+1}=\tilde{X}^l\odot(\tilde{\mathbf{y}}\mathbf{1}^T_C)

2式目のrankは\mathbf{y}から値の大きいtop-kのインデックスを選択する関数で,(\mathrm{idx},:)(\mathrm{idx},\mathrm{idx})X,Aからidx番目の要素を取り出すことを意味する.最後の式は,取り出された各ノードの値に情報量を表す量\mathbf{y}を乗じる演算を表している.

上記の定式化により学習パラメータ\mathbf{p}はbackpropで学習可能.ただこれでより良いノードを選択可能な写像になる気はしないがどうなのか.

Graph Unpooling Layer

基本的な戦略はgPoolの逆関数を定義しようというもの.ここでは次のような定式化を考える.

\displaystyle
X^{l+1}=\mathrm{distribute}(0_{N\times C},X^l,\mathrm{idx})

\mathrm{idx}\in\mathbb{Z}^{\ast k}は対応する解像度(Nノードからkノードへのdownsampling)のgPoolで選ばれたノードのインデックスを表す.X^l\in\mathbb{R}^{k\times C}は現在のグラフにおける特徴行列で0_{N\times C}は新たなグラフの特徴行列の初期値(全ての要素が0のN\times C行列).\mathrm{distribute}X^lの要素を\mathrm{idx}を元に0_{N\times C}にコピーしていくというもの.非常にstraightforwardな手法.

Graph U-Nets

Pooling,Unpoolingが定義できたので,任意のgraph convolutionとU-Netsに従ったskip-connectionを使ってU-Netぽくモデルを作りましたという話.一応少しの工夫はあるがtrivialなので割愛.

まとめ

Kipf & WellingのGCNやGATと比較して性能は上.実装もそこまで難しそうではないのでGNNの選択肢の一つとして考えられそう.ただやっぱり\mathbf{p}があんまり腹落ちしないところではある.