Deeplearning4j 入門

E8e0c87ab27a0de29aaa3d7c574c59e2?s=47 benjamin
October 30, 2016

Deeplearning4j 入門

ビッグデータ分析技術勉強会で発表した内容です。
http://futureofdata.connpass.com/event/40079/

E8e0c87ab27a0de29aaa3d7c574c59e2?s=128

benjamin

October 30, 2016
Tweet

Transcript

  1. Deeplearning4jの概要 with 野球 Hack 2016.10.24 ビッグデータ分析技術勉強会 株式会社アットウェア 三嶋拓

  2. 発表へのモチベーション KaggleのサイトにMLBの試合データがありますよ。野球なら大体の人 が抵抗なく取り組めるドメイン だと思います。 僕は野球の試合とか全然見ないですが大丈夫ですかね。流行りの Deeplearningで一発当てるとかは夢がありますが。 そこは野球に詳しい人に助けてもらってください。あと、そんな簡単に うまくいかないと思いますが、やるなら Deeplearning4jとか素振りし てもらえると助かります。投球を系列データとして扱って

    RNNで学習 するのを目標にするとか。 なるほど...... 機械学習に取り組みやすいかつ面白いデータないかなー。
  3. ということで • 機械学習を勉強するための身近なネタを投稿して 界隈を盛り上げたい! • Pythonのライブラリが凄く使えるのはよく聞くが それ以外で比較的扱い慣れてる言語や実行環境で 素振りしておきたい! 発表へのモチベーション

  4. 目次 • DL4Jの紹介 ◦ 概要 ◦ MNISTのサンプルコード ◦ RNNのサンプルコード •

    野球Hack ◦ 扱うデータ ◦ 特徴量 ◦ RNNで学習 ◦ 結果 • まとめ • その他
  5. 目次 • DL4Jの紹介 ◦ 概要 ◦ MNISTのサンプルコード ◦ RNNのサンプルコード •

    野球データ解析 ◦ 扱うデータ ◦ 特徴量 ◦ RNNで学習 ◦ 結果 • まとめ • その他
  6. DL4J • Javaで実装されたDeeplearningライブラリ • 2014年にSkymindがオープンソースとして公開 • Skymindの創設者の一人Adam Gibsonさん主導で開発 • SparkやHadoop上で動作させることが可能

    • GPUを使った処理が可能 • プロダクションでの運用を意識 • 最新安定版は0.5.0(9/17には0.6.0がリリース)
  7. DL4J 出典:https://www.youtube.com/watch?v=R3lzuXPbybY

  8. DL4J • ND4J ◦ JVM上で動作する科学計算ライブラリ ◦ Numpy for JVM ◦

    DL4Jの計算処理を支えている • DataVec ◦ 機械学習向けのETLライブラリ ◦ データの前処理などに利用する 出典:http://www.slideshare.net/jpatanooga/deep-learning-and-recurrent-neural-networks-in-the-enterprise/17
  9. MNISTの実装例 • おなじみの手書き文字認識のサンプル • 0~9の数字の手書き文字画像のデータセット • 1枚の画像は28 × 28ピクセル •

    学習用60,000サンプル、テスト用10,000サンプル 3 0 4 9 形状や画質に違いがある手書き文字画像から 書かれている数字を判断する 出典:https://deeplearning4j.org/mnist-for-beginners
  10. MNISTの実装例 • Scalaのサンプルコード ◦ https://github.com/kogecoo/dl4j-examples-scala/blob/master/dl4j-example s/src/main/scala/org/deeplearning4j/examples/feedforward/mnist/MLPMni stSingleLayerExample.scala ・ ・ ・

    ・ ・ ・ ・ ・ ・ Denseayer OutputLayer DataSet DataSetIterator MultiLayerNewtork Evaluation DataSet DataSetIterator
  11. MNISTの実装例 ー ネットワークの設定 ー ビルダー・パターンでネットワークを設定

  12. MNISTの実装例 ー ネットワークの設定 ー レイヤを追加 設定完了

  13. MNISTの実装例 ー 学習&評価 ー モデルを初期化 繰り返し学習 テストデータで評価 ND4JのDataSetを 返すイテレータ

  14. MNISTの実装例 ー 実行結果 ー 学習初期 テストデータで評価

  15. MNISTの実装例 ー 学習経過の可視化 deeplearning4j-ui ー • Web UIが立ち上がって学習過程をリアルタイムで可視化できる • 各レイヤのパラメータ

  16. Control Chartの分類の実装例 • Recurrent Neural Network (RNN) ◦ 時系列データを扱いたい場合に適している ◦

    文章の生成、音声認識、etc...
  17. • Scalaのサンプルコード ◦ https://github.com/kogecoo/dl4j-examples-scala/blob/master/dl4j-example s/src/main/scala/org/deeplearning4j/examples/recurrent/seqClassification /UCISequenceClassificationExample.scala Control Chartの分類の実装例 Time Series

    (sequence) Input Hidden Layer Output Layer Normal Cyclic Increasing Trend Decreasing Trend Upward Shift Downward Shift
  18. • 入力は サンプル数 × feature数 × sequenceの長さ の3次元をもつDataSet • DataSetの中には

    label、feature、label mask、feature mask を持つ • labelやfeatureなどは INDArrayとして表される 出典:https://deeplearning4j.org/usingrnns Control Chartの分類の実装例
  19. 出典:https://deeplearning4j.org/usingrnns Control Chartの分類の実装例 Many to Many Many to Many One

    to Many Many to One • データの性質や解きたい問題に応じてデータの構造を変える 画像への見出しづけ 自然言語処理 文章の生成 感情分析
  20. 出典:https://deeplearning4j.org/usingrnns Control Chartの分類の実装例 • 各データの構造に応じてMaskを用意 • Maskはsequenceの長さと同じ長さを持つ配列 • Maskが0の部分は学習や評価に使われない •

    時系列のデータは準備が少し面倒だが、この辺りの面倒なことを引き受けてくれる クラスが用意されている
  21. Control Chartの分類の実装例 • SequenceRecordReaderDataSetIterator ◦ データ構造の調整や Maskの作成など面倒なことを引き受けてくれる ◦ サンプル毎にsequneceの長さが異なっていても調整してくれる •

    分類したいラベルは 0始まりのインデックス ◦ 上記のIteratorがone-hot-encodingされたベクトルに変換してくれる • labelとfeatureは別々のファイルでも一緒のファイルでもどちらでも良いが できることが異なってくる
  22. Control Chartの分類の実装例 隠れ層にLSTMを 指定 出力層を指定

  23. Control Chartの分類の実装例 epoch毎にイテレータをリセットする

  24. Control Chartの分類の実装例 学習初期 学習終了時点

  25. ここまでのまとめ • サンプル自体は簡単に動かせる • DL4Jではビルダー・パターンを使ってネットワークを組み立てる • ネットワークを組み立てるときは使用したいニューラルネットワークに対応したクラ スを指定する • 評価結果を簡単に確認することができるメソッドが用意されている

    • 時系列データを扱う場合はデータ構造に注意
  26. 目次 • DL4Jの紹介 ◦ 概要 ◦ MNISTのサンプルコード ◦ RNNのサンプルコード •

    野球データ解析 ◦ 扱うデータ ◦ 特徴量 ◦ RNNで学習 ◦ 結果 • まとめ • その他
  27. 野球Hack ー やりたいこと ー • ある投手が次に投げる球種を予測したい • 予測してお金儲けシミュレーションとかできると面白そうだと 思った •

    キャッチャーの気持ちになってどうやってピッチングをリードす るかを考える
  28. 野球Hack ー MLBAMのデータ ー • Shinichi-Nakagawa/pitchpx ◦ https://github.com/Shinichi-Nakagawa • MLBAMが公開している野球の試合データを収集できる

    pythonライブラリ • PITCHf/xのデータも含まれている
  29. 野球Hack ー MLBAMのデータ ー 投球開始前の走者位置 ex) ___ , 1__ ,

    _2_ , __3 , 123 アウトカウント 球種 ゾーン [1-9,12-14] 投球判定 ex) S, B ボール/ストライクカウント ex) SBSX 投球判定詳細 ex) strike out, swing out 試合年月 yyyy 試合年月 MM 試合年月 dd イニングカウント ピッチャーのMLB ID バッターのMLB ID バッターの利き手 L or R ピッチャーの利き手 L or R 投球開始後の走者位置 ex) ___ , 1__ , _2_ , __3 , 123 投球判定履歴 球種履歴 レギュラーシーズンフラグ プレーオフフラグ 球場ID 球場名 球場場所 本塁からみたピッチャーの位置 本塁からピッチャーまでの距離 [40,50,55] 本塁(ホームプレートの先端)に到達した時の球速 ストライクゾーンの上端 ストライクゾーンの下端 球が本塁に達した時の中央からの距離 球が本塁に達した時の地上からの高さ リリースポイント リリース直後の球速 リリース時の球速 リリース時の球の加速度 回転方向 0 ~ 360 投げた直後の回転速度 break lengthから本塁までの距離 BRK量につかう距離の最大最 PFX量の左右のブレ PFX量の上下のブレ
  30. 野球Hack ー 予測に使う特徴量 ー • 投手に関する特徴量 ◦ 投手の球種配分(過去1年分から計算) ▪ 例)

    ストレート:70%、カーブ:20%、スライダー:10%など ◦ 投手のコース配分(過去1年分から計算) ▪ コースを9分割してそれぞれのコースへの投球割合を計算 • 打者に関する特徴量 ◦ コース毎の打率 ▪ コースを9分割して打率を計算(過去1年分から計算) ◦ 球種毎の打率(過去1年分から計算) ◦ カウント毎の打率 • ボール、ストライクのカウント • アウトカウント • ベース上のランナー
  31. 野球Hack ー 予測したい球種(ラベル) ー CH チェンジアップ CU カーブ EP スローボール FA ストレート FF フォーシームのストレート FT ツーシームのストレート

    FS ファーストボール FC カットボール SI  シンカー SL スライダー KC ナックルカーブ KN ナックルボール
  32. 野球Hack • Apache Zeppelinでピッチャー毎の球種配分を見てみる ◦ ストレート(青色)の割合が比較的多い傾向にある 2014年のデータ1年分 2015年のデータ1年分

  33. 野球Hack • MLBAMのデータは2007年〜2015年のものを取得 ◦ 全部で400万レコード ◦ このうち、一年毎に投手/打者の情報をサマリー ◦ 投手/打者の組み合わせが合う分だけを取得 •

    打席をsequenceの単位としてファイルごとに分割 • 2014年のデータで学習 • 2015年のデータで評価 • Accuracyのベースライン ◦ 球種を全てストレートと予測した場合 ◦ テストデータ中のストレートの割合:0.435
  34. 野球Hack ー 学習の条件 ー • 特徴量:92次元 • 学習データ:約117,000打席 (ビッグじゃなくてすいません) •

    評価データ:約145,000打席 • Control Chartと同じネットワーク • LSTMのユニット数を64に設定
  35. 野球Hack ー 結果 ー • drop outを入れたり、パラメータを変えたりしたが 上記が限界でした...... epochs Accuracy

  36. 野球Hack ー 結果 ー ちなみに Keras + Theano で Elman

    Net を組むと epochが50回でAccuracyが約0.686 同様にLSTMを組むと epochが50回でAccuracyが約0.737 ただし、学習データに対してもテストデータに対しても Accuracyがそんなに高くないため、特徴量が全然足りていないと思う
  37. 目次 • DL4Jの紹介 ◦ 概要 ◦ MNISTのサンプルコード ◦ RNNのサンプルコード •

    野球データ解析 ◦ 扱うデータ ◦ 特徴量 ◦ RNNで学習 ◦ 結果 • その他 • まとめ
  38. 今後のロードマップなど • 今秋予定のアップデート ◦ ScalNet Scala API ▪ Kerasライクの高レベルAPIが使えるようになる ▪

    https://github.com/deeplearning4j/ScalNet ◦ Kerasの設定ファイルをロードできるようになる ▪ Kerasで試したものからの移行がしやすい ▪ 他のAPIに切り替えた時もコードの変更が少ない ◦ Convalutional Generative Adversarial Networks ▪ 画像の自動生成で有名 ▪ http://www.slideshare.net/DaisukeOkanohara/dnn-62218756/12 ◦ モデルのinterpretabilityの向上 ▪ Listenerで収集されるモデルのパラーメータやスコアのなどが充実する
  39. DL4J on Sparkについて • dl4j-spark-mlはabandoned • つまづいても情報がほとんど見つからない • 環境構築でつまづいた時に幾つか参考になる日本語のサイトがあった ◦

    http://amaya382.hatenablog.jp/entry/2016/06/04/202149 ◦ http://anopara.net/2016/09/14/deeplearning4jの問題点とkerasの使い勝手/ ◦ ライブラリの依存関係 • Spark2.0には対応していない(暫くはないとAdam Gibsonさんがgitterで公言) • 時系列データはファイルごとにsequeneが分かれていると、Sparkでファイルをパー ティションの単位にしてくれるのでデータが扱いやすい • Sparkで先にデータを作っておくか、DL4J側で作るか ◦ DataVecがあるのでDL4J側でも良さそう • DataSetIteratorがSparkで使えそうなものがない ◦ シングルマシンで試した後はコードに変更が入る ◦ Many-to-Manyのケースは対応していなかった • パラメータチューニングは時間がかかるのでGrid Searchを使ってSpark&GPU環 境で動かせた方が捗る
  40. まとめ • JavaやScalaでDeeplearningをやってみたいならDL4J一択ではあるが、まだお 手軽に実装できるという感覚はないので、モデル作りを試すのはpythonのフレーム ワークを使ったほうが効率的かもしれない • サンプル自体は結構あるし、ドキュメントも豊富なのでやり通すだけでもためにはな りそう • Scala

    DSLを使ってKerasライクに手軽にコードを書けるScalNetを開発中のような ので今後に期待したい • 最新の0.6.0になってもSpark上で動かすだけでも一苦労があったのでまだ十分に 利用できるとは言えない • 困ったらgitterで過去の質問履歴をみるか直接質問する
  41. 参考資料など • DL4Jのgitter ◦ https://gitter.im/deeplearning4j/deeplearning4j • ニューラルネットワークで時系列データの予測を行う Qiita ◦ http://qiita.com/icoxfog417/items/2791ee878deee0d0fd9c

    • わかるLSTM ~最近の動向と共に~ Qiita ◦ http://qiita.com/t_Signull/items/21b82be280b46f467d1b • sbtを使ってDeeplearning4jをSparkで動かす ◦ http://amaya382.hatenablog.jp/entry/2016/06/04/202149 • Deeplearning4Jの問題点とKerasの使い勝手 ◦ http://anopara.net/2016/09/14/deeplearning4jの問題点とkerasの使い勝手/
  42. 参考資料など • SeanLahman ◦ http://www.seanlahman.com/baseball-archive/statistics/ ◦ 選手のセイバーメトリクスなどのマスタデータ ◦ 選手の強さごとにグルーピングやフィルタしたい場合に利用 •

    野球関連指標解説 ◦ http://baseballconcrete.web.fc2.com/glossary.html#rc • 野球英語用語集 ◦ http://baseballmonster.nobody.jp/word/english/az.html • pitch speed vs spin deflection angle ◦ https://fastballs.files.wordpress.com/2010/05/soria_speed_vs_spin_force. jpg • PITCHf/x - Wikipedia ◦ https://ja.wikipedia.org/wiki/PITCHf/x • Break versus Movement ◦ http://baseballanalysts.com/archives/2009/09/break_versus_mo.php
  43. ベンチマーク 出典:http://www.slideshare.net/SparkSummit/which-is-deeper-comparison-of-deep-learning-frameworks-on-spark/17

  44. DL4Jのgitter 出典:https://gitter.im/deeplearning4j/deeplearning4j