はじめに
化合物によるGCNのさきがけとなる、David Duvenaudらの論文 "Convolutional Networks on Graphs for Learning Molecular Fingerprints" (https://arxiv.org/abs/1509.09292) を元にGCNを実装し、遊んでみようとしたところ、元の論文がAutogradというマイナーなライブラリで開発されており、そのまま修正するのは厳しかったので、他のオープンソースの実装コードを色々調べてみた時のメモ
調べた実装コード
- 論文の著作者の実装(オリジナル)
- DeepChem
- Chainer-Chemistory
- OpenChem
調べた箇所
今回調べたのは、原子や結合のコード化ではなく、ニューラルネットの組み方の部分である。
論文の著作者の実装(オリジナル)
- 利用DLフレームワーク:Autograd
- URL: https://github.com/HIPS/neural-fingerprint
- GCNの実装コード:https://github.com/HIPS/neural-fingerprint/blob/master/neuralfingerprint/build_convnet.py
- コメント(論文の実装との違い等):
論文の著者が書いたコードなので、当然ながら論文と同じ実装です。
DeepChem
- 利用DLフレームワーク:TensorFlow
- URL: https://deepchem.io/
- GCNの実装コード:
-
https://github.com/deepchem/deepchem/blob/master/deepchem/models/graph_models.py
の GraphConvModel および _GraphConvKerasModel クラス - コメント(論文の実装との違い等):
- 元の論文では
return sum(all_layer_fps), atom_activations, array_repのところで各レイヤーの出力を加算するところがあるが、この実装では最終レイヤーの出力のみを利用している。 - コンボリューションの各レイヤーの最後に、周りのノードと合わせてのプーリング操作が入っているが、元の論文にはない。
Chainer-Chemistory
- 利用DLフレームワーク:Chainer-Chemistory
- URL: https://github.com/chainer/chainer-chemistry/
- GCNの実装コード:
このあたり。 - https://github.com/chainer/chainer-chemistry/blob/master/chainer_chemistry/models/nfp.py
- https://github.com/chainer/chainer-chemistry/blob/efe323aa21f63a815130d673781e7cca1ccb72d2/chainer_chemistry/links/update/nfp_update.py#L9
- https://github.com/chainer/chainer-chemistry/blob/efe323aa21f63a815130d673781e7cca1ccb72d2/chainer_chemistry/links/readout/nfp_readout.py#L7
- コメント(論文の実装との違い等):
- 元の論文では
return sum(all_layer_fps), atom_activations, array_repのところで各レイヤーの出力を加算するところがあるが、この実装では各レイヤーの出力をConcatinateしている。 - この実装が一番、元論文を忠実に実装している気がする。
OpenChem
- 利用DLフレームワーク:PyTorch
- URL: https://github.com/Mariewelt/OpenChem/
- GCNの実装コード:
このあたり。 - https://github.com/Mariewelt/OpenChem/blob/master/openchem/modules/encoders/gcn_encoder.py
- https://github.com/Mariewelt/OpenChem/blob/9e2c98040377cfa0ba4ebf1df159b2f638c6fe7c/openchem/layers/gcn.py#L11
- コメント(論文の実装との違い等):
- この実装は別の論文の実装を参考にしているような気がする。そのためか、各レイヤーの中でmaxをとる等、元論文にない操作が見られる。
- DeepChemと同様、元の論文では
return sum(all_layer_fps), atom_activations, array_repのところで各レイヤーの出力を加算するところがあるが、この実装では最終レイヤーの出力のみを利用している。
おわりに
- 手法1つとっても様々な実装の仕方があることが分かった。
- Chainer-Chemistoryの実装が最も気に入っている。ただ、フレームワークはPyTorchを使いたいため、Chainer-Chemistoryのソースを参考にしながらPyTorchで実装することとしたい。