のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Pythonで書けるDeepLearningのライブラリを比較してみた

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

ChainerのAdvent Calendar第16日目です。
DeepLearningのライブラリの比較を行ってみました。

Chainer Advent Calendar 2015 - Qiita

ライブラリ紹介

Chainer

chainer.org

日本製PFIが開発したライブラリ。個人的には書きやすくて結構好き。
時系列ニューラルネットワークが組みやすいことを売りにしている。

Tensorflow

Googleが公開したライブラリ
https://www.tensorflow.org/www.tensorflow.org

Googleが公開したことで、評判のライブラリ。
やたらとニュースになるほど凄かったが、果たして他とくらべてどうなのか。

Lasagne

github.com

Theanoを基盤として書きやすくしたライブラリ
Kaggleで使っている人が多いとかなんとか・・・、
因みに私が見る限り、Kaggleで使っている人は、nolearnを使って書いている人が多いですね。

静的な比較

比較項目の解説

  1. 拡張性・・・・新規に関数を追加したい場合にどれだけ容易か
  2. GPU対応・・・GPU対応がどれだけ簡単に可能か。コマンド一つ?コードの記載量など
  3. 高速性・・・・どれだけ高速に動作するか。基本的に時間がかかるので、大幅に必要。
  4. githubの★・・githubのスター数
  5. 書き方・・・・レイヤー型orシンボル型(レイヤーごとに定義するかシンボルを使ってレイヤーを構成していくか)

比較表

f:id:tereka:20151216002150p:plain

解説

Chainer
  1. 拡張性:Gradient Checkingやcupyなど実装しやすい環境が揃っているが、Back Propagationを自分で実装する必要がある。
  2. GPU対応:numpy か cupyどちらを使うのかのみで、GPUかCPUかを選択できる。但し、コードの修正が若干必要となる。
  3. 高速性:CPUの速度は遅いがGPUでの速度が高速である。
  4. githubの★:★数が、1004と勢いがある。
  5. 書き方:個人的にはレイヤーを意識して、記載できるので、後でデバッグするときやネットワークの構造をひと目見ただけで確認できる点が楽。

個人的には豊富なExampleと書きやすいのが嬉しいところ。
cupyを使えばnumpy likeにGPUコードを書くことができる。
日本の開発者が活発で、様々なModelのExampleがgithubに公開されている。

<要望>
①個人的にはscikit-learnっぽくかけるとありがたいです。
②chainer1.5から__call__を使用して書けるようになったのですが、予測したいときはどのメソッドを呼び出して、学習したい時はどうすればよいのかがまだわかっていない(多分私だけ)。

TensorFlow
  1. 拡張性:シンボル型のコード記述が可能なので、比較的容易である。自動微分機能搭載
  2. GPU対応:比較的簡単に可能。ソースコードの変更は不要。但し、インストール時に設定が必要となる。
  3. 高速性:遅いと大評判なTensorFlow。進化するとかしないとかの噂が流れている。CPUはマトモだが、GPUの速度は遅い。
  4. githubの★:githubの★の数が14000と膨大な★の数が付いている。
  5. 書き方:シンボル型なので新しいアルゴリズムの拡張は簡単にできる。

個人的にこのライブラリが現状そこまで良いと思えないが、今後、高速に発展していくと思われる。
見やすい可視化機能とシンボル型の記述で、自動微分が不要なところが拡張性があって良いと思う。また、google直々に使われている機械学習のwrapperを記載しており、商業的には高速で発展する勢いがある。

とりあえず、可視化もいいですが、流石に遅いので、高速化してください。

Lasagne
  1. 拡張性:シンボルで記述可能、GPU対応も簡単に可能なので、拡張は容易にできる。
  2. GPU対応:起動時のコンパイル方法を変更すれば、可能なので、簡単に切り替えができる。
  3. 高速性:CPUやGPUである程度の速度を保てる。
  4. githubの★:昔からあるので★数は一定以上確保している。
  5. 書き方:シンボル型なので新しいアルゴリズムの拡張は簡単にできる。

シンボル型の記述で、自動微分が不要なところが拡張性があって良いと思う。
古くからあるので、研究者間では使われているのでしょうか。
因みに学生時代は私もTheanoでDeep Learningの基礎を学びました。

因みに多くのKaggleのサンプルコードには、Lasagneで書かれている内容がある。

実験

せっかくなので、速度に関することは実験してみました。

実験環境

OS Ubuntu 14.04
Memory 32GB
CPU Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
GPU GeForce GTX970

実験した内容

以下の3層ネットワークを構築し、速度を比較してみました。(データはMNIST先生)

1層目 780 - 1000
2層目 1000- 1000
3層目 1000 - 10

速度比較内容

Library 合計時間(sec) 平均時間(sec)
Chainer 442.07 22.10
Lasagne 325.75 16.28
TensorFlow 229.99 11.49
Chainer(GPU) 39.31 1.96
Lasagne(GPU) 38.21 1.91
tensorflow(GPU) 46.65 2.33

急ピッチだったのでExcelで仕上げました。これぐらいだと楽です。

f:id:tereka:20151215234020p:plain

f:id:tereka:20151215233549p:plain

考察

  1. CPUだけのTensorFlowは速いけれども、GPU実行した途端、他のライブラリより遅くなってる。噂には聞いていましたが、正直、これには驚きです。(どうしてそうなった。)
  2. ChainerのCPU何かあるのかな…。学習すればするほど、一回の学習時間が遅くなっていってるのですが。
  3. 基本的にLasagneとChainerだと、GPUベースだとどっちを使っても良いと思います。
  4. tensorflowのCPUは比較的高速で、chainerは遅かった。tensorflowだけ8threadで動作しているだけかもしれませんが。。。。

結論

Chainerのcupyによる拡張と書きやすさ。個人的にはこれが気に入っています。
レイヤーをコンストラクタとして、与えて、学習ができれば更に使い勝手がよくなると思います。
(イメージとしてはscikit-learnでしょうか。)