强化学习3--MC Basic

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

个人笔记,恳求纠错,请勿转载

内核

在这里插入图片描述
本次要学习的是Monte Carlo算法,这是我们学的第一个model-free的算法,它和policy iteration本质上的区别就是没有模型。
在机器学习中,没有模型就意味着必须有足够多的数据来支撑研究,因此MC算法的数学核心就是大数定律。

一、MC Basic

在policy iteration 基于模型的部分是什么呢,根据李航老师的《统计学习方法》可以知道,policy iteration 中的模型其实就是条件概率。(理解为做实验如果你提前知道实验成功的概率,就是心中有数这个实验有多少概率会成功,其实这就是一个模型。如果你只是得到return而没有提前知道实验概率那就是无模型)
policy iteration 中的其中一步:
在这里插入图片描述
求解最大的qΠk的时候,其中的两个条件概率就是模型。所以为了避免模型,我们选择第二种求解方法,直接求解期望:
在这里插入图片描述
实际上就是多执行该动作几次,将得到的诸多return求平均。
所以MC Basic本质上与policy iteration 是一样的:

在这里插入图片描述
只是在setp1时policy iteration可以根据模型直接算出qΠk,而MC Basic则需要取多个episodes,然后取平均值,其它一模一样捏。

二、例子说明

在这里插入图片描述
先说明一下这个例子,这个例子各个s1中的policy都是确定的,如图箭头所示。
那我们第一步就是进行估计qΠk,由于对全部九个格子进行策略更新需要时间成本太多,只考虑s1:
在这里插入图片描述
在这里插入图片描述
从上图可知qΠ0(s1,a2)= qΠ0(s1, a3)为最大qΠk,所以选a2和a3都可以,这样我们就完成了对s1这个state策略的更新,个人感觉很简单。
episode的长度选择距离终点最远空格到达终点所要步数的值的大小就行。
如上面例子所示s1到达终点需要五步,所以episode选5比较好。

三、MC Basic代码

1.伪代码

在这里插入图片描述
1.遍历每个s对应的a,收集足够多的episodes,分别求出qΠk;
2.选取最大的qΠk,进行policy的更新。

``

2.代码

import numpy as np
from gridWorldGame import standard_grid, negative_grid,print_values, print_policy

SMALL_ENOUGH = 1e-3
GAMMA = 0.9
ALL_POSSIBLE_ACTIONS = ('U', 'D', 'L', 'R')

def play_game(grid, policy):
    start_states = list(grid.actions.keys())  # 将actions输入start ,actions中不包括(0,3) (1,3)的keys
    start_idx = np.random.choice(len(start_states)) # 随机选择index
    grid.set_state(start_states[start_idx])  #
    s = grid.current_state() # 前四句是为了随机选择一个初始policy,赋值给s
    states_and_rewards = [(s, 0)]
    while not grid.game_over():
        a = policy[s]
        r = grid.move(a)
        s = grid.current_state()
        states_and_rewards.append((s,r))    # 一直走直到游戏结束,states_and_rewards里存储了所有步的r
    G = 0   #state_value = 0
    states_and_returns = [] #
    first = True
    for s, r in reversed(states_and_rewards): # 就是反转,最后一步为什么要被取消?
        if first: # 为什么忽略最后的rewards,按理说到达终点应该会有1的reward
            first = False
        else:
            states_and_returns.append((s, G))
        G = r + GAMMA*G
    print(states_and_returns)
    states_and_returns.reverse()
    return states_and_returns

grid = standard_grid()
policy = {
    (2, 0): 'U',
    (1, 0): 'U',
    (0, 0): 'R',
    (0, 1): 'R',
    (0, 2): 'R',
    (1, 2): 'R',
    (2, 1): 'R',
    (2, 2): 'R',
    (2, 3): 'U',
}
V = {}
returns = {}
states = grid.all_states()
for s in states:   # 感觉就是为了初始化所有格子的reward为0
    if s in grid.actions:
        returns[s] = []
    else:
        V[s] = 0

for t in range(100):
    states_and_returns = play_game(grid,policy)
    seen_states = set()
    for s, G in states_and_returns: # 如果s
        if s not in seen_states:
            returns[s].append(G)
            V[s] = np.mean(returns[s])
            seen_states.add(s)
for s in policy.keys():
    best_a = None
    best_value =float('-inf')
    for a in ALL_POSSIBLE_ACTIONS:
        grid.set_state(s)
        r = grid.move(a)
        v = r + GAMMA * V[grid.current_state()]
        if v > best_value:
            best_value = v
            best_a = a
    policy[s] = best_a

print("final values:")
print_values(V, grid)
print("final policy:")
print_policy(policy, grid)



代码步骤 1.创建了一个表格,表格里所有的格子的policy都已经确定;
2.play_game()函数,随机选取state以及第一个policy进行游戏,创建episode,返回episode行走路径中的所有reward值(注意每个格子的policy都是确定的,因此,基本等于固定游玩,只是初始位置和初始policy不同);
3.循环一百次,也就相当于从每次随机从一个格子选取随机策略开始游戏,创建多个episodes,最后取得这个格子进行游戏的state_value平均值。
4.和truncated iteration 一样,最后进行策略更新。

3.代码结果

在这里插入图片描述

总结

个人感觉MC Basic代码对于很多state已经确定policy的情况下,且数据量十分少的情况下,还是可以使用的。
和之前两种算法的区别在于,前半部分value iteration和policy iteration都是采用贝尔曼公式来计算的,就是该方法会默认提前知道了条件概率,也就是模型,如p(s,a):玩家在s选取a动作的概率。而MC Basic则是基于大量数据计算,得到了各个state得state_value。

摘录于:https://github.com/rookiexxj/Reinforcement_learning_tutorial_with_demo/blob/master/monte_carlo_demo.ipynb

https://www.bilibili.com/video/BV1sd4y167NS/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rookiexxj01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值