Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

DL4J ● Javaで実装されたDeeplearningライブラリ ● 2014年にSkymindがオープンソースとして公開 ● Skymindの創設者の一人Adam Gibsonさん主導で開発 ● SparkやHadoop上で動作させることが可能 ● GPUを使った処理が可能 ● プロダクションでの運用を意識 ● 最新安定版は0.5.0(9/17には0.6.0がリリース)

Slide 7

Slide 7 text

DL4J 出典:https://www.youtube.com/watch?v=R3lzuXPbybY

Slide 8

Slide 8 text

DL4J ● ND4J ○ JVM上で動作する科学計算ライブラリ ○ Numpy for JVM ○ DL4Jの計算処理を支えている ● DataVec ○ 機械学習向けのETLライブラリ ○ データの前処理などに利用する 出典:http://www.slideshare.net/jpatanooga/deep-learning-and-recurrent-neural-networks-in-the-enterprise/17

Slide 9

Slide 9 text

MNISTの実装例 ● おなじみの手書き文字認識のサンプル ● 0~9の数字の手書き文字画像のデータセット ● 1枚の画像は28 × 28ピクセル ● 学習用60,000サンプル、テスト用10,000サンプル 3 0 4 9 形状や画質に違いがある手書き文字画像から 書かれている数字を判断する 出典:https://deeplearning4j.org/mnist-for-beginners

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

MNISTの実装例 ー ネットワークの設定 ー ビルダー・パターンでネットワークを設定

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Control Chartの分類の実装例 ● Recurrent Neural Network (RNN) ○ 時系列データを扱いたい場合に適している ○ 文章の生成、音声認識、etc...

Slide 17

Slide 17 text

● 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

Slide 18

Slide 18 text

● 入力は サンプル数 × feature数 × sequenceの長さ の3次元をもつDataSet ● DataSetの中には label、feature、label mask、feature mask を持つ ● labelやfeatureなどは INDArrayとして表される 出典:https://deeplearning4j.org/usingrnns Control Chartの分類の実装例

Slide 19

Slide 19 text

出典:https://deeplearning4j.org/usingrnns Control Chartの分類の実装例 Many to Many Many to Many One to Many Many to One ● データの性質や解きたい問題に応じてデータの構造を変える 画像への見出しづけ 自然言語処理 文章の生成 感情分析

Slide 20

Slide 20 text

出典:https://deeplearning4j.org/usingrnns Control Chartの分類の実装例 ● 各データの構造に応じてMaskを用意 ● Maskはsequenceの長さと同じ長さを持つ配列 ● Maskが0の部分は学習や評価に使われない ● 時系列のデータは準備が少し面倒だが、この辺りの面倒なことを引き受けてくれる クラスが用意されている

Slide 21

Slide 21 text

Control Chartの分類の実装例 ● SequenceRecordReaderDataSetIterator ○ データ構造の調整や Maskの作成など面倒なことを引き受けてくれる ○ サンプル毎にsequneceの長さが異なっていても調整してくれる ● 分類したいラベルは 0始まりのインデックス ○ 上記のIteratorがone-hot-encodingされたベクトルに変換してくれる ● labelとfeatureは別々のファイルでも一緒のファイルでもどちらでも良いが できることが異なってくる

Slide 22

Slide 22 text

Control Chartの分類の実装例 隠れ層にLSTMを 指定 出力層を指定

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

野球Hack ー やりたいこと ー ● ある投手が次に投げる球種を予測したい ● 予測してお金儲けシミュレーションとかできると面白そうだと 思った ● キャッチャーの気持ちになってどうやってピッチングをリードす るかを考える

Slide 28

Slide 28 text

野球Hack ー MLBAMのデータ ー ● Shinichi-Nakagawa/pitchpx ○ https://github.com/Shinichi-Nakagawa ● MLBAMが公開している野球の試合データを収集できる pythonライブラリ ● PITCHf/xのデータも含まれている

Slide 29

