mjx-project / mjx

Mjx: A framework for Mahjong AI research
https://colab.research.google.com/drive/1m1wOT_K2YFtuV6IO7VgWk4ilVhTKqRFU?usp=sharing
MIT License
170 stars 19 forks source link

train reward shping model #1138

Closed nissymori closed 2 years ago

nissymori commented 2 years ago

1127

nissymori commented 2 years ago

ToDo

nissymori commented 2 years ago

実験に必要な実装は一通り終わったので, 実験を始めていきます.

nissymori commented 2 years ago
スクリーンショット 2022-09-17 13 28 43 スクリーンショット 2022-09-17 13 28 59

南四局の結果です.

sotetsuk commented 2 years ago

いい感じですね。席によって違うかも確認したいですね。ラス親とそうでない人の違いとか。

sotetsuk commented 2 years ago

-135超えちゃってるのが少し気になるな。。。🤔

nissymori commented 2 years ago

-135超えちゃってるのが少し気になるな。。。🤔

そうですよね.... プロット時のデータの渡し方が悪いかもしれないので少し考えてみます!

nissymori commented 2 years ago

スクリーンショット 2022-09-17 22 21 36 スクリーンショット 2022-09-17 22 21 54 スクリーンショット 2022-09-17 22 22 01 スクリーンショット 2022-09-17 22 22 09 スクリーンショット 2022-09-17 22 22 17 明らかにoverfittingしていますが, 1000epochくらいでこんな感じです. データ足りないかも知れません.

nissymori commented 2 years ago

とりあえず, 8局分学習を回してみようと思います!

sotetsuk commented 2 years ago

あれ、なんで1000epochもやるんでしたっけ。。。 Validロスがサチってるんで10とかくらいで止めて良くないですか?!

sotetsuk commented 2 years ago

ブートストラップでの8局全体の流れとりあえずやってもらえると🙏

nissymori commented 2 years ago

あれ、なんで1000epochもやるんでしたっけ。。。 Validロスがサチってるんで10とかくらいで止めて良くないですか?!

傾向として, 少ないepochだとシャープな曲線にならなかったので, 実験的にか学習させてみた感じでした!

8局分の学習はエポック少なめでとりあえずやってみます!

nissymori commented 2 years ago

学習させてみました. prediction_at_round0pos=0 prediction_at_round0pos=1 prediction_at_round0pos=2 prediction_at_round0pos=3 prediction_at_round1pos=0 prediction_at_round1pos=1 prediction_at_round1pos=2 prediction_at_round1pos=3 prediction_at_round2pos=0 prediction_at_round2pos=1 prediction_at_round2pos=2 prediction_at_round2pos=3 prediction_at_round3pos=0 prediction_at_round3pos=1 prediction_at_round3pos=2 prediction_at_round3pos=3 prediction_at_round4pos=0 prediction_at_round4pos=1 prediction_at_round4pos=2 prediction_at_round4pos=3 prediction_at_round5pos=0 prediction_at_round5pos=1 prediction_at_round5pos=2 prediction_at_round5pos=3 prediction_at_round6pos=0 prediction_at_round6pos=1 prediction_at_round6pos=2 prediction_at_round6pos=3 prediction_at_round7pos=0 prediction_at_round7pos=1 prediction_at_round7pos=2 prediction_at_round7pos=3

sotetsuk commented 2 years ago

いいですね!可視化のやつ。同じfigに重ねてもらえると比較しやすいかも? 計4枚になるはず。 やっぱりround7の時点でなんかおかしい気がするんですよね。。。3万超えてるだけで90超えないと思うんですよね

nissymori commented 2 years ago

いいですね!可視化のやつ。同じfigに重ねてもらえると比較しやすいかも? 計4枚になるはず。 やっぱりround7の時点でなんかおかしい気がするんですよね。。。3万超えてるだけで90超えないと思うんですよね

これ対象のプレイヤー以外は全部同じ点数にしてるので2万5千点を少しでも超えるとトップになります. 少しずらすとまた結果変わると思います!

