KZKY memo

自分用メモ.

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

  • 基本的な演算子
  • 微分はbackwordで,y=x^2 + x + 1の微分だとy.backwordでx.gradに結果がある
  • 中間の微分値はdefaultで捨てなので,保持しておきたい場合は,retain_grad=True.
  • 多次元の入力を持つVarialbeでgradientを取るときは,そのVaribleのgradientを初めにセットしておく.error backpropに必要なのだと思う.

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からまともに触りだしてもいいかも.

進行が大分早く,半年後にはここに書いた内容がほぼ意味を成さなくなってくる可能性があるので注意.