深度学习程序员深度学习-推荐系统-CV-NLP

强化学习(3)

2019-09-18  本文已影响0人  zidea

​我们用 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
上一篇下一篇

猜你喜欢

热点阅读