5000ずつくらいずらしてみようかと思います.

sotetsuk commented 2 years ago

点数ずらしてみるのもいいと思いますけど、 3万ちょいで残り全員フラットでも2万点はありますよね。 満ツモで逆転トップなんて全然あるので、やっぱり3万超えてすぐ90超えるのはおかしい気がするんですよね。

nissymori commented 2 years ago

点数ずらしてみるのもいいと思いますけど、 3万ちょいで残り全員フラットでも2万点はありますよね。 満ツモで逆転トップなんて全然あるので、やっぱり3万超えてすぐ90超えるのはおかしい気がするんですよね。

すみません実装間違っているかもしれません🙇‍♂️, 開始時のデータを予測に使うべきところを終了時のデータを使って学習していました. 終了時のデータだったので3万点で必ずトップ判定されていました.

現状では model7 南四局終了時 -> [90, 45, 0, -135]を予測 model6 南三局終了時 -> model7の南三局終了時の予測を予測 ...

としています.

sotetsuk commented 2 years ago

確認ありがとうございます!いいですね!楽しみにしてます!!😆

nissymori commented 2 years ago

確認ありがとうございます!いいですね!楽しみにしてます!!😆

とんでもないです. model7 南4局開始時 -> [90, 45, 0, -135]を予測 model6 南3局開始時 -> model7の南4局開始時の予測を予測 ... model0 東一局開始時 -> model1の東2局開始時の予測を予測

こちらが正しいという認識であっていますかね.

その場合, 東1局については, 親の場所と風から予測する感じになるってことですかね.

sotetsuk commented 2 years ago

そうですね。

sotetsuk commented 2 years ago

でも東一局も連荘したりして点数違う場面もあると思いますけどね。 なので終局時の情報じゃなくて開局時の情報使ったほうがいいと思います。

sotetsuk commented 2 years ago

Model6のコメントなんか違う気しますけど

南3局開始時から南4局開始時のモデル7の予測、を予測する感じになりますね。 連荘のときがどうするか考える必要ありますけど、一旦気にしないでいきましょう

nissymori commented 2 years ago

Model6のコメントなんか違う気しますけど 今修正しました!

nissymori commented 2 years ago

でも東一局も連荘したりして点数違う場面もあると思いますけどね。 なので終局時の情報じゃなくて開局時の情報使ったほうがいいと思います。

了解です!

nissymori commented 2 years ago

変更点

nissymori commented 2 years ago

明日の夜に実装して実験してしまいます!

nissymori commented 2 years ago

まだ途中ですけど, 結構いい感じな気がします! スクリーンショット 2022-09-22 2 50 01 スクリーンショット 2022-09-22 2 50 14 スクリーンショット 2022-09-22 2 50 23 スクリーンショット 2022-09-22 2 50 37

sotetsuk commented 2 years ago

いいですね!😆👍 あとは重ねてプロットすると見やすいかもです!

nissymori commented 2 years ago

席ごとにプロットして見ました!

スクリーンショット 2022-09-22 6 35 34

スクリーンショット 2022-09-22 6 35 45

スクリーンショット 2022-09-22 6 36 00

スクリーンショット 2022-09-22 6 36 09

データの選び方

東一局だけ他の局と違いますね. 起家だけほとんどマイナスになっていないのは, 東一局開始時でマイナスであることがあり得ないからだと思います.起家以外がプラスにあまりならないのも同じ理由な気がします.

nissymori commented 2 years ago

[-135, 90]からはみ出している値は報酬関数として組み込むときはclipすればいいですかね.

sotetsuk commented 2 years ago

ありがとうございます!いい感じですね😆

ただやっぱりはみ出てるのが気になりますけどね。。。 とくに、段々と誤差が増えていってるように見えるんですよね。。。 毎回ターゲットを-135/90収まるようにしてます?してなかったらそのせいかもしれない? あとは解決しなければlogとか試してもいいかもしれない?

https://stats.stackexchange.com/questions/11985/how-to-model-bounded-target-variable

