Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

train reward shping model #1138

Merged
merged 11 commits into from
Sep 30, 2022
Merged

Conversation

nissymori
Copy link
Collaborator

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 16, 2022

ToDo

  • 特徴量実装
  • 特徴量テスト
  • 訓練関数実装
  • 訓練関数テスト
  • plot関数実装
  • plot関数テスト
  • コマンドライン整備
  • 実験

@nissymori
Copy link
Collaborator Author

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

@nissymori
Copy link
Collaborator Author

スクリーンショット 2022-09-17 13 28 43

スクリーンショット 2022-09-17 13 28 59

南四局の結果です.

@sotetsuk
Copy link
Collaborator

sotetsuk commented Sep 17, 2022

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

@sotetsuk
Copy link
Collaborator

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

@nissymori
Copy link
Collaborator Author

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

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 17, 2022

スクリーンショット 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
Copy link
Collaborator Author

nissymori commented Sep 19, 2022

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

@sotetsuk
Copy link
Collaborator

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

@sotetsuk
Copy link
Collaborator

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 19, 2022

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

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

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 19, 2022

学習させてみました.
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
Copy link
Collaborator

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 19, 2022

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

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

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

@sotetsuk
Copy link
Collaborator

sotetsuk commented Sep 19, 2022

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 19, 2022

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

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

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

としています.

@sotetsuk
Copy link
Collaborator

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 19, 2022

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

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

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

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

@sotetsuk
Copy link
Collaborator

そうですね。

@sotetsuk
Copy link
Collaborator

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

@sotetsuk
Copy link
Collaborator

sotetsuk commented Sep 19, 2022

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

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

@nissymori
Copy link
Collaborator Author

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

@nissymori
Copy link
Collaborator Author

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

了解です!

@nissymori
Copy link
Collaborator Author

変更点

  • 局の最初の情報を使うようにする

@nissymori
Copy link
Collaborator Author

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

@nissymori
Copy link
Collaborator Author

まだ途中ですけど, 結構いい感じな気がします!
スクリーンショット 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
Copy link
Collaborator

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 21, 2022

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

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

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

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

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

データの選び方

  • 同一局で連チャンがある場合, その中からランダムに選ぶ.
  • 該当する局がない場合(南4局のデータが欲しいが, 既に飛んでしまっている.)スキップする.

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 21, 2022

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

@sotetsuk
Copy link
Collaborator

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

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

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

@sotetsuk
Copy link
Collaborator

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 21, 2022

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

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

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

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 21, 2022

各局開始時の特徴量 $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
Copy link
Collaborator Author

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

@nissymori
Copy link
Collaborator Author

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
Copy link
Collaborator

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

@sotetsuk
Copy link
Collaborator

sotetsuk commented Sep 22, 2022

    1. Suphx形式
    1. +TD-likeな学習(局ごと)
    1. +席ごとの学習
    1. +logit-link(exp)での学習

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 22, 2022

  • test lossは真のgame reward(局によらず.)との絶対誤差をとる.

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 23, 2022

ToDo

  • logitテスト
  • logit実装
  • file整理
  • 引数指定できるように
  • 正規化方法
  • val loss可視化

@nissymori
Copy link
Collaborator Author

nissymori commented Sep 29, 2022

学習させられました. 東家の結果のみ添付します.
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
Copy link
Collaborator Author

nissymori commented Sep 30, 2022

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

@sotetsuk
Copy link
Collaborator

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

@nissymori nissymori merged commit 0c914ec into master Sep 30, 2022
@nissymori nissymori deleted the nissymori/run/train_reward_shping_model branch September 30, 2022 16:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants