はじめに
様々な分野で機械学習を活用した研究成果が上がるようになりましたが、自分の分野の研究にも活用してみたいと思う方がおられるかもしれません。
- Pytorch などの機械学習ライブラリー未経験の人を想定して
- 実データの解析までできるようになることを目標に
- 実装にあたって自分が詰まった経験を踏まえ
記事を投稿します。長くなるので数回に分けます。もし内容に誤りがありましたら教えていただけますと幸いです。
今後は
- ライブラリーの構成(今回)
- コードの詳細(各ファイルごとに数回)
- データの準備
- hyperbolicGCN の理論的背景
の順に更新します。
追記:第2回 train.py の解説を書きました。
https://qiita.com/haru_negami/items/efec0d6c2d461caf7364
理論を先に知るべきかもしれませんが、応用上は様々な種類の機械学習の手法を試すことが重要であり、従って各論よりは共通するライブラリー構成を初めにざっと掴み、コードを読みながら理論を知る方が意義が大きいのではないか、と考えました。それにデータが出ると解釈も捗り楽しいですよね。
今回扱うライブラリーは、__グラフデータ__を扱う深層学習 (Graph Neural Network, GNN) のライブラリーの一つ、Hyperbolic Graph Convolutional Network in Pytorch です。GNNの種類の一つ、GCN に共通する基本的な構造から始めて、最後の回で理論の詳細に触れようと思います。
GNN についての解説のご紹介
さて私は先日、GNN ってよく聞くけど一体何やねんというところから勉強を始めました。概要を知るのには以下のまとめがとても素晴らしかったのでご紹介します。
こちらをどうぞ御覧ください。
また、私は長らく「数学カフェ」という勉強会を主催しているのですが、機械学習・深層学習がどんなことをしているのかについて PFN の大野健太さんに講演していただきましたのでそちらの資料もご参考になさってください。
ライブラリーの紹介
今回ご紹介するライブラリーはこちらです。
Github; HazyResearch/hgcn
Christopher Ré, CS department, Stanford University
TwitterID; @HazyResearch
Stanford のリサーチグループです。GithubのREADMEがとても充実していてとても参考になりましたので、こちらのライブラリーを紹介することにしました。
ライブラリー構成
このライブラリーの構成は以下の通りです。
├── [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) ├── [data](## data) ├── [train.py](## train.py) ├── [utils](## utils) ├── [models](## models) ├── [manifolds](## manifolds) ├── [optimizers](## optimizers) └── [layers](## layers)上の枝が青いところが環境設定用ファイルで、水色の部分がGCN実行用のファイル・フォルダです。
train.py を実行して
data を読み込み
utilsフォルダのファイルで適切な形式にデータを変換し
model フォルダのファイルに定めてあるモデルに従って計算を実行します。
manifolds, optimizer, layers で、埋め込む空間やその上の計量、畳込み方法、最適化関数などが指定されています。
では、それぞれ簡単に説明をしていきます。
準備用ファイル
README.md
説明書です。ここに書いてある情報をもとにライブラリーをインストールします。実行するときのコマンドも必要なオプションもとても丁寧に書いてあり分かりやすいです。
__init__.py
実行時に最初に読まれるファイルで、必要なその他のモジュールを呼び出します。(コードの中身に書いてあること自体は python3.x 系で本当に必要なのかよくわからないですが未検証…。)下の記事に、何をやっているのか書いてありました。
config.py
各種変数の初期設定などがまとめて書かれています。コマンドラインで実行するときにオプションで値を設定することもできますが、頻繁に使う設定はここに書き込んでおくほうがよいと思われます。
requirements.txt
このライブラリーを実行するために必要なその他のライブラリーのバージョンが書かれています。
ターミナルで
pip install -r requirements.txt
を実行するとこのファイルが読み込まれて、動かすのに必要なバージョンを揃えてくれます。自分が実行したときにはインストールできないものもあったのですが、エラーメッセージに応じて適当なバージョンを代わりに入れました。
environment.yml
こちらも上記と同様に環境設定が書かれているファイルです。
内容について詳細には立ち入りませんが以下の記事が参考になると思います。
set_env.sh
このファイルは必要な環境変数を設定するために使います。訓練をする前に以下のコマンドを実行します。
source set_env.sh
このファイルを適宜書き換えれば、データを保存したいフォルダのパスなども自分の使いやすいように変えることができます。
MacOS Catalina のターミナルから実行される方は、ターミナルのデフォルトシェルが bash から zsh に変更になったので、最初の一行
#!/usr/bin/env bash
の bash のところを zsh に書き換える必要があるかと思います。ご確認ください。
GCN 関連コード
いよいよGCNのコード本体の方に入ります。コードの詳細は次回以降、細かく解説します。ざっくりと内容を見てみます。
data
このフォルダにはデータが入っています。それはそう。
GCN の Benchmarking によく使われる基本的なデータが揃っているので、今後精度評価などをしたい場合はこちらのデータが参考になると思われます。
GCN でよく使われるものとして機械学習の論文の引用・被引用関係をグラフで表したCORA データベースがありますが、これは Thomas Kipf さんという方が作られました。
Github: Tomas Kipf
CORA のデータ構成は以下が参考になります。
Github: CORAのデータ構成
データの詳細や前処理についてはまた次回以降に詳細を書きます。
train.py
このコードを実行することで訓練とテストがスタートします。
コードの内容は次回以降に一行一行解説します。
utils
データファイルを読み込んで利用できるデータ形式に整形するファイルが入っているフォルダです。ご自身で作成したデータを使いたい場合はここのファイルを適宜変更すれば良いです。
models
GCN の モデルの構造を指定します。(構造については、冒頭にご紹介した資料を御覧ください。)エンコーダー、デコーダーの設定もここに書いてあります。
ロス関数や計量、その他の関数を変更したいときはここを編集します。
(他にも manifolds のフォルダ内にも変更箇所があります。また各ファイルの詳細を解説するときに詳しく書こうと思います。)
manifolds
今回のライブラリーは hyporbolic GCN といって双曲空間上にデータを埋め込んで学習を行います。埋め込む空間やその空間に定められる距離、写像の設定がここに書かれています。
双曲空間を用いた機械学習はこちらの記事が詳しいです。
論文だとこのあたり。
-
Maximillian Nickel, Douwe Kiela, NeurIPS(2017)
Poincaré Embeddings for Learning Hierarchical Representations -
Ines Chami, et al.
Hyperbolic graph convolutional neural networks, NeurIPS(2019) -
Qi Liu, et al.
Hyperbolic graph neural networks, NeurIPS(2019)
optimizers
pytorch の optimizer を読み込みます。
layers
ここでは、GCNの各レイヤーで実行することが書かれています。
- ユークリッド空間上の点から双曲空間へ重みとバイアスをつけて変換
- 畳み込み
- 双曲空間からユークリッド空間に座標を変換する
畳み込みについては以下も参考になるかと思います。
終わりに
今回はライブラリーのフォルダー構成を簡単にご説明しました。大まかな流れがを掴んだところで、次回はコードの詳細を解説します。
更新は来週末までが目標です。更新したらここにもリンクを貼ります。参考文献が増えたらここにも追記します(おすすめありましたらぜひ教えて下さい!)。
繰り返しになりますが、誤りがありましたらどうぞお教えくださいませ。
よろしくお願いします。
読んでくださりありがとうございました!