この前、RecSim NGのチュートリアルをやってました。
このときは特に強化学習っぽいところまで行きませんでした。 今回は確率的シミュレーションに関するチュートリアルをやってみたいと思います。
確率的シミュレーション
人間の意思決定やその過程を完全にシミュレーションすることは困難です。
ただし、推薦システムのためにシミュレーションによって知りたいことは下記のようなことだったりします。
- ポリシーAはポリシーBよりユーザーの満足度が高いか?
- ある施策はマイノリティのセグメントのユーザーとマジョリティのユーザー間のサービス品質の格差を解消できるか?
- このプロダクトは5年後まで通用するか?
このような場合、集計された統計値を用いて良し悪しを判断するため、1件1件のログが現実と異なっていても問題ありません。 そのため、完全にシミュレーションする必要はなく、もっともらしい事象のシミュレーションができればやりたいことができる可能性があります。
要するに、完全に世の中を再現できていなくても、もっともらしい振る舞いが再現できれば、あとは統計的に考えてあげれば判断可能ということになりそうです。
チュートリアルをやってみる
今回はRecSim_NG_Dealing_With_Uncertainty
という方のチュートリアルをやってみます。
Hello Random World
まずは、RecSim NGを使用したときのrandom walkを実装します。
rw_next
関数の中で、直前の状態を中心にしたガウス分布によって次の状態を計算していきます。
これによってrandom walkをシミュレーションしています。
ここでは、確率的プログラミングのためにedward2を使用しています。 どうやら、RecSim NGではedward2を使用して確率的プログラミングを記述するのが想定されているようですね。
Evaluating Log-probabilities
RecSim NGでモンテカルロシミュレーションと異なる点は、確率的な軌道に関しても確率評価が可能になっている点だとしています。個々の軌道や、そのときの変数に至るまで確率を評価するAPIを持っている点ですね。
ここでは軌道や内部で使用する各変数の対数確率を計算しています。 正直この段階ではどういう目的でこれを使用するのかあんまりわかりませんでした😅
A Few Gotchas
対数確率を計算するにあたりいくつか制限があります。
RecSim NGは、各エージェントから見て潜在的な確率変数は許されません。 言い換えると、シミュレータ自身がすべての確率変数を把握できなければならず、すべての確率変数はEdward2から得られるもので有ることが期待されています。 また、すべてのEdward2のランダムな変数がRecSim NG変数のキーに紐付いている必要があります。(Edward2がランダム性をすべて管理できる状態にする必要がある)
また、RecSim NG の変数が時間ステップ間で形状を変えることができません。
以下では、この制約を逸脱して失敗する例を試しています。
User Model Learning
全部使うとこんな感じでシミュレーションができるらしい。 (細かいところはあんまり良くわかってないのでまた今度)
参考文献
こちらの文献を参考にさせていただきました。
感想
うーん、よくわからん。。。