AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

ML-Agents 1バウンドOKのTennisの1000万回学習結果

一晩学習させて1000万ステップいきましたが、1バウンドOKなのに結局バドミントンみたいになってました
f:id:yasu9780:20201016094534g:plain

0から学習の様子を眺めて、分かったのが、学習の流れが、

  1. サーブすらできない
  2. サーブができるようになる
  3. サーブリターンができるようになる
  4. サーブリータンを打ち返して相手の背後に落とせる(ロブ)
  5. 互いにノーバウンドで打ち返すのが基本になる

サーブができないうちは、サーブを打ち返す練習ができないので、サーブができるようになった直後は、サーブを打ち返せない
サーブが打ち返せるようになると、打ち返しを打ち返す練習がまだできてないので、サービスエースばかり決まる
自己対戦なので、一つ習得すると、そこで停滞して、突破すると、またそこで停滞して
みたいに階段状に学習していく

サーブをノーバウンドで上からたたきつけるようになるのは、単にラケットが上まで上がりすぎるからと思う
水平面の移動は制限があるけど、垂直面は制限ないんで、人間なら5メートルの位置から叩きつける感じになって、
まるでバレーボールのブロックみたいな感じになってる
垂直移動を制限すれば、もうちょっとテニスに近づくんじゃないか? と思った

しかし、今の段階って、このテニスは2次元移動しかできないんですよね、実は
Z軸の移動も可能にして3次元にしたら学習収束がどれだけ遅くなるのかな?
あと学習の入力要素として、自分の位置・速度+ボールの位置・速度なんで、相手の位置を見ていないので、
本来、良い位置に打ち返すには、相手の位置も見る必要があると思う。

コンピュータ将棋なんて学習に一ヵ月かけて、あげく学習失敗なんてしてたから、一晩で行けるならまだマシですね
CUDAって手もあるし(さて何を買おうかな? レイトレには興味ないんでGTX1080かな?)
これだって評価関数は深層学習なんで凄いなあと。

機械学習の注意点

  1. 単純な環境の学習から始める(障害物は1個から、3次元の前に2次元で試す)
  2. 注意深くコーディングする(バグってても機械学習はそれなりに動く)
  3. 途中経過にも報酬を与える(副作用に注意)

今回は、勝つだけじゃなくて、相手のコート内に打ち込んだら報酬0.1を与えました
が、相手のは報酬-0.1にしてません。コートに打ち込まれてもそれは普通だからです
あと、サーブ失敗は報酬-1ですが、相手に+1してません
もし+1すると、相手がサーブ失敗してる間のランダムウォークに加点してしまうからです。
サーブ失敗は敵はなんら貢献してません。自業自得です

www.youtube.com