Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deeplearning4j 入門

benjamin
October 30, 2016

Deeplearning4j 入門

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

benjamin

October 30, 2016
Tweet

More Decks by benjamin

Other Decks in Technology

Transcript

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

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

    野球データ解析 ◦ 扱うデータ ◦ 特徴量 ◦ RNNで学習 ◦ 結果 • まとめ • その他
  3. DL4J • ND4J ◦ JVM上で動作する科学計算ライブラリ ◦ Numpy for JVM ◦

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

    学習用60,000サンプル、テスト用10,000サンプル 3 0 4 9 形状や画質に違いがある手書き文字画像から 書かれている数字を判断する 出典:https://deeplearning4j.org/mnist-for-beginners
  5. • 入力は サンプル数 × feature数 × sequenceの長さ の3次元をもつDataSet • DataSetの中には

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

    to Many Many to One • データの性質や解きたい問題に応じてデータの構造を変える 画像への見出しづけ 自然言語処理 文章の生成 感情分析
  7. Control Chartの分類の実装例 • SequenceRecordReaderDataSetIterator ◦ データ構造の調整や Maskの作成など面倒なことを引き受けてくれる ◦ サンプル毎にsequneceの長さが異なっていても調整してくれる •

    分類したいラベルは 0始まりのインデックス ◦ 上記のIteratorがone-hot-encodingされたベクトルに変換してくれる • labelとfeatureは別々のファイルでも一緒のファイルでもどちらでも良いが できることが異なってくる
  8. 目次 • DL4Jの紹介 ◦ 概要 ◦ MNISTのサンプルコード ◦ RNNのサンプルコード •

    野球データ解析 ◦ 扱うデータ ◦ 特徴量 ◦ RNNで学習 ◦ 結果 • まとめ • その他
  9. 野球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量の上下のブレ
  10. 野球Hack ー 予測に使う特徴量 ー • 投手に関する特徴量 ◦ 投手の球種配分(過去1年分から計算) ▪ 例)

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

    FS ファーストボール FC カットボール SI  シンカー SL スライダー KC ナックルカーブ KN ナックルボール
  12. 野球Hack • MLBAMのデータは2007年〜2015年のものを取得 ◦ 全部で400万レコード ◦ このうち、一年毎に投手/打者の情報をサマリー ◦ 投手/打者の組み合わせが合う分だけを取得 •

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

    評価データ:約145,000打席 • Control Chartと同じネットワーク • LSTMのユニット数を64に設定
  14. 野球Hack ー 結果 ー ちなみに Keras + Theano で Elman

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

    野球データ解析 ◦ 扱うデータ ◦ 特徴量 ◦ RNNで学習 ◦ 結果 • その他 • まとめ
  16. 今後のロードマップなど • 今秋予定のアップデート ◦ 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で収集されるモデルのパラーメータやスコアのなどが充実する
  17. 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環 境で動かせた方が捗る
  18. まとめ • JavaやScalaでDeeplearningをやってみたいならDL4J一択ではあるが、まだお 手軽に実装できるという感覚はないので、モデル作りを試すのはpythonのフレーム ワークを使ったほうが効率的かもしれない • サンプル自体は結構あるし、ドキュメントも豊富なのでやり通すだけでもためにはな りそう • Scala

    DSLを使ってKerasライクに手軽にコードを書けるScalNetを開発中のような ので今後に期待したい • 最新の0.6.0になってもSpark上で動かすだけでも一苦労があったのでまだ十分に 利用できるとは言えない • 困ったらgitterで過去の質問履歴をみるか直接質問する
  19. 参考資料など • 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の使い勝手/
  20. 参考資料など • 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