読者です 読者をやめる 読者になる 読者になる

人工知能に関する断創録

人工知能、認知科学、心理学、ロボティクス、生物学などに興味を持っています。このブログでは人工知能のさまざまな分野について調査したことをまとめています。最近は、機械学習・Deep Learningに関する記事が多いです。



深層学習ライブラリ Keras

Deep Learning Theano Keras

ここ1年くらいDeep Learning Tutorialを読みながらTheanoというライブラリで深層学習のアルゴリズムを実装してきた。

深層学習の基本的なアルゴリズムならTheanoでガリガリ書くこともできたがより高度なアルゴリズムをTheanoでスクラッチから書くのはとてもきつい*1

そんなわけでPylearn2LasagnenolearnなどのTheanoベースのラッパーライブラリをいろいろ調べていたのだが、結局のところKerasというライブラリが一番よさげだと思った。KerasはバックエンドとしてTheanoとTensorflowの両方が使え、より高レイヤな表現(たぶんChainerと同レベル)で深層学習のさまざまなアルゴリズムが記述できる。TheanoやTensorflowは完全に隠蔽されており、Kerasで書かれたプログラムはまったく修正せずにTheanoとTensorflowをいつでも切り替えられる。

Kerasの特徴は

  • Modularity
  • Minimalism
  • Easy extensibility
  • Work with Python

の4つ。バックエンドのTheanoによる記述がシンプルで読みやすかったのが調べてみようと思ったきっかけ。

Kerasのメイン開発者はGoogleのFrançois Cholletさん。GithubとTwitterのアイコンがいかした人だ。KerasはGoogleのメインプロダクトではなさそうだがTensorflowのラッパーライブラリとしても将来有望に感じている。下のGithubにおける深層学習ライブラリランキングの結果を見ても人気が高く、海外では開発者も多そうだ。ただこれはCholletさんによる独自集計のようなので多少割引が必要かも(?)

Kerasによる実装例

Kerasのサンプルコードを見てみよう。たとえば、MNISTの分類を行う多層ニューラルネットワークは下のように実装できる。素のTheanoによる実装(2015/6/18)と比べるとかなりシンプルに書けることがわかる。個人的な意見だがネットワーク構造の書き方はChainerによる実装(2015/10/5)よりも直感的かもしれない。

  • ニューラルネットの構造はmodelにさまざまなレイヤをadd()することで構築する。
  • 活性化関数やDropoutも層とみなす。
  • modelのコンパイル時に最適化アルゴリズム(例ではRMSprop)と誤差関数(例では交差エントロピー)を指定する。誤差関数として平均二乗誤差も使える。
  • 最適化アルゴリズムは基本的なSGDからより効率的なAdamRMSpropまで一通りそろっている。実装もシンプルなのでアルゴリズムの勉強にもなる。
  • 学習はscikit-learnと同じくfit()というメソッドでできる。Kerasは基本的に教師あり学習しか考えておらずRBMのような教師なし学習を実装するには自作が必要。
  • 収束判定のEarly-stoppingはコールバックとして実装されており、収束したら自動的にループが止まるようになっている。
  • バリデーションデータは明示的に指定することもできるが、例のように訓練データの10%だけ使うといった指定ができる。
  • fit()の戻り値のhistoryオブジェクトに各エポックのコストや精度が保存されるためあとで結果をプロットするのに使える。
  • verbose=1と指定することで下のように学習の進捗をリアルタムに棒グラフで表示してくれる。各エポックにかかった時間、訓練データのloss/accuracy、バリデーションデータのloss/accuracyも一緒に表示される。あとどれくらい学習に時間がかかりそうか見積もりできて便利!
Using Theano backend.
Using gpu device 0: GeForce GTX 760 Ti OEM (CNMeM is disabled, CuDNN not available)
train samples:  (60000L, 784L)
test samples:  (10000L, 784L)
building the model ...
Train on 54000 samples, validate on 6000 samples
Epoch 1/100
54000/54000 [==============================] - 3s - loss: 0.2969 - acc: 0.9092 - val_loss: 0.1136 - val_acc: 0.9640
Epoch 2/100
54000/54000 [==============================] - 3s - loss: 0.1204 - acc: 0.9631 - val_loss: 0.0855 - val_acc: 0.9765
Epoch 3/100
54000/54000 [==============================] - 3s - loss: 0.0839 - acc: 0.9739 - val_loss: 0.0706 - val_acc: 0.9815
Epoch 4/100
28032/54000 [==============>...............] - ETA: 1s - loss: 0.0660 - acc: 0.9797

当然ながら畳み込みニューラルネットやリカレントニューラルネットを書く機能もある。たとえば、畳み込みニューラルネットのモデルは下のように書ける。

またBatch Normalization、ZCA白色化、Data Augmentationなどを行うクラス(ImageDataGenerator)も用意されている。

最先端手法の実装

最先端の論文に出てくるようなアルゴリズムもKerasによる実装が公開されている。最近話題になったAlphaGoのクローンなんてのもあるけどどうやって学習・実行するんだろう・・・

というわけでDeep LearningライブラリKerasの紹介でした。日本ではあまり話題になっていないようでQiitaではまだ5件くらいしか投稿がない・・・今後しばらくは海外のサイトに潜入していろんな人のKerasによる実装から最先端の手法を勉強していきたい。

*1:GoogleのTensorflowも調べてみたがこれもTheanoと同じ低レイヤのライブラリでこれを使って高度なアルゴリズムをスクラッチから記述するのは同様にきつい