「強化学習と深層学習」の2章のコードをPythonで書き換えてみる その1

前回の記事に引き続き「強化学習と深層学習」の本のCで書かれたコードをPythonで書き換えて理解を深めていきます。
今回は2章の1つめのコードq22.cです。

 

 

基本的なアルゴリズムは同じなのですが、
自分好みに大分書き換えているので少し解説を加えます。

 

問題

 

この図の0をスタートし、6をゴールと設定します。
各場所でできる移動の方法は上か下の2通りです。
ここで、うまいこと6に辿り着くことができたら報酬を与えて、ゴールに向かうように学習させます。

 

コード全体

 

まずコード全体です。

 

ハイパーパラメータ

 

今回使用したハイパーパラメータは以下のとおりです。

  • エポック: 50
  • 学習率: 0.1
  • 報酬: 10
  • 割引率: 0.9
  • ε-グリーディ法の係数: 0.3

 

結果

 

まず、結果です。
青のグラフが0→2に遷移する時のもので、
赤のグラフが2→6に遷移する時のものです。
こうすると報酬もらえるんやな!!というのを学習している様子が伺えます。

何回か繰り返していると、時にすごく学習に失敗する時もありました。

 

解説

 

では、少し解説をしていきます。

 

Q学習の式

 

ここで出て来るQ学習の一般式は以下のようになります。
Q(s,a) \leftarrow Q(s,a) + \alpha(r + \gamma Q(s_{next}, a_{next})- Q(s,a))

 

s: 状態
a: 状態sで選択した行動
α: 学習率
r: 報酬
γ: 割引率

 

この式は、「報酬がもらえるかどうか」や「この先がまだあるかどうか」によって特定の項が消えます。
例えば、上の図の③④⑤⑥などにいる場合はs_{next}は存在しなかったり、
③④⑤では報酬rは0になります。

これをコードに落とし込むと以下のようになります。

 

2値の乱数生成

 

ほぼ等しい確率で0または1を出力する関数です。
0~1の中で乱数を生成しそれが0.5以上ならば1,それ以外なら0を返すようにしました。

lambda式で書きましたが、引数がないので即時関数みたいな書き方になっています。

 

学習

 

あとは以上のものを使って、全状態に対して学習を繰り返します。

 

考察

 

後日追記します。

コメントを残す