ベイズによる逆強化学習をC言語で実装してみた

 本郷で行われた強化学習アーキテクト(2018/01/16)は千葉大学Dの石川翔太さんのベイズによる逆強化学習であった。

  https://www.slideshare.net/ShotaIshikawa2/ss-86214928

最大エントロフィ法の逆強化学習を実装して見て納得できなかった事は、熟練者の方策変更を反映できない事であった。

その点ベイズでは熟練者のデータを分類して、その方策の移動を隠れ変数として反映できる可能性がある。

 以下の文献に従って簡単な、ベイズによる強化学習を実装してみた。

  https://www.aaai.org/Papers/IJCAI/2007/IJCAI07-416.pdf

 プログラム(python) としては下記のGitHubを参照しました。

       https://github.com/erensezener/aima-based-irl

 

 熟練者の選択確率をP_{expert}(Trj(s,a)|R)とすると報酬Rベイズより次式の事後分布で算出する事ができる。

  P_{expert}(R|Trj(s,a)) = \frac{1}{Z} P_{expert}(Trj(s,a)|R) \cdot P_{expert}(R)

  ここで

          s:局面

          a:行動

          Trj(s,a)は観測された熟練者の遷移経路

          P_{expert}(R):熟練者の報酬の事前確率

     Z=\sum_a \gamma \exp \{Q(s,a)|R)\}:分配関数

          Q(s,a)|Rは行動価値関数 Bellman方程式で解く

 隠れ変数Rを変動させて事後分布を最大とするMAP(Maximum Posterior)をすればよい

    ベイズモデルの有意性は上記の様に定式化が明確で理解し易いことにあるが、一般に事後分布は尤度関数が共役事前分布でないと理論的に解けず、MCMCによる繰返し計算が必要になる。

 

以下の手順で計算する。

    ①報酬の事前分布はR一様分布とする

 ②MCMCを使って最適Rを探査する

        簡単にいうと一様分布の報酬Rをランダムに変えて生成した熟練者の事後分布が高くなるなら、これを採用する

 

 ③生成する尤度分布P(s,a|R)は仮定されたRよりBellaman方程式を解いて価値行動関数Q(s,a|R)に指数比例とする(ボルツマン分布の仮定)

       P(R|s,a) = \frac{1}{Z} \exp \{Q(s,a^*)|R)\} \cdot P(R)

            a^*は熟練者の局面sでの最適行動

    この実装では熟練者の経路から局面sでの最頻度行動としている。

    上記pythonの例だと熟練者の事前報酬R^*を仮定して採用している。

    ④ 乱数で生成された報酬Rでの熟練者の事後分布が、前に計算された事後分布より高くなれば、この仮定された報酬Rを選択する。

 

実験課題

 課題は最大エントロフィ逆強化学習と同じ問題とする。

 赤がゴール。熟練者データはOpen-AIで解いた100通りの経路とする。

  f:id:mabonki0725:20171215143025p:plain

実験結果

 ゴールに近い所が報酬が高く、遠い所が低く計算できている。

 最大エントロフィ逆強化学習よりは粗い結果となっている。これは熟練者の最適方策を単に経路データから最頻度行動を採用しているためと考えられる。

f:id:mabonki0725:20180124100306p:plain