Deeplearning4jのScalaサンプルを最速で動かす

というわけで、遊んで暮らすために経済指標が上がるか下がるかを推測する人工知能を作りたいと思います。

最速で、とか書いてる割には前置きが長いので、すぐ試したい方は「サンプルを動かす」のところから読んでください。

TensorFlowについて

しばらくTensorFlowを使っていましたが、結局サンプルをちょっと改変したプログラム以上のものは作れませんでした。なんというか、インタフェースが低レベルすぎてモデル構築一つやるのもしんどいです。私は人工知能の研究がしたいのではなく、単に人工知能の応用をやりたいというだけなので、もうちょっと高級なAPI、具体的にはレイヤー1がConvolutionでレイヤー2がPoolingで…というのを指定していく程度の簡便さで使いたい。でもTensorFlowはそういうAPIは用意してくれない。

もうちょっと時間が経てばそういうTensorFlow用のラッパが出来上がったりするかもしれないけど。

Deeplearning4jについて

1年以上前からDL4Jの存在は知ってました。当時はなんか公式サイトもダサく、本当にメンテしてんのかな?という印象でした。サンプルを動かしてみると謎なエラーが出てきて全く動かない。その時点でやる気が失せました。

そもそもDeeplearning4jはJava向けのライブラリなのでScalaから使える、という点でメリットを感じてやろうと思い立ったのですが、Scalaコミュニティからも機械学習コミュに低からもDL4Jの話は全然聞かず、これ手出したら地雷原しか存在しないパターンなんじゃ…と思っていました。

ScalaMatsuriでもoeさんがDL4Jのデモを見せてくれまして、そのとき「GPUサポートがされてない」という話をされてたのを記憶しており、「GPU未サポートで機械学習って正気かよ…」と思ってました。

が、最近改善されたのか、そもそも上記の発言が聞き間違いだったのか、公式サイトを見たら普通にGPUに対応してるどころかHadoop/Sparkにも対応してて分散GPUも余裕だぜ、みたいなことが書いてあるうえにロードマップを見るとND4J(Numpyライクな数値演算ライブラリ)のOpenCLサポートが予定されており、AMD好きな私としては株価急上昇って感じで改めてチャレンジすることとしました。

DL4Jは何が良いのか、他とどう違うのか

Deep Learning Comp Sheet: Deeplearning4j vs. Torch vs. Theano vs. Caffe vs. TensorFlow

上記のような気合が入ったページが用意されていました。個人的に気になった文言を抽出してみると、

  • DL4Jは工学にフォーカスしていて商用サポートもあり、分散処理をも考慮してる
  • TensorFlowはDeepLearningにフォーカスしていてその他のアルゴリズムのサポートがうすい
  • TensorFlowのゴールはリクルートっぽい
  • ND4JはNumpyの少なくとも2倍速い
  • Java自体がPythonより速い
  • Javaの方が汎用性あるよね
  • と言ってもJavaは科学計算ライブラリでまともなものがないから、そこはND4Jを頑張るよ
  • Scalaに注目してる。なぜならばScalaはデータサイエンスの次期主力言語になる可能性を占めてるから
  • Skymindという会社でサポートしてる

Gitterもあったので覗いてみると結構盛り上がってた。

個人的に、「工学(engineering)にフォーカスしている」という言葉は心強い。あとScalaを重要視してくれるというところも好印象。

あと何故か日本語ページが存在する。

DL4Jのロードマップ

Deeplearning4j Roadmap

こっちも気になったところを抽出すると…。

まず、先に述べたようにOpenCLサポートが予定されている。medium priorityではあるらしいが。あとはHyperparameter optimizationというのもある。あとは「あるといい」という分類ではあるが、なんとPythonサポートというのがある。競合がたくさんあるPythonの世界に入っていくメリットはあるのか?というのは疑問だが…。

サンプルを動かす

Linuxの場合

まず、Java 8以降 64bit版を入れます。OpenJDKでも動きます。入れ方は省略します。

$ java --version

でバージョンを確認してください。

次にsbtをインストールします。パッケージ管理システムからもインストールできますが、古いバージョンだと色々と罠があるのでsbtは面倒くさがらず最新のバージョンを入れておきましょう。

sbt のインストール

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
sudo apt-get update
sudo apt-get install sbt

ここまではScala使いなら入ってますかね?

そしたらもうサンプルコードを落としてきてコンパイルするだけです。

DL4J Release 0.4 Examples for Scala

$ git clone https://github.com/kogecoo/dl4j-0.4-examples-scala.git

…がもうひとつやることがあります。READMEにも書いてますが、build.sbtの

"org.nd4j" % "nd4j-native" % "0.4-rc3.9"

の行でマシンを指定してください。

"org.nd4j" % "nd4j-native" % "0.4-rc3.9" classifier "" classifier "linux-x86_64"

など。

そしたらプロジェクトのディレクトリで

$ sbt run

すればさまざまなサンプルが列挙されるので実行したいものを選んでください。XORのやつが一番基本的で学習も速いかな?

Windowsの場合

ChocolateyをインストールしてChocolateyからsbtをインストール、その後gitから同じようにソースを落としてREADMEを読みつつbuild.sbtを修正してね(雑)。

次回?

次回があるかどうかわかりませんが、気が向いたらコードの内容を見て解説っぽいことをしていきます。