Azarashi Tech Blog

日常における日常的なことやテクノロジー的なこと

MFT2018向けダーツスキル解析(3)

前回

  • 指および体の動きの時系列データを正規化して2Dの時空間マップにしました。

今回

  • 時空間マップからスコアを推定するDeep Neural Network(DNN)をいくつか作り、学習させ、収束するかみてみます。
  • 結論から言って、途中までやって「お、うまくいくんではないか?」と思ったら、案外「うまくいってなかったなぁ・・・」っていう結果です。

学習環境

  • GPU : GTX780Ti

    • 新入社員のときに買ったけど、随分時代遅れになっちゃったなぁ・・・
  • 学習フレームワーク : Keras

    • BackendはTensorflow

方針

  • 今回は、まずシンプルなFully-Connected層だけで構成されたモデルを試します。
    1. fingerデータ(指の動き・指圧の時系列データ)から、スコアを推定するDNN①を作る
    2. bodyデータ(各関節位置の時系列データ)から、スコアを推定するDNN②を作る
    3. DNN①とDNN②の中間層を統合してスコアを推定するDNN③を作る
  • ちなみに「時系列データを扱うならRNNかLSTM使うの?」と思われるかもしれませんが、今回入力は連続値ですが固定長で、しかも出力は1つですので、すごいシンプルなため、使う必要はないと判断しています。

fingerデータからスコア推定トライ

fingerデータからスコア推定モデル(シンプル)

  • 以下のようなモデルを作り、学習してみる。
    • Fully Connectedレイヤを3つくっつけただけ。

f:id:surumetic-machine-83:20180802114844p:plain

学習結果

  • とりあえず、SGDとAdamで10000エポック学習して見た。
  • SGDはかなりlossが小さくなるけどvalが悪くなってるので、過学習気味。
  • Adamはloss: 0.0378 - val_loss: 0.0374止まりだけど、valと同等で、収束がかなり早い模様。

SGD (Learning Rate = 0.01, Momentum= 0.9) f:id:surumetic-machine-83:20180802125312p:plain

Adam (lr=0.01, beta_1=0.9, beta_2=0.999, decay=0.0) f:id:surumetic-machine-83:20180802125531p:plain

ふむ、で結局、fingerデータだけで、どのくらい的中できるの?

  • 今回のlossは、mean_squared_errorとなっている。なので、これにsqrtかければ、RMSEになる。
  • RMSEにすれば、元の単位系と比較しても問題ないはず。
  • 今回の場合、ADAMで試した結果を使うとして、sqrt(0.0374) = 0.194。大体誤差±0.2ポイントくらいってことかな。
  • もしかすると、インブルかブルかは見分けられないけど、もしかしたらブルかそれ以外は0.5ポイント差があるので、区別できるかもしれない。

fingerデータからのスコア推定に関する考察

  • テキトーなわりにいい感じでは。思ったよりfigerデータには情報量があるかもしれない。
  • もしくは、一部のデータの偏りが大きいから、マジョリティに寄る出力を出しているだけなのかもしれない。

bodyデータからスコアの推定トライ

bodyデータからスコア推定モデル(シンプル)

  • bodyについても、同じくシンプルなモデルで学習させてみる。
  • fingerよりも次元が多いので、気持ち中間層多めに作ってみた。

f:id:surumetic-machine-83:20180802133832p:plain

学習結果

  • fingersデータでうまくいったAdamで実施
  • learning rate=0.001で結構いい感じに収束した。

Adam (lr=0.001, beta_1=0.9, beta_2=0.999, decay=0.0) f:id:surumetic-machine-83:20180802143031p:plain

  • ちなみにlearning rate(=lr)が、fingersのときにはここでは0.001にしてある。これが0.01のままだと、lrが小さすぎるがために全然学習が進まない。

Adam (lr=0.01, beta_1=0.9, beta_2=0.999, decay=0.0) f:id:surumetic-machine-83:20180802144222p:plain

  • 逆にもっとlrを小さくすると、下図のように過学習して変な風になった。調整難しいなぁ。

Adam (lr=0.0001, beta_1=0.9, beta_2=0.999, decay=0.0) f:id:surumetic-machine-83:20180802143336p:plain

bodyデータからのスコア推定に関する考察

  • bodyデータの学習でのval_lossの収束時の値も、ほぼ0.0374で、fingersによる結果と同じだった。sqrt(0.0374) = 0.194。大体誤差±0.2ポイント。
  • fingersとbodyによる推定結果にほとんど差がないことがわかった!と言ってもいいかな?と一瞬思ったが、それはないだろう。
  • データのバイアスがありすぎて、そっちのほうこうによった値をテキトーに出力するDNNができあがってしまった気がしている。

finger+bodyデータからスコアの推定トライ

  • finger, bodyともにだいたい同じ誤差に収束している感じがかなりあやしいが・・・何はともあれ、DNN③を作って学習してみる。
    • まぁとにかく、今回は最後まで走り抜けます。
  • 理想的には、finger単体、body単体よりも良い結果となってほしいが・・・

fingers+bodyデータからスコア推定モデル(シンプル)

  • 前節までで説明していたモデルを、最終出力層を除いて、単純にもってきて、後段を2つのFully-Conncectedでくっつけたモデルですね。

f:id:surumetic-machine-83:20180802150845p:plain

学習結果

  • Adamでlr=0.0001で学習。
  • 今までで学習したfingersデータによるスコア推定DNNと、bodyデータによるスコア推定DNNの学習済みのパラメータをロードして、事前学習させた状態から学習を開始させました。
  • 結果は下図の通り。学習開始時点から、ほとんど値が変化していない。収束したときの値はまさしく、finger単体およびbody単体と同等の結果・・・。ううううう・・・。

f:id:surumetic-machine-83:20180802155259p:plain

finger+bodyデータからのスコア推定に関する考察

  • はい、これは間違いなくデータのバイアスか何かが悪さしていて、まともに学習しきれていないですね。
  • データを洗いなおして出直しますか。

まとめ

  • うまくいったかな?と思いましたが甘かったですね。
  • モデルの見直しだけなく、学習データの見直しをしないといけないですね。
  • 最近書いてるブログが本当にただのメモで、説明が下手すぎて誰にも理解されないレベルかもしれません。そのうちきちんとまとめよう。

次回

  • 一旦、今回作ったモデルでどの程度の性能か検証
  • 学習データのなかで、ある数値にバイアスがでていて学習に悪影響を及ぼしていないかチェックする。
  • うまくいったら、ハイパーパラメータチューニングを試す。