Closed habara-k closed 3 years ago
kyusyu
kyuusyu
kyushu
kyuushu
nine tiles
等の表記があり、統一したい
何がpublicで何がprivateなのかをより明確にしたいかもしれない。
ポーカーの論文では、public observation
や private observation
のような単語も使って整理してたので、参考になるかもしれない。
(河は public observation
で、closed handは private observation
)
PettingZooに合わせると、Stateに次のプレイヤーが誰かの情報がほしいかもしれない。 ただこれは天鳳との兼ね合いを考えると微妙かもしれない。。。
現在のハンドが入ってないが、いれるかどうか。。。
TerminalもEventの中に入れたほうが自然か?
PrivateInfo
はミスリーディングか。(InfoがImperfect Information gameのInfoと同じように見える)
見直して思うのは、どの情報が更新されて、どの情報がfixedなのかがわかりにくい。
Draft => #694
utils
へ突っ込む。utils
なしで、過不足ない情報がしっかり定義されている、としたい。Wind
, RelativePos
を消す(protoの定義をfixするため、絶対必要でないものは消す)NoWinnerType
を EventType
と統合へ(Terminal
を見に行かなくて済むように。Action
とEvent
の整合性を取りやすいように)AbsolutePos
も消す(結局、size = 4 のリストを配列を多様しているので)NoWinnerType
=> RoundEndType
Ron
, Tsumo
を追加ActionType
Kan
のリネーム(wikiに揃える)ABORTIVE_DRAW_NINE_TERMINALS
へDISCARD
を DISCARD
と TSUMOGIRI
に変える(Eventとの整合性)EventType
DISCARD_FROM_HAND
=> DISCARD
, DISCARD_DRAWN_TILE
=> TSUMOGIRI
に変えるKan
のリネームEventType
に追加する(Terminal
を見に行きたくない)EventType
を追加する(Terminal
を Utils
以下に隠すので、 Terminal
なしでダブロンを判断するため)Action
DISCARD
を DISCARD
と TSUMOGIRI
に変えるEvent
who
が必要ROUND_END
を追加
Ron
, Tsumo
を RoundEndType
へマージ。(天鳳のフォーマットへ近く、ダブロンと三家和了の動作の違いが気になる)shown_hands
の追加ura_dora_indicators
の追加Score
ten
=> tens
TenpaiHand
=> Hand
opens
を加えるEventHistory
=> PublicObservation
init_score
の追加init_dora_indicator
の追加events
=> event_history
Utils
の追加
curr_score
の追加curr_dora_indicators
の追加river
の追加round_terminal
の追加PrivateInfo
=> PrivateObservation
draws
=> draw_history
utils
の追加
curr_hand
の追加init_socre
を public_observation
へ移すdoras
を次の二箇所へ分けるinit_dora_indicator
in public_observation
curr_dora_indicators
in public_observation.utils
event_history
=> public_observation
priate_info
=> private_observation
possible_actions
=> private_observation.utils.legal_actions
Win
(utils以下に移される)
closed_tiles
と opens
を hand
にまとめるNoWinner
=> Draw
TenpaiHand tenpais
=> Hand tenpai_hands
NoWInnerType
=> EventType
Terminal
=> RoundTerminal
NoWinner no_winner
=> Draw draw
player_ids
を public_observation.utils
へ移すgame_id
を public_observation.utils
へ追加game_seed
を hidden_state.utils
へ追加wall
を hidden_state
へ移動ura_doras
を hidden_state.utils
へ移動terminal
=> public_observation.utils.round_terminal
HiddenState hidden_state
を追加wall
を hidden_state
へ追加hidden_state.utils
を作成
curr_ura_dora_indicators
を追加public_observation
を追加private_infos
=> private_observations
No
も加えた History
が合ったほうがいいような気もするしlegal_actions
も全てのdecision pointであれば便利utils
=> optional
??他にも、 No も加えた History が合ったほうがいいような気もするし
天鳳のlogにはNoがない => mjxproto形式で NoをHistoryには加えにくい
(教師あり学習では、例えばチーをできた状況で他家のポンが入ったとき、チーをせずNoを選んだ扱いにしているが、これは学習においてそこまで影響がないという仮定の元での妥協案である。厳密なプロトコルを作る今回の場合、ここを妥協しない方が良さそうな気がする)
legal_actions
も全てのdecision pointであれば便利
これはObservationUtils.legal_actions
で達成可能という認識で良いでしょうか?
他にも、 No も加えた History が合ったほうがいいような気もするし
天鳳のlogにはNoがない => mjxproto形式で NoをHistoryには加えにくい
(教師あり学習では、例えばチーをできた状況で他家のポンが入ったとき、チーをせずNoを選んだ扱いにしているが、これは学習においてそこまで影響がないという仮定の元での妥協案である。厳密なプロトコルを作る今回の場合、ここを妥協しない方が良さそうな気がする)
まあもし加えるとしたら、今の event_history
は No
なしのまま据え置いて、
別に utils
以下に No
もある完璧なhistoryも別で保持するという形になるかなあという感じですね。
legal_actions
も全てのdecision pointであれば便利これは
ObservationUtils.legal_actions
で達成可能という認識で良いでしょうか?
強化学習のときには
Observation
のjsonデータから作るなら、 legal_actions
が入っている現状で問題ないです(通常の強化学習)State
のjsonデータから作るなら legal_action_history
のような系列を保持する必要があるかと思います(通常の強化学習から、教師あり学習に寄せたイメージ。データサイズがかなり小さくなるはず。オフライン強化学習という分野も流行りだし、実用性は高い)教師あり学習のときには、後者のパターンなので、同じくヒストリがないとダメだと思います。
Observation.ObservationUtils
内にlegal_action
が存在するのはロジック的に大丈夫なのか?Observation
はあるplayerから観測したStateであるので、例えば他家が直前の捨牌をポンできるかどうかはわからない方が良い
legal_action
を付け加えるとするなら、State.legal_action
が良い気がする。
=> 次が誰のターンか、という情報も合ったほうがいいような気もする
も解決可能
legal_action
をwho
ごとに分けて、それぞれをState.PrivateObservation.legal_action
に格納する代替案
legal_action
をwho
ごとに分けて、それぞれをState.PrivateObservation.legal_action
に格納する
僕の頭の中のイメージはこれでしたね。現状の実装とズレがありますね。ありがとうございます。
現状の legal_actions
は private_observation
か private_observation.utils
の下に移されるべきですね。
legal_actions_history
を例えば
LegalActions
|- repeated Action actions
PrivateObservation
|- repeated LegalActions legal_actions_history
のようにもつ場合、private_observation.legal_actions_history
とpublic_observation.event_history
の対応関係をとるのが難しそう。
(private_observation.draw_history
はpublic_observation.event_history
の内、who=自分, type=draw
のものと順番に対応するので簡単に対応が取れるが、legal_actions
は自明な対応が取れなさそう)
特徴量生成の高速化のため、repeated bool PublicObservation.under_riichi
を加えてもいいかもしれない。
PlayerIdx
は本当に必要なのかも謎。結局、色んな場所で暗黙的にユーザをリストで持ち、 0 = 起家
を仮定している。( Score
など)
ただ、あったほうがわかりやすいのも事実ではある。
先日のディスカッションメモ
No
や実現しなかった Chi
のような行動履歴を含む、完璧な行動履歴を用意するか否かは、自己対戦のデータをどのように保存するかにも依存する。legal_actions
の履歴を持つかも、上記の意思決定に依存するチェック項目
あとの懸念はEventとActionをマージするか否かくらいか。これもやはり完璧な行動履歴を用意するかに依存している気がする。
TakeAction
しかメソッドを用意してないが、現状だと Observation
は意思決定が必要な状況でしか生成されないので、終局時にその情報が渡されない。これはRLをする上で問題になるかもしれない。ダミーの行動を用意した方がよいか。
player_idはシミュレータ側で設定しているが、いいのか? エージェント側がもっているべきとう説もある
mjx.proto
変更による影響mjconvert
のテスト資材でコミットされているのは mjlog
と mjscore
形式だけなので、影響はないはずmjx
のテスト資材は tests/resources/json
以下に配置されているので、これを更新する必要があるmjx.proto
と必要な修正を更新もし mjconvert
以下で venv
がなければ $ make venv
してからアクティベートした方がよい。
$ cd mjconvert
$ make clean && make install
$ make pytest
$ make test-cli // これはテストとしてちゃんと機能しているのか怪しい
現実には、 make clean && make install
と make pytest
を繰り返しながらコードを修正していく。
IDEやVSCodeでprotoの変更による AttributeError
は検知してくれる場合が多い。
最後に make formats
で整える。
2.でコマンドを実行したのと同じ、 mjconvert
ディレクトリで
$ mjconvert ../tests/resources/mjlog ../tests/resources/json --to-mjxproto --verbose
$ git add ../tests/resources/json
$ git commit -m "update test resources"
CLionで変更とテストをしていく(あるいは make
)
cmake-build-debug
も頻繁に消す必要がありそう。
https://github.com/mjx-project/mjx/pull/702
RoundTerminal
は State
としては確かに utils
の下に突っ込んでもいいけど、 Observation
としては utils
の上に置いておかないとダメかもしれない。
RoundTerminal
をどうするか?utils
の上へ動かすEvent
の Win
に from_who
や Hand
を加えて、 Tenpai
のような EventType
も追加して対処するEvent
に新しく RoundTerminal
typeを加えて utils
の情報を terminal_info
のようなattributeへ移す
AGARIE, RYUUKYOKU
があり、それぞれ全員分の上がりや流局情報を保持protobufは最新版からoptionalが使える
optionalが使えるなら、例えば Action
も本当は discard
や open
は optional
が正しい
裏ドラはHiddenStateUtils 以下に入る予定だが、立直した人が上がった場合、裏ドラの情報を何かしらの方法でpublicにするべきか?
概要
mjxproto
の変更したい箇所をまとめておいて、頃合いを見て一括変更する変更希望箇所
Event.NoWinnerType
を加えたい理由: Eventを見るだけで、ただの流局なのか九種九牌なのかがわかるようにしたい