蒙特卡洛方法

Python 中的 Gymnasium 强化学习

Fouad Trad

Machine Learning Engineer

回顾:基于模型的学习

 

  • 依赖环境动态的已知信息
  • 不与环境交互

上一视频中的策略迭代与价值迭代流程图。

Python 中的 Gymnasium 强化学习

无模型学习

 

  • 不依赖环境动态的先验知识
  • 智能体与环境交互
  • 通过试错学习策略
  • 更适用于真实场景

机器人与象棋环境交互的图像。

Python 中的 Gymnasium 强化学习

蒙特卡洛方法

  • 无模型技术
  • 基于回合估计 Q 值

展示收集到的回合骨架:状态、动作、回报和回报和。

Python 中的 Gymnasium 强化学习

蒙特卡洛方法

  • 无模型技术
  • 基于回合估计 Q 值

估计 Q 值的第二步示意,以及 Q 表的结构:行数等于状态数,列数等于动作数。

Python 中的 Gymnasium 强化学习

蒙特卡洛方法

  • 无模型技术
  • 基于回合估计 Q 值

展示推导最优策略最后一步的图像,即将每个状态映射到最优动作。

  • 两种方法:首次访问每次访问
Python 中的 Gymnasium 强化学习

自定义网格世界

自定义网格世界,共 6 个状态,2 行 3 列,从左上角(0)到右下角(5)编号。智能体在状态 3,状态 4 有山,目标在状态 5。png

Python 中的 Gymnasium 强化学习

收集两个回合

按状态、动作、回报和回报和展示的第一个回合。

按状态、动作、回报和回报和展示的第二个回合。

Python 中的 Gymnasium 强化学习

估计 Q 值

两次回合的状态、动作、回报和回报和。

  • Q 表:存放 Q 值的表

需要填写的空 Q 表。

Python 中的 Gymnasium 强化学习

Q(4, left), Q(4, up), 和 Q(1, down)

两次回合的状态、动作、回报和回报和,其中高亮 (4, left)、(4, up)、(1, down)。

  • (s,a) 仅出现一次 -> 用该回报填充

Q 表中已填入 (4, left)、(4, up)、(1, down) 的值。

Python 中的 Gymnasium 强化学习

Q(4, right)

两次回合中均高亮 (4, right) 的状态、动作、回报和回报和

  • (s,a) 每回合出现一次 -> 取平均

Q 表中 (4, right) 的值由两次回合回报的平均填充。

Python 中的 Gymnasium 强化学习

Q(3, right)——首次访问蒙特卡洛

两次回合中仅首次出现时高亮 (3, right) 的状态、动作、回报和回报和

  • 对每回合首次访问的 (s,a) 求平均

Q 表中 (3, right) 的值取高亮行(首次出现)的回报平均。

Python 中的 Gymnasium 强化学习

Q(3, right)——每次访问蒙特卡洛

两次回合中每次出现都高亮 (3, right) 的状态、动作、回报和回报和

  • 对每回合内每次访问的 (s,a) 求平均

Q 表中 (3, right) 的值取高亮行(每次出现)的回报平均。

Python 中的 Gymnasium 强化学习

生成一个回合

def generate_episode():
    episode = []
    state, info = env.reset()

terminated = False while not terminated: action = env.action_space.sample()
next_state, reward, terminated, truncated, info = env.step(action)
episode.append((state, action, reward)) state = next_state
return episode
Python 中的 Gymnasium 强化学习

首次访问蒙特卡洛

def first_visit_mc(num_episodes):
    Q = np.zeros((num_states, num_actions))
    returns_sum = np.zeros((num_states, num_actions))
    returns_count = np.zeros((num_states, num_actions))

for i in range(num_episodes): episode = generate_episode() visited_states_actions = set()
for j, (state, action, reward) in enumerate(episode):
if (state, action) not in visited_states:
returns_sum[state, action] += sum([x[2] for x in episode[j:]])
returns_count[state, action] += 1 visited_states_actions.add((state, action))
nonzero_counts = returns_count != 0
Q[nonzero_counts] = returns_sum[nonzero_counts] / returns_count[nonzero_counts] return Q
Python 中的 Gymnasium 强化学习

每次访问蒙特卡洛

def every_visit_mc(num_episodes):
    Q = np.zeros((num_states, num_actions))
    returns_sum = np.zeros((num_states, num_actions))
    returns_count = np.zeros((num_states, num_actions))    

    for i in range(num_episodes):
        episode = generate_episode()  

        for j, (state, action, reward) in enumerate(episode):

            returns_sum[state, action] += sum([x[2] for x in episode[j:]])
            returns_count[state, action] += 1


    nonzero_counts = returns_count != 0
    Q[nonzero_counts] = returns_sum[nonzero_counts] / returns_count[nonzero_counts]
    return Q
Python 中的 Gymnasium 强化学习

获取最优策略

def get_policy():
    policy = {state: np.argmax(Q[state]) for state in range(num_states)}    
    return policy
Python 中的 Gymnasium 强化学习

综合演示

Q = first_visit_mc(1000)

policy_first_visit = get_policy()
print("First-visit policy: \n", policy_first_visit)
Q = every_visit_mc(1000)
policy_every_visit = get_policy()
print("Every-visit policy: \n", policy_every_visit)
First-visit policy:
{0: 2, 1: 2, 2: 1, 
 3: 2, 4: 2, 5: 0}

Every-visit policy:
{0: 2, 1: 2, 2: 1, 
 3: 2, 4: 2, 5: 0}

以箭头形式展示每个状态的最优动作的最优策略图。

Python 中的 Gymnasium 强化学习

开始练习吧!

Python 中的 Gymnasium 强化学习

Preparing Video For Download...