前回の記事
で、Q-Learningの更新式の説明を行いました。
そして、今回は、実際にQ-Learningで学習した結果をまとめたいと思います。
設定
学習する環境は、以下の通りです。

この状況下で、できるだけ多くの点が取れるように学習します。
探索方法は、ε-greedy法で行います。
コード
コードは、こちらです。
コードの書き方が悪かった(探索式が悪かった)ので、εが1以下になっておらず、しかも、むしろεが小さいほど貪欲となる探索式になっています。
コードの探索方法の部分は、以下のようになっています。
def get_action(next_state, episode):
#徐々に最適行動のみをとる、ε-greedy法
epsilon = 10. * (1 / (episode + 1))
if epsilon <= np.random.uniform(0, 1):
next_action = np.argmax(q_table[next_state])
else:
next_action = np.random.choice([0, 1, 2, 3, 4, 5])
return next_action
結果
学習結果を示します。
割引率 、学習率
、
での結果です。

横軸は学習回数(エピソード)、縦軸が得点です。
150ステップくらいから、最高得点の20000点くらいになっていることが分ります。最後まで得点以下の値があるのは、まだ探索のランダム性が残っているからです。
ε依存性
割引率 、学習率
で、
を 10, 60, 110, 160, 210 と変化させたときの学習過程をは以下のようになりました。

εが小さいほど貪欲(大きいほどランダム)なので、εが大きくなると、いつまでも迷っている形になって、高スコアに落ち着くのが遅くなっています。
学習率依存性
割引率 、
で、学習率を
と変化させたときの結果はこちらです。

以外は、ほとんど差がないようです。
前回の記事から、Q-Learningの更新式は
でした。
の時には、この更新式より、常に前の行動価値関数の値と同じになり、Qテーブルは更新されません。
なので、 の時には学習が進まないはずですが、最初だけ少し得点が上がっています。最初のエピソードでたまたま得点をとったと考えられますが、それ以降は得点0になっているので、少しおかしいですね。Qは更新されないので、最初の値を引きずるはずです。計算誤差かもしれません。
割引率依存性
学習率 、
で、割引率を
と変化させたときの結果はこちらです。

では問題なく学習してますが、
では学習に失敗して、最終的にはスコアが減少しています。
これについては、以下で考察します。
εと学習率
学習率 、 割引率を
と変化させたときの結果です。
はそれぞれ 10, 20, 30, 50 です。

について述べます。
方策により、時間が経つにつれて(エピソードが進むにつれて)最も良いQを参照するはずなので、減少するのは奇妙です。
・εが増加するにつれてランダム行動選択の時間が長くなる
・ランダム行動選択のときには良いQテーブルのデータが蓄積されていく
を念頭に置いて、これを説明します。
更新式
を見ると、 が小さいと
の項の影響が小さいので、その行動を(実は良い行動なのに)悪い行動(Q値)として判断してしまいます。
その結果、Greedy行動をすればするほどQテーブルが悪くなり、よい更新が行われなくなり、スコアが減少していくことになります。
それでもランダム行動が選択されれば、Qテーブルがよくなります。εが大きいほどランダム時間が長いので、εが大きくなるとスコアの現象が緩やかです。また、スコアの現象は、ランダム行動で稼いだQ値を切り崩していると解釈できます。
コメント