相談フォーム信頼の「飲んだくれマーク」をご確認下さい。2016年9月14日さて、機械学習ですが、ブログではあんまり書いていないもののしつこくしぶとく続けています。DeepLearning4Jもしばらく使ってみましたが、問題点も良くわかってきました。ND4Jのインタフェース。これをさわるのはかなりしんどいです。例を挙げると、あるテンソルの任意の要素に値を設定する(というか、この0とか1とかで構築したテンソルに後から値を追加していって目的のテンソルを作る、というmutableな使い方自体がすごく気にくわないのだけどそれはNumpyも同じなのでさておき)操作はインデックスを使用して行います。以下がScalaで実際に私が過去書いたコードです。v.toNDArray)まず行列を作って、そのあとで一行ずつデータ(ベクトル)を差し込んでいくような感じですね。ND4JはNumpyのAPIに影響を受けつつ作ったそうですが、ちょっとこのあたりにJavaの言語仕様の限界を感じます。Numpy(Python)だとこんな感じです。0.]])とっても直感的ですね。これだけでもPython系ライブラリを使うメリットはかなりあるんじゃないかという気がしてきます。前述したように、テンソルや行列と言った数学の概念がmutableになってるのがとっても気持ち悪いのですが、その背景にはデカいデータを扱うにはimmutableだとメモリ的にしんどすぎるとか色々理由があると思うのでそこは我慢です。その上に乗ってるDeepLearning4J(DL4J)もまだまだ未実装機能やバグが多いです。何だかんだ言って、まだバージョン0.5が最新のライブラリですからね...。ネット上であされるサンプルもまだ非常に少なく、私のような機械学習初学者にとっては学習を進めていくこと自体がしんどいという欠点もあります。JVMの上で動作するというのはそれだけで大きなメリットなので、もっともっと頑張ってほしいと思います。ND4JもScala向けインタフェースをもっと拡充してほしい。頑張って欲しいと思うもののプロジェクトに貢献したいという気持ちにまで至らないのは私の意識が低いためです。(でも翻訳くらいだったらやってみたいです)ともかく、DL4Jは今後すごく良くなってほしい、Python一辺倒な現状を何とかしてほしいという思いがあるものの、現段階で機械学習を使ったなにかを作りたいという場合にDL4Jだけでは不足というのが残念ながら事実であると思います。そこで新たに学習しようと思ったのがKeras。KerasはDL4JやChainerといったライブラリと同じようにレイヤーを指定してネットワークを構成できる高レベルなAPIをそなえており、「ちょっとした解析をしてみたい」みたいな用途に特化したライブラリとなっています。あと、バックエンドにTheanoとTensorflowの両方を使用できます。それじゃあKerasをやってみましょう。kerasでいけますが、モデルをファイルに保存するときにエラーになり、ちょっとはまりました。以下のように手動でh5pyをインストールする必要があります。わかりませんが、Kerasのdependencyに入っていないみたいです。Ubuntuだとlibhdf5-devをインストールしておかないとコンパイルするときにエラーになりました。h5pyじゃあまずは論理演算(AND)を学習させてみましょう。自分の場合、とりあえず論理演算を学習させてみる癖?があります。分かりやすいので...。model.predict(x)ここでは論理演算をTrueもしくはFalseの2クラス分類問題と扱っています。結果は次のような感じ。左がTrue、右がFalseだと思ってください。0.068]]ちゃんと学習できてますね。XORをやってみましょう。model.predict(x)結果は以下のようになりました。0.500]]全然収束しませんでした。層をもう一つ増やしてみましょう。input_dim=2))model.add(Activation("sigmoid"))model.add(Dense(output_dim=2))model.add(Activation("sigmoid"))とします。0.445]]となりました。あれ?学習できてないですね。epochを40000にしてみましょうか。0.960]]うーん。こんなもんでしょうか。80000にしてみましょう。0.989]]まあこんな感じか。チューニングすれば学習回数も少なく出来るかもしれませんね。Rateを思い切ってもうちょっと高めてみましょう。デフォルトは0.01ですが、0.1に上げてみました。論理演算ごときの学習で過学習も極所解もクソもありません。Rateはoptimizerのパラメータとして与えるみたいです。optimizerを下記のようにしました。rateを10倍ついでにEpoch数も8000にしてみました。単純計算で80000回学習させた時とほぼ同等の結果が出力されるはずです。0.992]]だいたい同じような程度学習できてますね。まとめDL4Jは今後に期待したいところだが、現状DL4Jだけで機械学習の勉強やアプリの実装を進めるのはしんどい。Kerasは簡単に使えて良い。Kerasで様子を見つつ、DL4Jをウォッチしていくのが良さそう。ND4JのScalaラッパーのND4S、がんばれ(他力本願)。MAZDAがわからない。パニックムービーとしてのシン・ゴジラanopara作者:withpop昼はサラリーマン。頑張れば何でも出来る。