增强学习(2) Q Learning
Q Learning
家长都会反对小朋友一边看电视一边吃饭,不过小朋友为了抓紧时间提供效率往往会选择一边看电视一边吃饭。所以生活中有许多准则。也就是吃完饭再看电视会得到奖励反而会得到训斥。
其实根据家长反馈我们会决定是
- 先吃饭看电视
- 看电视同时吃饭
这是两种选择,如果没有随后家长反馈,我们的选择是随意。不过随后家长反馈会影响小朋友以后决策。这也就是 QLearning。
用数据也就是计算机能够理解来分析一下小朋友成长过程,现在吃饭(状态 s1)接下来可能有两个行为看电视(a1)还是继续吃饭(a2)。不过接下来行为会获得潜在奖励我们用 Qtable 来表示
图
从上面表格来看 Q(s1,a1) 小于 Q(s1,a2),所以我们选择行为 a2 是 s1 状态的行为,然后就进入到下一个状态 s2 ,同样我们可以查询在 s2 中我们行为的
图同样我们需要查询 Q 表来决定我们在 s2 状态选择的行为,因为 S2 状态是我们预测出来实际上还没有到达 s2 状态。所以我们需要将在 s2 做出选择后的奖励值乘以一个衰减值r 然后加上在 s1 实实在在得到奖励值 R 也就是 R+rmaxQ(s2)
我们将 R+rmaxQ(s2) 作为现实中Q(s1,a2) 的值,在 Q 表上的值都是估计值,之前 Q(s1,a2)是我们估计出来的值。
将新的 Q(s1,a2) = 老 Q(s1,a2) + a*差距(差距是现实值减去估计值)
Q Learning 是一种 value-base 方法,学习结果是评价现在行为有多好或者有多不好,是一种增强学习的一种。
通过动手实践是最好的学习手段,
import gym
创建环境
env = gym.make("MountainCar-v0")
初始化环境
env.reset()
图
done = False
while not done:
action = 2
# volecity positon
new_state, reward, done, _ = env.step(action)
print(new_state)
env.render()
env.close()
这里定义 3 个动作来操作小车,0 推动小车左移动 1 不做任何操作而 2 表示推动小车右移动。这里定义 2 表示向右给小车一个力。step 表示每一步都进行操作(action)返回 new_state 表示小车的当前状态位置和速度。打印()数据如下
[-0.3553034 0.00149003]
[-0.35402264 0.00128076]
[-0.35295955 0.00106309]
[-0.35212108 0.00083847]
我们的目标让小车通过学习达到小旗的位置。
print(env.observation_space.high)
print(env.observation_space.low)
print(env.action_space.n)
我们打印出一些与环境相关的参数。
[0.6 0.07]
[-1.2 -0.07]
3
3 表示 3 操作我们可以用到,上面已经提到了,observation_space 表示我们观察空间间隔,这里我们需要调整一下。来得到我们想要大小 Q table。
DISCRETE_OS_SIZE = [20] * len(env.observation_space.high)
discrete_os_win_size = (env.observation_space.high - env.observation_space.low) / DISCRETE_OS_SIZE
print(discrete_os_win_size)
创建 Q table
new_state, reward, done, _ = env.step(action)
print(reward,new_state)
如果我们输出 reward 会发现 reward 总是 -1,当我们小车达到目标时候才会得到反馈 0
(-1.0, array([-0.16686211, 0.0038182 ]))
(-1.0, array([-0.16423716, 0.00262495]))
(-1.0, array([-0.16281484, 0.00142232]))
(-1.0, array([-0.16260018, 0.00021466]))
(-1.0, array([-0.16359394, -0.00099376]))
(-1.0, array([-0.16579261, -0.00219867]))
(-1.0, array([-0.16918837, -0.00339576]))
(-1.0, array([-0.17376895, -0.00458059]))
q_table = np.random.uniform(low=-2,high=0,size=(DISCRETE_OS_SIZE + [env.action_space.n]))
(20, 20, 3)
图