强化学习(3)

作者: zidea | 来源:发表于2019-09-18 20:50 被阅读0次

    ​我们用 Q learning 来解决一个实际问题。

    搭建环境

    我们都知道环境作为强化学习一部分是十分重要部分,可以理解为深度学习的中数据。但是自己编环境是一件很耗时间费力的工作。为了节约我们很多时间让我们更好地专注于训练模型,可以通过第三方库来实现环境的搭建。OpenAI gym 就是这样一个库。提供了很多优秀的模拟环境. 我们的各种 RL 算法都能使用这些环境。

    我们都知道环境作为强化学习一部分是十分重要部分,可以理解为深度学习的中数据。但是自己编环境是一件很耗时间费力的工作。为了节约我们很多时间让我们更好地专注于训练模型,可以通过第三方库来实现环境的搭建。OpenAI gym 就是这样一个库。提供了很多优秀的模拟环境. 我们的各种 RL 算法都能使用这些环境。

    我们都知道环境作为强化学习一部分是十分重要部分,可以理解为深度学习的中数据。但是自己编环境是一件很耗时间费力的工作。为了节约我们很多时间让我们更好地专注于训练模型,可以通过第三方库来实现环境的搭建。OpenAI gym 就是这样一个库。提供了很多优秀的模拟环境. 我们的各种 RL 算法都能使用这些环境。

    env = gym.make("MountainCar-v0")
    
    env.reset()
    

    首先将环境恢复到初始设置,然后将表示一个 episode 结束标识 done 设置 False。

    while not done:
    
    image

    gym 提供的环境比较直观,一辆小车需要通过强化学习到达右侧小山山顶的小旗位置。左侧小山的斜坡应该是助力的作用。

    while not done:
    

    输出结果应是小车 state,小车 state 用小车位置和速度表示。我们根据之前学习内容了解 reward 是关于 state 函数。设计 Q 表面也是按状态划分的,Q 输入是 state 和 action 输出是 Value。

    [-0.38738474 -0.0090797 ]
    

    不过这里 state 过多,我们需要重新划分一下 state 来设计一个合理大小的 Q 表。我们需要离散地选取值。

    print(env.observation_space.high)
    

    我们输出一下 agent 观察环境的位置和速度的范围。action 取值范围 0 ,1,2。

    [0.6  0.07]
    

    我们看一看位置为 0.6 - (-1.2) = 1.8 ,而对于速度为 0.07 - (-0.07) = 0.14 。

    DISCRETE_OS_SIZE = [20] * len(env.observation_space.high)
    

    这里 20 我们根据经验得到,这里有点投机取巧。

    DISCRETE_OS_SIZE = [20] * len(env.observation_space.high)
    

    输出也就是将取值范围均匀划分 20 区域,然后对于 20 作为一个离散划分为 400 中 state

    [0.09  0.007]
    
    import numpy as np
    

    我们看一下基本运算,这段代码可以完全忽略,仅是帮助你理解

    设计 Q table 我们我先输出一下每个状态所对应的 reward

    print(reward,new_state)
    

    所有 state 都是 -1 ,仅当小车到达小旗位置时候 state 得到 reward 为 0

    (-1.0, array([-0.19956175, -0.00089178]))
    
    q_table = np.random.uniform(low=-2,high=0,size=(DISCRETE_OS_SIZE + [env.action_space.n]))
    

    我们 20 * 20 个 3 表示每一个,为什么是 20 * 20 维度也就是分别是速度和位置两个维度,两个维度确定出 400 state 每一个 state 有 3 速度值。t

    (20, 20, 3)
    
    def get_discrete_state(state):
    
    discrete_state = get_discrete_state(env.reset())
    

    输出一个 state 为 (8,10) 然后在我们之前创建好正态分布位置的值。

    (8, 10)
    
    LEARNING_RATE = 0.1
    

    表示小车学习速率,值越大表示小车学习越快。

    #gamma
    

    discount 就是我们之前提及到 gamma 值表示未来的 value 对当前 value 的影响。也就是我们对未来的回报的在意程度。

    episode 我们一共要进行 25000 次试验,看一看多少 episode 可以得到我们想要结果。

    SHOW_EVERY 因为渲染成本比较高,我们仅每 2000 次进行一次渲染。

    随机生产一个 Q table 对于每一个可能 state 的 reward 取值范围 -2 到 1 这是因为只有小旗位置的 reward 为 0 其他都是 -1,这一点之前都已经证明过了。

    q_table = np.random.uniform(low=-2,high=0,size=(DISCRETE_OS_SIZE + [env.action_space.n]))
    
    new_state[0] > env.goal_position:
    

    当前 state 状态位置值为 0 时候表示小车已经到底顶点,所以 q_table 值为 0

    discrete_state = new_discrete_state
    

    更新当前 state 为新的 new_state,也就是将当前 state 更新下一个 state 然后进入下一轮。

    def get_discrete_state(state):
    
    action = np.argmax(q_table[discrete_state])
    

    根据 Q table 的 action 找到对应 value 最大 action 作为该 state 下采取 action。

    new_discrete_state = get_discrete_state(new_state)
    

    然后根据 action 我们将得到下一个 state 为 new_state 并且对其进行标准化为 new_discrete_state

     max_future_q = np.max(q_table[new_discrete_state])
    

    这段代码也我们之前公式的体现,也就是 Q learning 的核心。max_future_q 下一个 state 最大估计值,然后 current_q 为当前的值,我们用当前 current_q 值 + (在state得到 reward 加上下一个 state 估计值)这就是 Q learning 公式体现。

    import gym
    

    到 2000 时候,强化学习就已经取得到达小旗位置。

    image

    相关文章

      网友评论

        本文标题:强化学习(3)

        本文链接:https://www.haomeiwen.com/subject/ziakuctx.html