强化学习实战之QLearning实现滑动杆小游戏
嘿嘿!本篇也是学姐粉丝的投稿!“上次的征稿活动”还在继续!投稿就会有奖品的!真不是学姐偷懒用粉丝的投稿发推文,是他们写的真的很不错,迫不及待的想把他们总结的精华都展现出来给大家!
废话不多说,今天的学习从玩个游戏(滑动杆CartPole)开始,看下图。我们的目标是,我们通过向左或向右滑动滑块来保证杆子始终在滑块的上方。下图我设置随机滑动滑块,展现出来就是这样一个效果。

经过该篇文章学习后,你能通过强化学习操控滑块,达到如下的一个效果。

首先需要安装Gym,即游戏仿真平台。使用pip install gym,即可完成安装。需要注意的是,如果使用google colab等在线编程平台就不能成功弹出可视化图像。建议本地运行。
CartPole游戏比较有名,大多数强化学习入门教材都会使用这个例子。
文章后面有完整源代码。
01 具体操作步骤
1.1 gym使用
如上代码,

看到这里不难发现,该游戏的行为(action)只有向左或向右移动滑块。也就是说,想要玩好这个游戏。我们需要有一个策略决定如何在不同的环境下,来向左或向右移动滑块。
什么是不同的环境?在该游戏的背景下,滑块的位置,滑块的速度,滑块的杆的角度以及滑块杆的角速度,这四点确定,是不是我们就可以说环境确定下来了。OK,先不管这么多,看结果输出。
结果:

对了,还有一个很重要的没讲。如下代码env.step将返回四个值。
obs是一个数组,包含滑块的位置,滑块的速度,滑块的杆的角度以及滑块杆的角速度。
rew即reward,强化学习里面的概念。如果游戏始终进行,其值就为1;game over 该值为0。
done:要不怎么说这是游戏仿真器呢,如果滑块上的杆不在滑块上方,done为True,否则为False。当done为True是,也就意味着游戏结束。看如下代码,你的感触会更深。
info:没什么用。

结果:

1.2 QLearning介绍
就这个游戏进行展开:
问题定义:
玩好这个游戏,我们可以换一种具体的表述,即在环境观察值 observation确定的情况下,如何对行为 action进行预测。
更具体点就是,给定滑块的位置,滑块的速度,滑块的杆的角度以及滑块杆的角速度,我们如何判断下一步的行为,即滑块向左还是向右滑动。
这样太断然了,更合理的定义应该是:给定环境观测值以及相应地行为标识,我们输出对应行为的概率。

问题分析:
我们自然想到使用字典来维护这个映射。
字典的keys由环境观察值的四元组+行为的标识组成(行为值为0向左,1向右)构成。
values由一个数值构成,代表进行对应行为概率(置信度)。
如此,只要我们成功维护该字典,玩游戏时,就能通过字典的key(环境观察值及行为标识),找到其value,与环境观察值相同的其他行为标识value值进行比较,进而选择可能性更大的走法。
Qlearning中的Q,其实就是我们这里的字典
字典如何维护?
刚玩游戏时,字典Q是空的,代表我们没有任何经验。引入一个概念,利用与探索(即经验与试错)。在让模型玩游戏的过程中,以一定的概率(ϵ)来进行利用与探索。
利用:代表使用当前已有的Q字典进行决策,按照决策行动后,还没有game over的话,那就给这个决策奖励,即相应的行为probability增加。
探索:代表随机进行决策,同样的,按照决策行动后,还没有game over的话,那就也给这个决策奖励。
Tips:利用过程刚开始为字典空,那就意味着向左向右的概率相同,也就相当于探索。
那如何通过具体的奖励(reward)来更新行动的概率值呢?QLearning这样做,如下。
QLearning公式:

其中s就是当前环境观察值,a就是行为标识,α就是学习率,r就是reward奖励,s′与a′就是决策后的环境与行为,γ是对未来reward的衰减值。为什么如上公式有效,全网有很多理论证明,我这里就不细说了。
不断玩游戏,Q字典就不断得到完善。如上表示可能还不是很清晰,具体细节可看如下代码,也很简单。
1.3 生成Q表
其实讲到现在还有个问题没有解决。你想啊,我们的环境观察值虽然是四元组,但是其中每一个值都是连续的。这不就代表游戏中有无数多种环境吗?那这个字典还怎么维护的了。我们需要将其离散化。使用如下函数即可。
训练生成Q表:
如上代码进行了1万次的游戏。Q表已经维护的比较好了。接下来我们就要利用Q表信息,完成可视化。
1.4 Q表决策
结果:

02 源代码
03 总结
关于QLearning中的超参数设置有讲究。不同的超参数得到的实验结果相差很大,如果是做一个陌生的课题,调参是很有必要的。
QLearning算法,像这种环境简单,决策也简单的模型,尚可驾驭。但象棋,围棋甚至王者荣耀这种决策游戏,环境状态可以多到比天上的星星还多,恐怕计算机内存再大也无法存储下Q表。这时候神经网络就来了,这两者的结合就是天造地设。
神经网络能够识别模式,也就是说环境状态虽然多,但只要让网络学习到了环境状态到决策的映射,我们无需维护Q表,使用网络直接就能生成Q值。
参考资料:
https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/intro-q-learning/
https://github.com/microsoft/ML-For-Beginners/tree/main/8-Reinforcement/1-QLearning
如有雷同文章,那就是学姐粉丝写的【狗头】
如果你有什么想法,可以来学姐的交流群,交流一下!关注【学姐带你玩AI】公众号后台回复“加群”即可!
