强化学习(3)
我们用 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