Suphx-style reward shaping
エピソードのデフォルトの定義をどうするかがまだ決まってないが(今は選択可)、半荘を1エピソードとするのは流石に無意味なので、1局毎にエピソードとする。 このとき、報酬をどう決めるかが問題になるので、suphx-likeなreward-shapingをする。
GRUが意味がないので、単純に今の点棒状況から回帰する。
- [x] 特徴量を調べる @nissymori
- [x] 少量データでデータ作成をしてみる
- [x] 少量データで回帰を学習してみる
- [x] 学習したモデルをnumpyへ吐き出せるか確認
- [x] データを増やして学習、モデルをコミット
- [ ] モデルを報酬に組み込む
- [ ] この挙動をデフォルトにする
workspace/suphx-reward-shaping の下で作業 @nissymori
特徴量 suphnx論文より
- 持ち点
- 上がり点/失点
- 親
- 本場
- 詰み棒
suphnxでは上記のの情報をGRUに渡しているつまりj局目の場合j組ある. slackでの議論のように現在の情報のみから予測したい.
GRUでは過去の情報の系列から局数, 自風なども推論可能だが一局のみから予測する場合は明示的に特徴量を用意した方がよさそう.
案
- 局終了時の持ち点
- 親
- 本場
- 詰み棒
- 自風
- 局
jaxで学習したモデルをnumpyへ吐き出せるか確認
簡単な例を作って確認. https://colab.research.google.com/drive/1Hn5TADrD7NUHjxo0QqfSUQ8UX_XuPKId?usp=sharing
学習が終わったモデルの重みを
jnp.save("weights.npy", weights)で保存
jnp.load("weights.npy")でロードできる.
loadしたobjectのtypeを確認するとnumpy.ndarrayなので少なくともこの方法でjaxで学習させた重みをnumpyのarrayとして使える.
特徴量 | 前処理方法
- 4人の点 | ÷ 100000
- 自風: one-hot
- 親: one-hot
- 本場: 整数 | ÷ 4
- 詰み棒: 整数 | ÷ 4
- 局: 整数 8以上は全て7にする. | ÷ 7
当初は, 自身の点, 下家, 上家, 対面の順で並べるつもりでしたが, 自風と, 親の情報を与えるので, 順番をあえて指定する必要なはいのではないかと思いました. いったんやってみてダメだったら当初の予定通りやってみようと思います.
target
順位点 ÷ 100
concatenate pattern
- concatしたものをinput
- one-hotだけNNを用意してhidden layer で他の特徴量とconcat
とりあえず1. で良いかなと思っています.
上家とかの並びにするのは重要な気がするけどなあ
上家とかの並びにするのは重要な気がするけどなあ
単純に4人の点/100000だと全くうまくいかないのでこちらに変えます!
変更点
- 特徴量として残りの親の数を追加する.
- 風の情報を
- 出力は4次元[起家, ..ラス親]
- NNは8個用意するmodel_0, ...model_7
procedure
- 南4のデータから順位点をmodel_7に予測させる
- 南3のデータのmodel_7の予測結果をmodel_6に予測させる.
- 以下繰り返す.
ToDo
- [x] 特徴量実装
- [x] 特徴量テスト
- [x] 訓練関数実装
- [x] 訓練関数テスト
- [x] plot関数実装
- [x] plot関数テスト
- [x] コマンドライン整備
- [x] 実験