こんにちは。今日はグラフ畳み込みニューラルネットワーク(GCN)を理解するための学習のポイントについて取り上げたいと思います。GCNは近年猛烈な勢いで開発が進められている技術で、大きな注目を集めている・・・ということを既に知っている読者の方は多いかもしれません。しかしGCNに関する専門書はまだ出版されていませんし(2020年5月現在)、GCNの大家と言える人も日本にはまだいないと思います。そのためGCNの仕組みを把握するにはネットの記事を参考にするか英語論文に当たるかしかなく、なかなか習得が難しい技術だと思います。というわけで、GCNの習得に向けた重要な学習ステップや、学習を進める上での注意点についてご紹介したいと思います。私はGCN素人でしたが、1年間勉強しなんとか論文を読んだり簡単な実装ができるようになりました。その中で得られた気付きを共有します。
はじめに
内容に進む前に、実際にグラフを見てみましょう。これは以前本ブログで紹介したCoraという論文の引用関係を示したグラフネットワークをNetworkXというソフトで可視化したものです。ここでは、グラフとは頂点とそれらを結ぶ辺から構成されているんだ、ということだけを覚えておきましょう。なんとなく分かりますよね。
【参考資料】
【NetworkX+Python】NetworkXの使い方とグラフデータ可視化 - ころがる狸
【Graph Attention Networks解説】実装から読み解くGAT - ころがる狸
From this aspect, a GNN can be regarded as a GCN with a large number of identical layers to reach stable states [7] i.e., a GNN uses a fixed function with fixed parameters to iteratively update the node hidden states until reaching an equilibrium, while a GCN has a preset number of layers and each layer contains different parameters.
https://arxiv.org/abs/1812.04202
つまりGNNは固定された関数、固定されたパラメータによって特徴量を再帰的に更新する、一方GCNでは多層構造で各層で異なるパラメータを用いて特徴量を更新するということですね。GNNとGCNは以下で紹介する同一の考え方で理解できるため、これらをまとめてGCNと以下では呼ぶことにします。
また、本記事では主に以下の記事を参考に執筆しました。
arxiv.org
GCNの学習の難しさ
まずは、GCNについて私が独学する上でつまづいたポイントについて紹介します。思いつく範囲では4つほどの大きな壁があったように思います(こんだけ躓いてたら、そりゃ勉強が進まないわけだ・・・)
1.隣接行列など、グラフ理論の用語に不慣れである
グラフ系の論文を読んでいると、隣接行列や特徴行列、時にはグラフラプラシアンなどの謎の専門用語が出てきます。これらはグラフ理論に登場する概念ですが、GCNをこれから学ぼうとする人の大多数はグラフ理論を勉強したことがないでしょう。またスペクトラルなGCN, スペーシャルなGCNという流派があることも勉強していると分かってきますが、これらも理解するのが難しく躓いてしまいます。
2.色々なモデルがあるため混乱する
GCNを扱った論文は山のようにあり、それぞれ異なるモデルを提案しているため何から勉強すればいいのか分かりません。普通の多層パーセプトロンモデルならば皆が学ぶべき一般的な形があるわけですが、GCNの場合グラフの特徴量の集約の仕方や更新の仕方が色々あるためやや混沌としています。というか、そもそも「モデル」という言葉にしっくりこないかもしれません。
3.日本語の参考文献が少ない
Qiitaや個人ブログには断片的に情報がありますが、基礎から応用までまとめたGCNに関する体系的な日本語資料は多くありません。そのためきちんと段階を追ってGCNを学ぶのが難しくなっています。英語資料は比較的多いですが、英語が読めない場合独習はさらに難しくなるでしょう。
4.テンソルやベクトルの操作を表す記号が色々あり、混乱する
GCNの論文を読んでいると、グラフの特徴量を結合するだとか、行列を全結合層に通すなどの操作が頻出しますが、それを表す数学記号が || だったり( , )だったり、iだったりjだったりするので分かりづらいです。まぁ論文中で説明されますし勉強していると慣れてきますが、慣れないうちは意味が分かりません。
GCNの重要なポイント
以上を踏まえて、GCNを理解する上でのポイントをご紹介します。要は、上で示した難所をどのように克服するかという話です。結論から言うと、GCNを理解する上で最も重要なことは、
- 特徴量の集約・更新・読み出しというGCNに共通の学習ステップがある
- 集約・更新・読み出しの方法が色々あることが、初学者にとって混乱の元
というポイントをおさえることだと思います。以下で細かく説明しますが、ここでは専門用語はできるだけ使わずに、図を用いて直感的に理解することを目的としますのでご了承下さい。
共通フレームワーク:集めて、更新して、読み出す
多くのGCNモデルを理解するための方法が、特徴量を集めて、更新して、読みだすというGCNの統一的な枠組み(フレームワーク)を理解することです。英語ではそれぞれAggregate, Update, Readoutなどと言います。どういうことか図を使って具体的に見てみましょう。下の図は、A, B, C, D4つの頂点(ノード)とそれらを結ぶ辺(エッジ)からなる簡単なグラフを表しています。それぞれのノードやエッジは特徴量で表され、論文のネットワークなら論文を表す特徴量、化合物なら原子の特徴量などが使われます。GCNでは、教師データを用いてこれらの特徴量をニューラルネットワークによって最適化し、論文のカテゴリー予測や物性予測を行います。
1. 集める
GCNではグラフのつながりを学習させるため、周囲の情報を取り込んで頂点の特徴量を更新します(上図参照)。GCNの難しいポイントに「モデルが色々あり混乱する」と書きましたが、この周辺環境の取り込み方に色々な方法があるんです。
このことを式で表すと以下のようになります。
ここでは
層目の畳み込み層におけるノード
の「周辺環境の情報」を意味します。
,
は
層目のノード
の特徴量で、
はノード
をつなぐエッジの特徴量です。そして
が、どのようにして周辺環境を集約するかを指定する関数です。この
の種類の豊富さが、GCNに様々なモデルが林立している要因の一つになっています。
というのは抽象的でイメージが難しいですが、例えば特徴量
,
を結合して(つまり、それぞれ5次元の特徴量ならば15次元にして)、多層パーセプトロンに通すなどの処理になります。勉強したり論文を読むときは、どうやって集めてるのかな?という点に注意してみましょう。
2. 更新する
さて、上で集めた周辺情報を用いて、どのように中心にあるノード(上図のAノード)を更新するのでしょうか?この更新方法にも多くの種類があり、例えば周辺環境を表すテンソル
に重みをかけて活性化関数に入れるだとかの方法があります。数式では以下のように一般的な形で表すことができます。
この更新方法に多くの方法が提案されているというわけです。これに関しても同様に、勉強するときはどのようにノードの特徴量を更新しているのかな?という点を気にしておきましょう。なお、多くの場合ノード特徴量のみを更新しますが、エッジ特徴量も上記のような方法で更新している論文も存在します。
3. 読み出す
これでAノードの特徴量が更新されました。同じことを各ノードに行うことで、全ての特徴量が最適化されます。最後に、これらの特徴量を束ねてグラフ全体を表す特徴量を読み出す必要があります。この読み出し方法にも色々ありますが、例えば各ノードの特徴量の平均を取る、などが考えられます。式で書いてみましょう。
また、図で表すとこのようなイメージです。ここまでくると、あとはこの特徴量を一般的な多層パーセプトロンにかけて出力したいスカラー値に変換するなどすれば予測までのステップが完了です。お疲れさまでした!
次の学習ステップと、おわりに
ここまで、専門用語を極力使わず集約・更新・読み出しという3つの観点からGCNを説明してきました。ここで得た知識をベースに、具体的なモデルを学習する際には集約方法、更新方法、読み出し方法を意識しながら論文を読むのがよいと思います。その中で隣接行列、特徴行列といった概念が登場するはずなので、次はそれらの学習に取り組みましょう。幸い先人たちがそれらの分かりやすい解説記事をまとめているので、調べてみましょう。本ブログでもGCNのモデルの解説は行っていく予定ですので、気が向いたらチェックしてみてください!