Q学習

Pythonで学ぶGymnasiumによるReinforcement Learning

Fouad Trad

Machine Learning Engineer

Q学習の概要

  • 「quality learning」の略
  • モデルフリー手法
  • 相互作用で最適Qテーブルを学習

Qテーブルの初期化、行動の選択、環境からの報酬の受け取り、テーブル更新というQ学習の流れ。一定のエピソード後に収束。

Pythonで学ぶGymnasiumによるReinforcement Learning

Q学習 vs. SARSA

SARSA

SARSAの更新則の数式を示す画像。

  • 実際に取った行動で更新
  • オンポリシー学習
Q学習

Q学習の更新則の数式を示す画像。

  • 取った行動に依存せず更新
  • オフポリシー学習
Pythonで学ぶGymnasiumによるReinforcement Learning

Q学習の実装

env = gym.make("FrozenLake", is_slippery=True)

num_episodes = 1000 alpha = 0.1 gamma = 1
num_states, num_actions = env.observation_space.n, env.action_space.n Q = np.zeros((num_states, num_actions))
reward_per_random_episode = []
Pythonで学ぶGymnasiumによるReinforcement Learning

Q学習の実装

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

while not terminated:
# Random action selection action = env.action_space.sample()
# Take action and observe new state and reward new_state, reward, terminated, truncated, info = env.step(action)
# Update Q-table update_q_table(state, action, new_state)
episode_reward += reward state = new_state
reward_per_random_episode.append(episode_reward)
Pythonで学ぶGymnasiumによるReinforcement Learning

Q学習の更新

Q学習の更新則の数式を示す画像。

def update_q_table(state, action, reward, new_state):

old_value = Q[state, action]
next_max = max(Q[new_state])
Q[state, action] = (1 - alpha) * old_value + alpha * (reward + gamma * next_max)
Pythonで学ぶGymnasiumによるReinforcement Learning

ポリシーの適用

reward_per_learned_episode = []
policy = get_policy()

for episode in range(num_episodes): state, info = env.reset() terminated = False episode_reward = 0 while not terminated: # Select the best action based on learned Q-table action = policy[state] # Take action and observe new state new_state, reward, terminated, truncated, info = env.step(action) state = new_state
episode_reward += reward
reward_per_learned_episode.append(episode_reward)
Pythonで学ぶGymnasiumによるReinforcement Learning

Q学習の評価

import numpy as np
import matplotlib.pyplot as plt

avg_random_reward = np.mean(reward_per_random_episode) avg_learned_reward = np.mean(reward_per_learned_episode)
plt.bar(['Random Policy', 'Learned Policy'], [avg_random_reward, avg_learned_reward], color=['blue', 'green']) plt.title('Average Reward per Episode') plt.ylabel('Average Reward') plt.show()

学習済みポリシーの収益(約0.26)がランダムポリシー(約0.01)を大きく上回ることを示す棒グラフ。

Pythonで学ぶGymnasiumによるReinforcement Learning

演習に進みましょう!

Pythonで学ぶGymnasiumによるReinforcement Learning

Preparing Video For Download...