Python(強化学習の試し14_迷路09_迷路サンプル3の試し2)
■学習率、割引率を変えての試し。
前回は、学習率 α = 0.01、割引率 γ = 0.2で10度試した。学習率や割引率を変えて挙動を見てみる。
まず下のように割引率 γ を変えて実施。
学習率 α = 0.01
割引率 γ = 0.8
結果は、0.2のときと似た感じ。左下を通るのが2回、右上が6回、右上の途中で曲がるものが2回(曲がる場所は違うけど)。ルートを緑線で示した図が下。
1000 : [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 7], [3, 7], [4, 7], [5, 7], [6, 7], [7, 7]]
1000 : [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 7], [3, 7], [4, 7], [5, 7], [6, 7], [7, 7]]
1000 : [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 7], [3, 7], [4, 7], [5, 7], [6, 7], [7, 7]]
1000 : [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 5], [3, 5], [4, 5], [5, 5], [5, 6], [5, 7], [6, 7], [7, 7]]
1000 : [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 5], [3, 5], [4, 5], [5, 5], [5, 6], [5, 7], [6, 7], [7, 7]]
1000 : [[1, 1], [2, 1], [3, 1], [4, 1], [5, 1], [6, 1], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]]
1000 : [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 7], [3, 7], [4, 7], [5, 7], [6, 7], [7, 7]]
1000 : [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 7], [3, 7], [4, 7], [5, 7], [6, 7], [7, 7]]
1000 : [[1, 1], [2, 1], [3, 1], [4, 1], [5, 1], [6, 1], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]]
1000 : [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 7], [3, 7], [4, 7], [5, 7], [6, 7], [7, 7]]

次に、学習率 α を小さくして試してみる。学習率 α = 0.001、割引率 γ = 0.2 で行うと、右下のゴールに行くまでに行ったり来たりを繰り返してなかなかゴールに着かなかった。少し条件を緩めて、学習率 α = 0.006、割引率 γ = 0.2 の999回目のルートを調べると下のような感じ。1行4,5列目が多くなっている。
[1, 1, 243, 1918, 1875, 1, 1]
[0, 0, 0, 0, 202, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
Q表の更新の式は下の通りなので、学習率(式内ではalpha)を小さくすると、更新時の寄与がその分小さくなる。報酬は普通のルートを1、得点部分を10、ゴールを20として設定しているけど、寄与が小さくなればそれぞれの差の影響も小さくなるのかな。
Qtable[py - 1, px - 1, action] = (1 - alpha) * Qtable[py - 1, px - 1, action] + alpha * (reward + gamma * next_maxQ)
今のコードでは、一度通った場所をまた通っても報酬が得られるため、このような状態になるかもしれない(得点部分は一度通ると普通のルートの報酬になる)。同じところを行ったり来たりする方が報酬は多くなっていくので。
得点部分の報酬を10000、ゴールを20000にしてみると、1400~1900歩くらいで右上付近を通ってゴールに行くパターン、260~330歩くらいで左下からゴールに行くパターンが出た。
右上付近からのゴールの一例
[1, 5, 4, 742, 742, 1, 1]
[0, 0, 3, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1]
左下からのゴールの一例
[1, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0]
[160, 160, 1, 1, 1, 1, 0]
やはり報酬にかかる部分をきっかけに行ったり来たりしているよう。一度通った部分には報酬を与えないようにしたらどうなるか見てみたい。