Slide 29 text

野球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量の上下のブレ

Slide 30

Slide 30 text

野球Hack ー 予測に使う特徴量 ー ● 投手に関する特徴量 ○ 投手の球種配分(過去1年分から計算) ■ 例) ストレート:70%、カーブ:20%、スライダー:10%など ○ 投手のコース配分(過去1年分から計算) ■ コースを9分割してそれぞれのコースへの投球割合を計算 ● 打者に関する特徴量 ○ コース毎の打率 ■ コースを9分割して打率を計算(過去1年分から計算) ○ 球種毎の打率(過去1年分から計算) ○ カウント毎の打率 ● ボール、ストライクのカウント ● アウトカウント ● ベース上のランナー

Slide 31

Slide 31 text

野球Hack ー 予測したい球種(ラベル) ー CH チェンジアップ CU カーブ EP スローボール FA ストレート FF フォーシームのストレート FT ツーシームのストレート FS ファーストボール FC カットボール SI  シンカー SL スライダー KC ナックルカーブ KN ナックルボール

Slide 32

Slide 32 text

野球Hack ● Apache Zeppelinでピッチャー毎の球種配分を見てみる ○ ストレート(青色)の割合が比較的多い傾向にある 2014年のデータ1年分 2015年のデータ1年分

Slide 33

Slide 33 text

野球Hack ● MLBAMのデータは2007年〜2015年のものを取得 ○ 全部で400万レコード ○ このうち、一年毎に投手/打者の情報をサマリー ○ 投手/打者の組み合わせが合う分だけを取得 ● 打席をsequenceの単位としてファイルごとに分割 ● 2014年のデータで学習 ● 2015年のデータで評価 ● Accuracyのベースライン ○ 球種を全てストレートと予測した場合 ○ テストデータ中のストレートの割合:0.435

Slide 34

Slide 34 text

野球Hack ー 学習の条件 ー ● 特徴量:92次元 ● 学習データ:約117,000打席 (ビッグじゃなくてすいません) ● 評価データ:約145,000打席 ● Control Chartと同じネットワーク ● LSTMのユニット数を64に設定

Slide 35

Slide 35 text

野球Hack ー 結果 ー ● drop outを入れたり、パラメータを変えたりしたが 上記が限界でした...... epochs Accuracy

Slide 36

Slide 36 text

野球Hack ー 結果 ー ちなみに Keras + Theano で Elman Net を組むと epochが50回でAccuracyが約0.686 同様にLSTMを組むと epochが50回でAccuracyが約0.737 ただし、学習データに対してもテストデータに対しても Accuracyがそんなに高くないため、特徴量が全然足りていないと思う

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

今後のロードマップなど ● 今秋予定のアップデート ○ 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で収集されるモデルのパラーメータやスコアのなどが充実する

Slide 39

Slide 39 text

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環 境で動かせた方が捗る

Slide 40

Slide 40 text

まとめ ● JavaやScalaでDeeplearningをやってみたいならDL4J一択ではあるが、まだお 手軽に実装できるという感覚はないので、モデル作りを試すのはpythonのフレーム ワークを使ったほうが効率的かもしれない ● サンプル自体は結構あるし、ドキュメントも豊富なのでやり通すだけでもためにはな りそう ● Scala DSLを使ってKerasライクに手軽にコードを書けるScalNetを開発中のような ので今後に期待したい ● 最新の0.6.0になってもSpark上で動かすだけでも一苦労があったのでまだ十分に 利用できるとは言えない ● 困ったらgitterで過去の質問履歴をみるか直接質問する

Slide 41

Slide 41 text

参考資料など ● 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の使い勝手/

Slide 42

Slide 42 text

参考資料など ● 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

Slide 43

Slide 43 text

ベンチマーク 出典:http://www.slideshare.net/SparkSummit/which-is-deeper-comparison-of-deep-learning-frameworks-on-spark/17

Slide 44

Slide 44 text

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