見出し画像

ε-greedyアルゴリズムをさらに改善

こんにちは!

ぷもんです。


前回、強化学習 探索と利用のジレンマを解決する ε-greedyアルゴリズムとは?
というnoteで
強化学習を改善するために解決しないといけない探索と利用のジレンマと
それを解決するためのε-greedyアルゴリズムについて書きました。


今回はそれをさらに改良していきます。
具体的には学習のはじめの方では探索したほうが
より良い選択肢を選べるようになるので探索多めで
後半にいくにつれ探索で得た知識を利用するのを増やしていきます。

どのようにコードを書けばいいのでしょうか?


今回やるのはこちらです。

def get_action(state, action, observation, reward, episode):
   next_state = digitize_state(observation)
   epsilon = 0.5 * (0.99 ** episode)
   if  epsilon <= np.random.uniform(0, 1):
       next_action = np.argmax(q_table[next_state])
   else:
       next_action = np.random.choice([0, 1])

   alpha = 0.2
   gamma = 0.99
   q_table[state, action] = (1 - alpha) * q_table[state, action] +\
           alpha * (reward + gamma * q_table[next_state, next_action])
   return next_action, next_state

       action, state = get_action(state, action, observation, reward, episode)
       episode_reward += reward


前回やったのがこちらです。

def get_action(state, action, observation, reward):
  next_state = digitize_state(observation)
  epsilon = 0.2
  if  epsilon <= np.random.uniform(0, 1):
      next_action = np.argmax(q_table[next_state])
  else:
      next_action = np.random.choice([0, 1])

  alpha = 0.2
  gamma = 0.99
  q_table[state, action] = (1 - alpha) * q_table[state, action] +\
          alpha * (reward + gamma * q_table[next_state, next_action])
  return next_action, next_state


変わったのはεの値を決めているこちらの部分です。

epsilon = 0.5 * (0.99 ** episode)

△**〇→△の〇乗、〇*△→〇×△
を表していることがわかっていれば
「ε=0.99のエピソード乗を0.5に掛けた数字」となっていることがわかります。

こうしておくことで
εの値は0.5で始まりエピソードを重ねるにつれて
0.5×0.99=0.495
0.99の2乗→0.981、0.99の3乗→0.970299のように
となって少しずつ減っていきます。


εの値が小さくなると次の条件式を満たす確率が

epsilon <= np.random.uniform(0, 1)

50%から徐々に上がっていくので
探索より利用が選ばれる確率が上がっていくようになります。

(探索?利用?となっている方は
前回の強化学習 探索と利用のジレンマを解決する ε-greedyアルゴリズムとは?
というnoteで詳しく書いているのでそちらをご覧ください)



今回は学習のはじめの方では探索多め
後半にいくにつれ探索で得た知識を
利用するのを増すように改良しました。


プログラミングを勉強していると
今回のような数式の意味を理解しながらコードの意味を理解したり
自分のやりたいことを数式にしてコード化するようなことが
よく出てくると感じます。

これは数学とかに似てて
中学校などで数学に苦手意識ついた人には
めっちゃ苦行なのかもしれないなと思います。

このように考えると
「理系じゃなくてもプログラミングはできる!」
みたいな言葉は半分当たっていて半分外れていますよね...。

逆に
コードを意味の塊ごとに分解して
ネットで検索しながら理解していく感じは
英語の文を翻訳をしている感じに
めっちゃ似ているなと感じることもあって

今回、改めてプログラミングは面白いなと思いました。


最後まで読んでいただきありがとうございました。

ぷもんでした!

noteを日々投稿してます! もしいいなと思ってもらえたら サポートしてもらえるとありがたいです。 VRやパソコンの設備投資に使わせていただきます。 ご意見、質問等ありましたらコメントください。 #ぷもん でつぶやいてもらえると励みになります。 一緒に頑張りましょう!