今年の事始めはkerasから

Deep Learningが流行していますね。流行している理由は2つ。

  • 研究的に良い精度が出る報告がされていること
  • 使えるSDKなどの基盤がそろってきたこと

これらが相まって、以下のような好循環が生まれています。

  1. 研究者が良い報告がされた論文を発表する
  2. 誰か(または本人)がSDKを使って実装し公開する
  3. これを使って試して自分のタスクに適用してみる
  4. うまくいかなかったところを改善する
  5. 論文にして発表する

まだまだ、研究の領域を出ていないとは思いますが、こんな感じで好循環が生まれています。
この辺の話はまた別の機会にでも。

で、いろんな基盤が出てきてます。
ざっくりまとめるとこんな感じ。まだまだたくさんありますが、最近はこんなところに集約されてる気がする(日本では)。

行列計算ライブラリ Tensorflow(by Google), Theano(by モントリオール大学)
SDK Chainer(by Preferred Networks, inc.), Keras(by Googleになるかも), The Microsoft Cognitive Toolkit(旧CNTK by Microsoft)

この他にもありますので"deep learning フレームワーク"で検索をかけてみてください。また、Wikipediaにもこんなエントリがあります。
Comparison of deep learning software - Wikipedia

よく言われる TensorFrowは分散処理に優れた行列計算ライブラリであって、実際はDeepLearning専用ではありません。なので、高次元のSDKがほしくなります。
高次元のSDKとして有名なのは、Chainer。日本人が主に作っているので日本語ドキュメントも充実していてとっつきやすいです。

Kerasってなに

ひとことで言うと、行列計算ライブラリを使いやすい形で提供する高次APIです。

バックエンドの行列計算ライブラリは、TensorflowとTheanoです。これらを切り替えて使うことができ、これぞれの分散処理の恩恵やGPUを利用した高速化の恩恵を受けることができます。
日本語ドキュメントも作られています。

Keras Documentation

始めるまでのおすすめの手順

個人的な感想ですが、Kerasは、実際使ってみると、Chainerに似ていてプログラマはとっつきやすいです。しかし、DeepLearningの基本構成を知らないと訳が分からないとは思います。ですので、おすすめ手順は以下。

ニューラルネットの基本を知る

まずは、以下を読んで、ニューラルネットの基本をPythonの実装として体感しましょう。でも、いきなり数式から入るとめっちゃ難しくなってしまいます。そこで、以下の本がおすすめです。

  • 実例を含めてPythonソースコードがかいてある。
  • 数式も載っているけど、微分とか行列演算から書いてあるので、高校数学の知識がなくても最悪読めてしまう。
  • また、実装形態も、KerasやChainerが目指している高次APIの方法に近い。

DeepLearningもちょっとかじりますが、これ以上難しくなると実装は大変な領域に入ります。ちょうどいいところで止めてあるのも、この本のよいところで、わかった気にさせてくれます。聞きかじりで手を出せてしまう危険さはありますが、、、。

わかってる人も復習もかねて見ておくと勉強になります。知ってる人なら1weekあれば読み終わってしまえます。

DeepLearningでできることを知る

次に読むか、並行して読むとよいなと思ったのはこれ。ニューラルネットの理解を進めてできることは何かを知っておくと、モチベーションにつながります。

  • DeepLearingでできることの紹介
  • それぞれのいろんな実装形態の紹介
  • これらを使ったサンプルプログラムの紹介

新しい事例も交えて書いてあります。半面、少し時間がたつと、過去の事例になってしまうかもしれないので、読むなら今です。

サンプルプログラムも載っているので、ノードやバックプロパゲーションの実装の方法や、図の表示方法なども書いてあり、役立ちます。

この辺まで大体ザクッと読んでみてからだと、すごく理解が早いと思います。

Kerasをインストール

ニューラルネットやDeepLearningの基本が大体わかったら、Kerasを触ってみましょう。

インストールですが、ドキュメント通りで大体終わります。

Keras Documentation

Ubuntu 14.04LTSの環境で少し詰まったのは、numpy, scipy, pyyaml。numpy, scipy にはBLATが必要なので、pipで入れるよりも apt-get で入れてしまったほうが、依存関係がはっきりしてよいでしょう。また、pyyamlもlibyamlが必要なので、apt-getで。同じくh5pyも。

sudo apt-get install python-numpy python-scipy python-yaml python-h5py

cuDNNは今回入れませんでした。

また、バックエンドにTensolFlowを使いたかったので、Tensolflowのみ入れてみました。

Download and Setup

pipでインストール完了。

サンプルを実行してみる

ここで、Kerasのサンプルがexampleディレクトリにいくつかあります。

keras/examples at master · fchollet/keras · GitHub

わたしは、テキストデータ処理に興味があったので、とりあえず、動くかどうかだけ見てみようと思い以下を試してみます。

reuters_mlp.py Trains and evaluate a simple MLP on the Reuters newswire topic classification task.

タスクとしては、ニュース記事を46カテゴリに分類に分類するタスクですね。

python reuters_mlp.py
Using TensorFlow backend.
Loading data...
8982 train sequences
2246 test sequences
46 classes
Vectorizing sequence data...
X_train shape: (8982, 1000)
X_test shape: (2246, 1000)
Convert class vector to binary class matrix (for use with categorical_crossentropy)
Y_train shape: (8982, 46)
Y_test shape: (2246, 46)
Building model...
Train on 8083 samples, validate on 899 samples
Epoch 1/5
8083/8083 [==============================] - 5s - loss: 1.4141 - acc: 0.6819 - val_loss: 1.0555 - val_acc: 0.7686
Epoch 2/5
8083/8083 [==============================] - 4s - loss: 0.7821 - acc: 0.8175 - val_loss: 0.9347 - val_acc: 0.7942
Epoch 3/5
8083/8083 [==============================] - 4s - loss: 0.5468 - acc: 0.8644 - val_loss: 0.8641 - val_acc: 0.8109
Epoch 4/5
8083/8083 [==============================] - 4s - loss: 0.4141 - acc: 0.8978 - val_loss: 0.8620 - val_acc: 0.8120
Epoch 5/5
8083/8083 [==============================] - 4s - loss: 0.3244 - acc: 0.9180 - val_loss: 0.8896 - val_acc: 0.8120
2208/2246 [============================>.] - ETA: 0sTest score: 0.86964678913
Test accuracy: 0.793855743544

まあ、精度は感覚的にはこんなもんなんかな。SVMと比較してみたくなりますね。あとでやってみます。


そして、めっちゃソースコードがシンプル
ドキュメントを読んでみると、このデータは、データセットが既に用意されていて、簡単にデータをロードできるようになっている。そして、単語区切りをしてベクトル作成するクラスも実装されてる。この辺を参考にしながら、日本語版を作ればよさそうですね。

とりあえず、今日はこの辺で終了。