Chainerをさわってみた
自分用のまとめなのでDNN知っていたり,Keras, Caffe, Torchとか他のDNN Libraryを知っている人は,公式Docmentを読んだほうがいい.
Github Star数的にはCaffe > Keras >= Torch > Chainer (ただし,chainerを見ているのは日本人くらいだろうから,結構多いとおもう)だが,今からからまともに触るならChainerがアーキ的にイケているという話を効いたのでやってみた.というか,Define-by-Runのおかげで,RNNが簡単に書けるのがイケている.
この記事を書いていた時点ではv1.3だったが,すでにv1.4になっている.
概要
PFN/PFIが作っているDeep Learning Frameworkでpythonで使う.
大まかな特徴は2つだと思う
GPU Array backendはPyCUDA/CuPy
- 他のtheano-based DNN libraryはCudaNdarray
- ただし,PyCUDAのフィーチャーがlow-levelすぎるとのことで,彼らはCuPyで置き換えようとしている.PyCUDA numpy interfaceのsubset. v1.3.0から置き換わっているよう.
Define-by-Run
多くのdeep learning libraryはDefine-and-Runでありnetwork (computational graphと言った方がいいかも)を一度defineしたらfixedなので,動的にnetwork構造を変更できないが,Chainerはできる.Define-by-Runは実際のforward-computationのときにon-the-flyでnetwork構造を定義する.そのため,柔軟なことが売りなのだと思う.多分,on-the-flyでnetwork構造を書けるようにすると,RNNの実装が簡単なんだと思う.
比較をみるともう少し詳細な違いがわかる.この表を見ると,大きなdisadvantageとしては,FFT-based Convolutionがないくらい.Stateful RNNs (LSTMのことか?)もあるかもしれないが,Kerasにもあるはず.
特徴ではないかもしれないが,low-level interfaceを公開してくれていて,使う側が柔軟な対応がでいるようになっていると思う.Define-by-Runの範疇かな.
Installation
$ sudo pip install chainer
基本
Variable
Parameterized functions
- fucntions moduleにあるconnection.pyとか.
- Affine, ConvolutionとかLayerのことだと思う
FunctionSet
- DNNにおけるレイヤーセットのような感じ.モデルということ.
- parameterized functionを入れる.activation functionは入れない
- FunctionSet.parameters and FunctionSet.gradientsですべてのレイヤーに対するoperationが可能
Optimizer
- sgd, momentum, adagrad, adadelta, adam, rmspropとかが入っている
- 基本的な使い方はmnist sampleを見たほうがいい
- .dot形式のgraphも書く機能があるよう
ここまでの例
ここ
Mnist Sample
注意点
Towards Chainer v1.5のp.6-9, 19によると, v1.5からLow-level Interface (FunctionSet/Optimizer)が変わるかもしれないので,v1.5からまともに触りだしてもいいかも.
進行が大分早く,半年後にはここに書いた内容がほぼ意味を成さなくなってくる可能性があるので注意.