Re:ゼロから始めるML生活

どちらかといえばエミリア派です

RecSim NGを使ってみる

先日とあるチュートリアルを聞いていたところ、RecSimというライブラリが使用されていました。

どうやら、推薦を行うエージェントがコーパスやユーザーと対話する推薦システム環境をシミュレーションするライブラリのようでした。 こちらのライブラリが2019年に発表されているんですが、その後RecSim NGというライブラリが新しく発表されています。

arxiv.org

github.com

今回は、こちらのRecSim NGを色々触ってみたいと思います。

RecSim NG

RecSim NG は、推薦を行うエージェントがコーパス(または推薦可能なアイテム)やユーザーと対話する推薦システム環境を、自然だが抽象的な方法でシミュレーションするための設定可能なプラットフォームです。

RecSim NGではマルコフ過程で状態が想定されており、下記の式で表現されています。

\displaystyle{
p ( \left( s_i \in { \cal S } \right)_{i=0}^{n-1} ) = p_0( s_{0} ) \prod_{i} T( s_{i} , s_{i+1} ),
}

ここで、

  • S: 一連の状態
  • s: 一つの状態
  • T: 遷移カーネル
  • p0: 初期状態の分布

を表しています。

いま、 \Gamma, \Gamma_{-1}を状態空間の成分をノードとする2つの有向無循環グラフであるとしたとき、遷移カーネルは

\displaystyle{
T(s_t, s_{t-1}) = \prod_{i} T^{i}(s_{t}^{i} | s^{ \operatorname{Pa}_{ \Gamma}(i)}_{t}, s_{t-1}^{{ \operatorname{Pa}_{ \Gamma_{-1}}(i)}}),
}

のような式が想定されています。 遷移カーネルは、時刻tの \Gammaの状態と、時刻t-1の \Gamma_{-1}の状態に依存しています。

一応、条件設定はこれくらいです。正直あんまり良くわかりませんね。(書いてる自分もいまいちよくわかってないので安心してください)

チュートリアルをやってみる

解説読んでもいまいちよくわからないので、実際にチュートリアルを動かしながら感じを掴んでみたいと思います。

counting to n

hello world的な意味でcounting to nというのが最初に紹介されています。 やりたいことはこんな感じらしいです。

  • 初期状態 s_{0}^{0}は常に0
  • 状態遷移は s_{t}^{0} = s_{t-1}^{0} + 1

要するに、1つ前の状態に対して1を加算していくだけです。

チュートリアルから抜粋すると実装はこんな感じです。

the Fibonacci numbers

次のチュートリアルはFibonacci数列に関するものでした。

先程のcounting_to_nは潜在変数は1つでしたが、今度はフィボナッチ数列なので潜在変数が2つになります。

実装はこんな感じです。 initやnextの中身が変わっているのがポイントです。

Game of Life

少しずつ難しくなっていきます。 今度は、周辺の状況に応じて対応が分岐します。

二次元の格子を考え、状態がliveの点の周囲8点のうち

  • live > 3
  • live < 2

の両方の場合、その点はdeadとなる。 また、deadの点の周囲8点のうち

  • live = 2

の場合、deadの点がliveに変化する、というシミュレーションを考えます。

このシミュレーションでは新しくStoryという関数を使用しています。 Storyは、シミュレーション変数、エンティティ、およびそれらの間の紐付けをカプセル化する関数として使用されているようです。 game_of_life_story の中身をよく見てみると初期化と諸々の定義をひとまとめにしているだけです。

実際に動かしてみるとタイムステップ毎に、格子の中身がどんな感じで変化していくか確認できます。

Differentiable Simulation

basicなチュートリアルの最後は微分可能シミュレーションになっています。

シミュレーションは、確率変数に対する期待値についてサンプリングベースの推定を行い、目的に基づいてモデルパラメータを適合させたり、その他の推論タスクを実行するために使用します。

ここではGame of Lifeをground truthとし、決まったルールで動作するGame of Lifeの挙動をNNで再現できるかを試しています。 学習にはentity.story_with_trainable_variablesを使用しています。

結果的に、完全に再現できるわけではないですが、それっぽい振る舞いを獲得することができました。 これにて環境の応答に関して学習することができ、未知のデータがあたえられた際にもシミュレーションができるようになっています。

参考文献

この記事を書くに当たって下記の文献を参考にさせていただきました。

感想

他にもやりたいことがあったんですが、チュートリアルがよくわからなさすぎて一旦半分で断念します。 本当は後一つチュートリアルがあるので、そっちもいずれやるかも?とか思ってます。