PCクラスタ上での強化学習 探査率の影響
MPIで一番簡単な方式を実装した。
- 127X127の迷路問題
- 簡単のためマスター1つ、スレーブ1つで構成
- スレーブからマスターへの行動価値テーブルの送信は2000エピソードごとに行う
- マスターは送られてきたテーブルを結合する
- テーブルの結合は更新回数で重みづけした価値の平均を取る
- 学習曲線はマスターのものを描く
図で示すと下のようになる。
マスターは各スレーブが学習した結果を受け取ることによって、行動価値テーブルが高速に更新される(=学習が高速化される)と考えられる。
結果は下図。
最初、結合しているにも関わらず全く高速化されていないという結果になってしまった。つまり、図のresult_ns(並列化しない)とresult0(並列化してテーブル結合を導入)の学習曲線はほとんど変わらず、並列化の意味が全くなかった。
理由として考えられたのは、マスターとスレーブの探索された状態行動空間がほとんど同じになっているということ。マスターとスレーブがテーブルの同じ場所を更新していたら結合して平均とっても変わらず意味がないから。
マスターとスレーブが異なる状態行動空間を探索するにはどうすればいいか考えると、
- 状態行動空間をマスターとスレーブに分割して割り当てる
- スターとスレーブの「探査率」を変える
っていう2つの方法が思いついた。1つ目の方法はいわゆるデータ分割って手法だが、ここではより簡単な探査率を変える方を試した。
マスターの探査率は0に固定。スレーブの探査率を0(result0)、0.7(result0.7)、0.9(result0.9)と変えてグラフ表示してみたところ、スレーブの探査率が高いほど学習の収束が早まることがわかった。
まとめ
スレーブの探査率を高くすると、状態行動空間が広く探索され、結合したときの効果がより大きくなる。逆にスレーブの探査率を低くするとマスターおよび他のスレーブの探索した状態行動空間と重なってしまい結合したときの効果がうすくなる。
根本的な問題
テーブル形式では結合コストが大きすぎるようだ。結合する(要素数10000の配列をスイープして平均を求める)たびに一瞬動作が止まるのがわかるほど遅い。つまり、PCクラスタ上で実行しても「実行時間」の高速化はほとんどされないと思われる。