Hyperbolic GCN のライブラリー解説（１）

# はじめに

様々な分野で機械学習を活用した研究成果が上がるようになりましたが、自分の分野の研究にも活用してみたいと思う方がおられるかもしれません。

- __Pytorch などの機械学習ライブラリー未経験の人を想定して__
- __実データの解析までできるようになることを目標に__
- __実装にあたって自分が詰まった経験を踏まえ__

記事を投稿します。長くなるので数回に分けます。もし内容に誤りがありましたら教えていただけますと幸いです。

今後は

1. __ライブラリーの構成（今回）__
2. __コードの詳細（各ファイルごとに数回）__
3. __データの準備__
4. __hyperbolicGCN の理論的背景__

の順に更新します。

<font color="red">追記：第2回 train.py の解説を書きました。
https://qiita.com/haru_negami/items/efec0d6c2d461caf7364 </font>

理論を先に知るべきかもしれませんが、応用上は様々な種類の機械学習の手法を試すことが重要であり、従って各論よりは共通するライブラリー構成を初めにざっと掴み、コードを読みながら理論を知る方が意義が大きいのではないか、と考えました。それにデータが出ると解釈も捗り楽しいですよね。

今回扱うライブラリーは、__グラフデータ__を扱う深層学習 (Graph Neural Network, GNN) のライブラリーの一つ、Hyperbolic Graph Convolutional Network in Pytorch です。GNNの種類の一つ、__GCN に共通する基本的な構造から始めて、最後の回で理論の詳細に触れようと思います。__

# GNN についての解説のご紹介

さて私は先日、GNN ってよく聞くけど一体何やねんというところから勉強を始めました。概要を知るのには以下のまとめがとても素晴らしかったのでご紹介します。