sotetsuk commented 2 years ago

絶対値が大きいところで誤差が大きいのはあんまり良くないと思うんですよね。学習がそこに大きく影響受けてるはずなので。。。

nissymori commented 2 years ago

ありがとうございます!いい感じですね😆

ただやっぱりはみ出てるのが気になりますけどね。。。 とくに、段々と誤差が増えていってるように見えるんですよね。。。 毎回ターゲットを-135/90収まるようにしてます?してなかったらそのせいかもしれない? あとは解決しなければlogとか試してもいいかもしれない?

https://stats.stackexchange.com/questions/11985/how-to-model-bounded-target-variable アドバイスありがとうございます! してませんでした.. targetを[-1.35, 0.90]でclipしてもう一回回してみます!

nissymori commented 2 years ago

各局開始時の特徴量 $X_0 \in R^{n_0, d},...X_7 \in R^{n_7, d}$, 予測値: $Y_0 \in R^{n_0, d}, ... Y_7 \in R^{n_7, d}$, model: $f_0, ..f_7$とする. ある一局の特徴量とラベルを小文字で表現して,

$$y_7 = f_7(x_7) + \epsilon_7$$

$$ \epsilon \sim N(0, {\sigma_7}^2)$$

$$y_6 = y_7 - \epsilon_7 = f_6(x_6) + \epsilon_6 \Rightarrow y_7 = f_6(x_6) + \epsilon_6 + \epsilon_7$$

$$ \epsilon_6 + \epsilon_7 \sim N(0, {\sigma_6}^2 +{ \sigma_7}^2)$$

誤差は独立と仮定して良さそうです.各局で次の局のモデルの予測を予測することは実際にはその局から最終スコアを予測しているということが正当化できている気がします.

仮にNN$g$を用意して, $$y_7 = g(x_6) + \epsilon$$とした時今回の手法と誤差の分散が同じになるかどうか気になるところ(同じになりそう.)

単に1半荘に一局サンプリングして局ごとに最終スコアを予測するというアルゴリズムに比べて確かにデータ八倍になりますね! 式にして考えていなかったので, 今まで完璧に理解していませんでしたが, すごくいい手法だと思いました!

麻雀みたいにリワードがスパースなゲームの報酬設計に普遍的に使えそうだと思いました.

nissymori commented 2 years ago

スーパーフェニックス方式ではNNを一つしか使っていないので, 各局についてこちらの方が分散が小さいということができそうだと思いました.NN8個使うので単純な比較はできないかもしれませんが..

nissymori commented 2 years ago

clipして学習させてみました! だいぶんマシになりましたが, まだ少しはみ出ています.. スクリーンショット 2022-09-22 10 29 04 スクリーンショット 2022-09-22 10 29 13 スクリーンショット 2022-09-22 10 29 23 スクリーンショット 2022-09-22 10 29 33

sotetsuk commented 2 years ago

一回上のリンクにある手法試してみてvalid誤差比較してみてもいいかもですね。 要するにターゲットを (t + 135) / 225 で変換してから exp(f(x)) / (1 + exp(f(x))) で予測するだけですが。

sotetsuk commented 2 years ago
nissymori commented 2 years ago
nissymori commented 2 years ago

ToDo

nissymori commented 2 years ago

学習させられました. 東家の結果のみ添付します. suphx no logistic pred_no_logistic_pos=0suphx TD no logistic pred_no_logistic_pos=0TD suphx logistic pred_use_logistic_pos=0suphx TD logistic pred_use_logistic_pos=0TD

validationのgame rewardとの絶対誤差について TDの方は局ごとにデータがあります. suphxの方は局ごとでなく全体でのデータのみがある状態です. 明日suphxの局ごとのデータを取ります.

nissymori commented 2 years ago

@sotetsuk 学習後の絶対誤差も評価できるようになりました. このPRは閉じて, 次のPRでいくつか試してみようと思います.

sotetsuk commented 2 years ago

了解です!セルフマージしちゃって下さい🙏@nissymori