探索と活用の両立

Pythonで学ぶGymnasiumによるReinforcement Learning

Fouad Trad

Machine Learning Engineer

ランダム行動での学習

  • エージェントが環境を探索
  • 学習知識に基づく戦略最適化はしない
  • 学習完了後に知識を活用

環境内のエージェントの画像

Pythonで学ぶGymnasiumによるReinforcement Learning

探索と活用のトレードオフ

 

  • 探索と活用のバランス
  • 探索のみだと戦略が洗練されない
  • 活用のみだと未発見の機会を逃す

新たな報酬を見つけるために探索しつつ、知識を活用すると一部の報酬を逃す可能性があることを示す図。

Pythonで学ぶGymnasiumによるReinforcement Learning

外食の選択

レストランのテーブルの画像。

Pythonで学ぶGymnasiumによるReinforcement Learning

ε-greedy 戦略

 

  • 確率εで探索

確率εでランダムに行動して探索する図。

Pythonで学ぶGymnasiumによるReinforcement Learning

ε-greedy 戦略

 

  • 確率εで探索
  • 確率1−εで活用
  • 知識を使いつつ継続的に探索

確率εでランダムに行動して探索し、確率1−εで既知の最良行動を選んで活用する図。

Pythonで学ぶGymnasiumによるReinforcement Learning

減衰付き ε-greedy 戦略

 

  • 時間とともにεを減少
  • 初期は探索重視
  • 後半は活用重視
  • 蓄積した知識への依存が増える

時間経過でεが減少する図。

Pythonで学ぶGymnasiumによるReinforcement Learning

Frozen Lake での実装

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

action_size = env.action_space.n
state_size = env.observation_space.n
Q = np.zeros((state_size, action_size))

alpha = 0.1 gamma = 0.99 total_episodes = 10000

Frozen Lake 環境のスナップショット画像。

Pythonで学ぶGymnasiumによるReinforcement Learning

epsilon_greedy() の実装

def epsilon_greedy(state):

if np.random.rand() < epsilon: action = env.action_space.sample() # Explore
else: action = np.argmax(Q[state, :]) # Exploit return action
Pythonで学ぶGymnasiumによるReinforcement Learning

ε-greedy の学習

epsilon = 0.9   # Exploration rate

rewards_eps_greedy = []
for episode in range(total_episodes):
    state, info = env.reset()
    terminated = False
    episode_reward = 0
    while not terminated:
        action = epsilon_greedy(state)
        new_state, reward, terminated, truncated, info = env.step(action)       
        Q[state, action] = update_q_table(state, action, new_state) 
        state = new_state

episode_reward += reward rewards_eps_greedy.append(episode_reward)
Pythonで学ぶGymnasiumによるReinforcement Learning

減衰付き ε-greedy の学習

epsilon = 1.0   # Exploration rate
epsilon_decay = 0.999
min_epsilon = 0.01

rewards_decay_eps_greedy = [] for episode in range(total_episodes): state, info = env.reset() terminated = False episode_reward = 0 while not terminated: action = epsilon_greedy(state) new_state, reward, terminated, truncated, info = env.step(action) episode_reward += reward Q[state, action] = update_q_table(state, action, new_state) state = new_state rewards_decay_eps_greedy.append(episode_reward)
epsilon = max(min_epsilon, epsilon * epsilon_decay)
Pythonで学ぶGymnasiumによるReinforcement Learning

戦略の比較

avg_eps_greedy= np.mean(rewards_eps_greedy)
avg_decay = np.mean(rewards_decay_eps_greedy)
plt.bar(['Epsilon Greedy', 'Decayed Epsilon Greedy'],
        [avg_eps_greedy, avg_decay], 
        color=['blue', 'green'])
plt.title('Average Reward per Episode')
plt.ylabel('Average Reward')
plt.show()

棒グラフ。ε-greedy の平均報酬は約0.02、減衰付き ε-greedy は約0.55。

Pythonで学ぶGymnasiumによるReinforcement Learning

Passons à la pratique !

Pythonで学ぶGymnasiumによるReinforcement Learning

Preparing Video For Download...