[GNNまとめ(1): GCNの導入](https://qiita.com/shionhonda/items/d27b8f13f7e9232a4ae5 )

こちらをどうぞ御覧ください。

また、私は長らく「[数学カフェ](https://twitter.com/mathcafe_japan)」という勉強会を主催しているのですが、機械学習・深層学習がどんなことをしているのかについて PFN の大野健太さんに講演していただきましたのでそちらの資料もご参考になさってください。

[20170422 数学カフェ 確率統計機械学習 Part1](https://www.slideshare.net/KentaOono/20170422-part1)

[20170422 数学カフェ 確率統計機械学習 Part2](https://www.slideshare.net/KentaOono/20170422-part2)

# ライブラリーの紹介

今回ご紹介するライブラリーはこちらです。
[Github; HazyResearch/hgcn](https://github.com/HazyResearch/hgcn)
[Christopher Ré, CS department, Stanford University](https://cs.stanford.edu/people/chrismre/)

TwitterID; @HazyResearch

![スクリーンショット 2020-03-14 21.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329603/7a110b5e-c99a-6f68-bf62-f9b3eecb5f5e.png)

Stanford のリサーチグループです。GithubのREADMEがとても充実していてとても参考になりましたので、こちらのライブラリーを紹介することにしました。


# ライブラリー構成

このライブラリーの構成は以下の通りです。

<font color="blue">
├── [README.md](## README.md)
├── [\_\_init\_\_.py](## \_\_init\_\_.py)
├── [config.py](## config.py)
├── [requirements.txt](## requirements.txt)
├── [environment.yml](## environment.yml)
├── [set_env.sh](## set_env.sh)</font><font color="deepskyblue">
├── [data](## data)
├── [train.py](## train.py)
├── [utils](## utils)
├── [models](## models)
├── [manifolds](## manifolds)
├── [optimizers](## optimizers)
└── [layers](## layers)</font>

上の枝が<font color="blue">青いところ</font>が<font color="blue">環境設定用ファイル</font>で、<font color="deepskyblue">水色の部分</font>が<font color="deepskyblue">GCN実行用のファイル・フォルダ</font>です。

<font color="deepskyblue">train.py</font> を実行して
<font color="deepskyblue">data</font> を読み込み
<font color="deepskyblue">utils</font>フォルダのファイルで適切な形式にデータを変換し
<font color="deepskyblue">model</font> フォルダのファイルに定めてあるモデルに従って計算を実行します。

<font color="deepskyblue">manifolds, optimizer, layers</font> で、埋め込む空間やその上の計量、畳込み方法、最適化関数などが指定されています。



では、それぞれ簡単に説明をしていきます。

# 準備用ファイル

## README.md

説明書です。ここに書いてある情報をもとにライブラリーをインストールします。実行するときのコマンドも必要なオプションもとても丁寧に書いてあり分かりやすいです。

## \_\_init\_\_.py

実行時に最初に読まれるファイルで、必要なその他のモジュールを呼び出します。（コードの中身に書いてあること自体は python3.x 系で本当に必要なのかよくわからないですが未検証…。）下の記事に、何をやっているのか書いてありました。

* [Python の __init__.py とは何なのか - Qiita](https://qiita.com/msi/items/d91ea3900373ff8b09d7)

## config.py

各種変数の初期設定などがまとめて書かれています。コマンドラインで実行するときにオプションで値を設定することもできますが、頻繁に使う設定はここに書き込んでおくほうがよいと思われます。

## requirements.txt

このライブラリーを実行するために必要なその他のライブラリーのバージョンが書かれています。
ターミナルで

pip install -r requirements.txt

を実行するとこのファイルが読み込まれて、動かすのに必要なバージョンを揃えてくれます。自分が実行したときにはインストールできないものもあったのですが、エラーメッセージに応じて適当なバージョンを代わりに入れました。


## environment.yml

こちらも上記と同様に環境設定が書かれているファイルです。
内容について詳細には立ち入りませんが以下の記事が参考になると思います。

* [condaによるポータブルなPython環境構築のすすめ - Qiita](https://qiita.com/yubessy/items/2dd43551aa8308dc7eca)

## set_env.sh

このファイルは必要な環境変数を設定するために使います。訓練をする前に以下のコマンドを実行します。

source set_env.sh

このファイルを適宜書き換えれば、データを保存したいフォルダのパスなども自分の使いやすいように変えることができます。

MacOS Catalina のターミナルから実行される方は、ターミナルのデフォルトシェルが bash から zsh に変更になったので、最初の一行

```shell:set_env.sh

#!/usr/bin/env bash
```
の bash のところを zsh に書き換える必要があるかと思います。ご確認ください。

# GCN 関連コード

いよいよGCNのコード本体の方に入ります。コードの詳細は次回以降、細かく解説します。ざっくりと内容を見てみます。

## data

このフォルダにはデータが入っています。それはそう。
GCN の Benchmarking によく使われる基本的なデータが揃っているので、今後精度評価などをしたい場合はこちらのデータが参考になると思われます。
GCN でよく使われるものとして機械学習の論文の引用・被引用関係をグラフで表したCORA データベースがありますが、これは Thomas Kipf さんという方が作られました。
[Github: Tomas Kipf](https://github.com/tkipf/ )

CORA のデータ構成は以下が参考になります。
[Github: CORAのデータ構成](https://github.com/tkipf/pygcn/tree/master/data/cora )

データの詳細や前処理についてはまた次回以降に詳細を書きます。

## train.py

このコードを実行することで訓練とテストがスタートします。
コードの内容は次回以降に一行一行解説します。

## utils

データファイルを読み込んで利用できるデータ形式に整形するファイルが入っているフォルダです。ご自身で作成したデータを使いたい場合はここのファイルを適宜変更すれば良いです。

## models

GCN の モデルの構造を指定します。（構造については、冒頭にご紹介した資料を御覧ください。）エンコーダー、デコーダーの設定もここに書いてあります。
ロス関数や計量、その他の関数を変更したいときはここを編集します。
（他にも manifolds のフォルダ内にも変更箇所があります。また各ファイルの詳細を解説するときに詳しく書こうと思います。）

## manifolds

今回のライブラリーは hyporbolic GCN といって双曲空間上にデータを埋め込んで学習を行います。埋め込む空間やその空間に定められる距離、写像の設定がここに書かれています。
双曲空間を用いた機械学習はこちらの記事が詳しいです。

* [双曲空間でのMachine Learningの最近の進展 - ABEJA Tech Blog](https://tech-blog.abeja.asia/entry/hyperbolic_ml_2019)

論文だとこのあたり。

- Maximillian Nickel, Douwe Kiela, NeurIPS(2017)
[Poincaré Embeddings for Learning Hierarchical Representations](https://papers.nips.cc/paper/7213-poincare-embeddings-for-learning-hierarchical-representations.pdf)

- Ines Chami, et al. 
[Hyperbolic graph convolutional neural networks, NeurIPS(2019)](https://papers.nips.cc/paper/8733-hyperbolic-graph-convolutional-neural-networks.pdf)

- Qi Liu, et al. 
[Hyperbolic graph neural networks, NeurIPS(2019)](https://papers.nips.cc/paper/9033-hyperbolic-graph-neural-networks.pdf)

## optimizers

pytorch の optimizer を読み込みます。

## layers

ここでは、GCNの各レイヤーで実行することが書かれています。

- ユークリッド空間上の点から双曲空間へ重みとバイアスをつけて変換
- 畳み込み
- 双曲空間からユークリッド空間に座標を変換する

畳み込みについては以下も参考になるかと思います。

* [定番のConvolutional Neural Networkをゼロから理解する - DeepAge](https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html)


# 終わりに

今回はライブラリーのフォルダー構成を簡単にご説明しました。大まかな流れがを掴んだところで、次回はコードの詳細を解説します。

更新は来週末までが目標です。更新したらここにもリンクを貼ります。参考文献が増えたらここにも追記します（おすすめありましたらぜひ教えて下さい！）。

繰り返しになりますが、誤りがありましたらどうぞお教えくださいませ。
よろしくお願いします。

読んでくださりありがとうございました！