引入
强化学习是与人类的学习最为相似的一种算法,它根据现有的经验和当前的环境做出预判,然后选择下一步的目标和行动。
强化学习、有监督学习、无监督学习,有着不同的方法和不同的使用场景。有监督学习适合解决具体而确定的,已知答案的问题,比如分类问题;无监督学习用于从大量数据中发现内在结构;而强化学习既不像有监督学习定义了绝对的对错,也不像无监督学习那样毫无反馈,它通过与环境的互动,环境对行为的反馈来建立模型,在建模过程中最大化反馈收益。一般针对的问题往往需要经过很多步骤,最终找到已知的最佳组合,得到一序列步骤构成整体解决方案。
举例说明:假设一个智能体agent希望在下图中找到一条最佳路径,如果它保持好奇心不断向前尝试,已知领域将会不断扩大,这便是exploring****探索:在接触陌生领域时,因为没有经验只能不断随机选择……如同从下图中的a点出发,不断向右探索,如果路径不断向右延展,则永远找不到答案,这似乎并不是理想的模式。
与探索同样重要的是exploiting利用——就当前已知的方案里找到最优行为,也就是使用贪婪算法,这种方法只涉及已有经验,而不探索更多可能性,简单地说就是只看眼前。在上图的例子中,假设在a节点(状态State),选择向上去b(动作Action),还是向下去c。如果只探索过a,b,c三个节点,且b优于c,那么之后每次在a点都选择向b方向前进,就放弃了c路径之后的所有可能性,这样一般只能找到局部最优解。
探索和利用之间并没有绝对的谁优谁劣,在算法的世界里,长线最优解是将二者结合,早期的方案是设定一个比例ε比如80%,在80%的情况下选择当前最优解,在另外20%的情况下选择自由探索。这样在大多数情况下使用贪婪算法,而少数情况下自由选择叫做近似贪婪算法(near-greedy)。
过于保守可能会错失好机会,而过多尝试又可能浪费大量时间,最终一事无成。那么该如何选择ε的大小?选择与前期制定的策略有关,也与具体的情境有关。仍以上图为例,如果选b点得99分,选c点得1分,则选b更加合理;如果选b得51分,选c得49分,应更倾向于随机选择(越是未知的领域,越让人好奇)。而上述的分值是通过反复迭代:进行每一次选择,以及对选择的评价(Reward奖励)综合计算得出的,随着不断尝试,分值也不断调整。
过程中通过奖励判别策略的好坏,进一步调整策略,以便下次遇到同样场景(状态)时,能做出更好的选择(动作),同时重新评估各个状态的价值Value,以求最终得到奖励最大的策略。
如果一个问题面临多种可能,最笨的办法是穷举出所有可能性,一一比较,但一般情况下,不可能访问所有节点,只是尽量用最小的产出获得整体最大的收益,强化学习的核心是在实践中通过不断试错来学习最好的策略。
强化学习最初并不知道“正确答案”是什么,在学习过程中得到行为的评分(但不知这个评分是好是坏),通过反复迭代,找到相对更好的方法。整个过程比有监督学习(学习具体的行为)更适合处理复杂而全局性的问题。
工具
OpenAI Gym是用于开发和测试强化学习算法的工具集,它包括很多仿真环境和数据。下面以ATARI乒乓球游戏作为示例,展示Gym的用法。
首先,安装Python三方库:
$ sudo pip install gym
$ sudo pip install gym[atari] # 安装ARARI游戏数据
测试乒乓球对战环境
import gym
import time
env = gym.make('Pong-ram-v0') # 建立乒乓球游戏环境
print(env.action_space) # 显示动作空间:可选动作
print(env.observation_space) # 显示状态空间:可观测到的状态
env.reset() # 重置环境
for _ in range(1000):
env.render() # 渲染并显示
env.step(env.action_space.sample()) # 随机选择动作, 若将其变成策略即可测试算法
time.sleep(0.01) # 停留0.01秒,否则显示速度太快
env.close() #关闭环境
上述程序中建立了一个乒乓球游戏场景,左边的球拍由电脑操作,右边由开发者操控,可控制球拍向上或向下移动。希望建立一套策略,根据当前的状态(图像)选择下一步的行为(向上或向下移动的概率),目标是每次都能接住球。
这样处理明显无法解决乒乓球对战问题,击中与否是多步操作共同作用的结果,它不像图像识别之类的训练,一张图片就对应一个结果;而是多个步骤对应最终结果,过程中需要不断决策,需要对每一步打分。其过程如下图所示:
比较简单的方法是:若经过一个过程得到的分值高,则给其中每一步加分;分值低,则给每一步减分。尽管成功并不说明其中每一步都做得对,但是经过大规模的训练,则能取得更大胜算。
重要概念
从上述示例中可以看到,强化学习中有以下重要元素:
-
状态State:当前场景就是状态,例如第一个例子中的每一个圆圈就是一个状态,第二个例子中每一张图就是一个状态。
-
动作Action:在某一状态下可以选择的行为是动作,当执行某一动作之后,状态也会随之改变。
-
奖励Reward:奖励是环境对动作的反馈,用于评价单步动作。多个步骤的奖励累加起来可以计算动作或者状态的价值。一般将解决问题的过程拆分成多个步骤,每个步骤都有其状态,动作,以及动作对应的奖励。
-
策略Policy:在某种环境state下采取什么动作action,由开发者控制。
-
动作价值action value:动作价值是某种状态下做某个动作的价值,也就是状态与动作组合的价值(the values of state–action pairs)。动作价值记作Qπ (s, a),它是在使用策略π时,对状态s做动作a的评价。一般的策略是:选择评分最高的动作。
- 状态价值state-value 状态值函数一般记作Vπ(s),它是使用策略π时,对状态s的估值。它是通过每一次经过s的实验所得到的奖励reward取均值得到的。某一点的状态不仅取决于该点的得分,还需要考虑该状态可能产生的所有可能的动作序列,以及产生的回报,共同的判别这个状态是好是坏。
强化学习问题,首先要定义出可能的状态,可选的行为,以及各种可能的奖励。目标是在每一种状态之下采取什么行动能得到最高的奖励。状态值函数取决于策略,而策略又往往根据价值得出。
学习资料
强化学习入门文章推荐:http://karpathy.github.io/2016/05/31/rl/,虽然是英文文档,但有很多例子,很容易读懂。
强化学习教程推荐Sutton 教授的精典教材《Reinforcement Learning》,英文版可以从网络下载:http://incompleteideas.net/sutton/book/bookdraft2017nov5.pdf(全书70多M)。
该书配套的代码:https://github.com/dennybritz/reinforcement-learning
这是一个标星过万的强化学习例程,使用Python,OpenAI Gym和Tensorflow实现了动态规划、蒙特卡洛、Q学习、梯度策略等很多重要的强化学习算法,并提供各个算法的相关学习资料。