在探索与利用间取得平衡

Python 中的 Gymnasium 强化学习

Fouad Trad

Machine Learning Engineer

使用随机动作训练

  • 智能体探索环境
  • 不根据所学进行策略优化
  • 训练结束后才利用所学

图片:环境中的智能体

Python 中的 Gymnasium 强化学习

探索—利用权衡

 

  • 权衡探索与利用
  • 持续探索会阻碍策略精炼
  • 只利用会错过尚未发现的机会

图片:智能体一边尝试新动作以发现更多回报,一边利用已有知识但可能错过部分回报。

Python 中的 Gymnasium 强化学习

就餐选择

图片:餐厅餐桌。

Python 中的 Gymnasium 强化学习

Epsilon-greedy 策略

 

  • 以概率 epsilon 探索

图示:以概率 epsilon,智能体通过随机选择动作来探索。

Python 中的 Gymnasium 强化学习

Epsilon-greedy 策略

 

  • 以概率 epsilon 探索
  • 以概率 1-epsilon 利用
  • 在使用已知策略的同时保持持续探索

图示:以概率 epsilon 随机选动作进行探索;以概率 1 - epsilon 选择当前最优动作进行利用。

Python 中的 Gymnasium 强化学习

衰减的 Epsilon-greedy 策略

 

  • 随时间降低 epsilon
  • 初期更多探索
  • 后期更多利用
  • 逐步更多依赖累积知识

图示:epsilon 随时间下降。

Python 中的 Gymnasium 强化学习

在 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 强化学习

实现 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 强化学习

训练 Epsilon-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 强化学习

训练衰减的 Epsilon-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 强化学习

策略对比

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()

柱状图:epsilon-greedy 的平均回报约 0.02,衰减的 epsilon-greedy 约 0.55。

Python 中的 Gymnasium 强化学习

让我们练习!

Python 中的 Gymnasium 强化学习

Preparing Video For Download...