Double Q-learning

Pythonで学ぶGymnasiumによるReinforcement Learning

Fouad Trad

Machine Learning Engineer

Q-learning

  • 最適な行動価値関数を推定
  • 最大 Q に基づく更新で Q 値を過大評価しがち
  • サブ最適な方策につながる可能性

 

Q-learning の更新式の数式を示す画像。

Pythonで学ぶGymnasiumによるReinforcement Learning

Double Q-learning

  • 2 つの Q テーブルを保持
  • 各テーブルは互いに基づいて更新
  • Q 値の過大評価リスクを低減

Q0 と Q1 の 2 つの Q テーブルが互いに基づいて更新される図。

Pythonで学ぶGymnasiumによるReinforcement Learning

Double Q-learning の更新

  • テーブルをランダムに選択

Q0 と Q1 の 2 つの Q テーブルが互いに基づいて更新される図。

Pythonで学ぶGymnasiumによるReinforcement Learning

Q0 の更新

Q0 と Q1 の 2 つの Q テーブルが互いに基づいて更新される図。

Q0 更新時の最良次行動の求め方を示す図。

Q0 の更新則を示す図。

Pythonで学ぶGymnasiumによるReinforcement Learning

Q1 の更新

Q0 と Q1 の 2 つの Q テーブルが互いに基づいて更新される図。

Q1 更新時の最良次行動の求め方を示す図。

Q1 の更新則を示す図。

Pythonで学ぶGymnasiumによるReinforcement Learning

Double Q-learning

Q1 と Q2 の 2 つの Q テーブルが互いに基づいて更新される図。

  • 過大評価バイアスを低減
  • Q0 と Q1 の更新を交互に実行
  • 両テーブルが学習に寄与
Pythonで学ぶGymnasiumによるReinforcement Learning

Frozen Lake での実装

env = gym.make('FrozenLake-v1', 
               is_slippery=False)

num_states = env.observation_space.n
n_actions = env.action_space.n
Q = [np.zeros((num_states, n_actions))] * 2

num_episodes = 1000 alpha = 0.5 gamma = 0.99

Frozen Lake 環境を進むエージェントの画像。

Pythonで学ぶGymnasiumによるReinforcement Learning

update_q_tables() の実装

def update_q_tables(state, action, reward, next_state):
    # Select a random Q-table index (0 or 1)
    i = np.random.randint(2)

# Update the corresponding Q-table best_next_action = np.argmax(Q[i][next_state])
Q[i][state, action] = (1 - alpha) * Q[i][state, action] + alpha * (reward + gamma * Q[1-i][next_state, best_next_action])

Q1 の更新則を示す図。

Q2 の更新則を示す図。

Pythonで学ぶGymnasiumによるReinforcement Learning

学習

for episode in range(num_episodes):
    state, info = env.reset()
    terminated = False

    while not terminated:
        action = np.random.choice(n_actions)  
        next_state, reward, terminated, truncated,  info = env.step(action)
        update_q_tables(state, action, reward, next_state)
        state = next_state

final_Q = (Q[0] + Q[1])/2 # OR final_Q = Q[0] + Q[1]
Pythonで学ぶGymnasiumによるReinforcement Learning

エージェントの方策

policy = {state: np.argmax(final_Q[state]) 
          for state in range(num_states)}
print(policy)
{ 0: 1,  1: 0,  2: 0,  3: 0, 
  4: 1,  5: 0,  6: 1,  7: 0, 
  8: 2,  9: 1, 10: 1, 11: 0, 
 12: 0, 13: 2, 14: 2, 15: 0}

各状態で取るべき行動を示す、学習済み方策の画像。

Pythonで学ぶGymnasiumによるReinforcement Learning

Passons à la pratique !

Pythonで学ぶGymnasiumによるReinforcement Learning

Preparing Video For Download...