什么是强化学习?

Reinforcement learning 是机器学习里面的一个分支,特别善於控制一只能够在某个环境下 自主行动 的个体 (autonomous agent),透过和 环境 之间的互动,例如 sensory perception 和 rewards,而不断改进它的 行为 

听到强化学习,你脑里应该浮现一只曱甴那样的小昆虫,那就是 autonomous agent 的形象:

对「环境」(environment) 这概念,你应该想到像以下这经典游戏的迷宫:

包括有追捕你的怪物、和吃了会加分的食物 (这些代表负值和正值的 rewards)。  当然,实际应用的「环境」和「奖励」可以是抽象的,这游戏是一个很具体的例子。

输入/输出

记住,reinforcement learning 的 输入 是:

  • 状态 (States) = 环境,例如迷宫的每一格是一个 state
  • 动作 (Actions) = 在每个状态下,有什么行动是容许的
  • 奖励 (Rewards) = 进入每个状态时,能带来正面或负面的 价值 (utility)

而输出就是:

  • 方案 (Policy) = 在每个状态下,你会选择哪个行动?

於是这 4 个元素的 tuple (S,A,R,P)就构成了一个强化学习的系统。   在抽象代数中我们常常用这 tuple 的方法去定义系统或结构。

再详细一点的例子就是:

  1. states S = 迷宫中每一格的位置,可以用一对座标表示,例如(1,3)
  2. actions A = 在迷宫中每一格,你可以行走的方向,例如:{上,下,左,右}
  3. rewards R = 当前的状态 (current state) 之下,迷宫中的那格可能有食物 (+1) 、也可能有怪兽 (-100)
  4. policy P = 一个由 状态 $\rightarrow$ 行动 的 函数,意即: 这函数对给定的每一个状态,都会给出一个行动。

(S, A, R)是使用者设定的, P 是算法自动计算出来的。

人与虫之间

第一个想到的问题是: 为什么不用这个方法打造人工智能?  但现时的强化学习算法,只对比较细小和简单的环境适用,对於大的复杂的世界,例如象棋的 $10^\mbox{xxx}$ 状态空间,仍是 intractable 的。

关键就是,高等智慧生物会在脑中建立世界的模型 (world model) 或知识 (knowledge), 而强化学习只是关心简单的「状态-行动」配对。

强化学习的领导研究者 Richard Sutton 认为,只有这种学习法才考虑到 自主个体环境奖励 等因素,所以它是人工智能中最 top-level 的 architecture,而其他人工智能的子系统,例如 logic 或 pattern recognition,都应该在它的控制之下,我觉得颇合理。

所以要制造 strong AI,一个可能的方案就是结合强化学习和某种处理复杂 world model 的能力:

程式

学 AI 最紧要有 program,不然就会很枯燥。  这是我在网上找到的一个特别简单的 demo,作者是 Travis DeWolf:

https://studywolf.wordpress.com/2012/11/25/reinforcement-learning-q-learning-and-exploration/

只要 Python 便可运行,但你可能要 install PyGame。

猫、老鼠、芝士:

猫的行动是简单地朝着老鼠追(没有智能),老鼠的行动是学习出来的。

注意,在 main program 和 cellular.py 这两部分,纯粹是定义了迷宫世界如何运作,基本上是一个 game,里面完全没有智能,你可以用{上、下、左、右} 控制各 agent 的活动,如此而已。

强化学习的程式在 qlearn.py,很短,而真正学习的程式基本上只有一句,就是:

def learnQ(self, state, action, reward, value):

oldv = self.q.get((state, action), None)

if oldv is None:

self.q[(state, action)] = reward

else:

self.q[(state, action)] = oldv + self.alpha * (value - oldv)

单是这一句程式,就能令老鼠学到避开猫、吃芝士。  以下再解释……

RL 算法的原理

《AI-a modern approach》这本书第 21 章有很好的简介。  《AIMA》自然是经典,很多人说他们是读这本书而爱上 AI 的。  这本书好处是,用文字很耐性地解释所有概念和原理,思路很清晰,使读者不致有杂乱无章的感觉。  例如 21 章 首先讲 passive reinforcement learning,意思是当 policy 是固定时,纯粹计算一下 agent 期望的价值(utility,即 rewards 的总和) 会是多少。  有了这基础后再比较不同 policies 的好坏。  这种思路在数学中很常见: 首先考虑简单到连白痴也可以解决的 case,然后逐步引入更多的复杂性。  例如数学归纳法,由 N=1 的 case 推到 N→∞ 。

为免重复,我只解释到明白 Q learning 的最少知识。

Utility (价值,或效用)

U 是一连串行动的 rewards 的总和。  例如说,行一步棋的效用,不单是那步棋当前的利益,还包括走那步棋之后带来的后果。  例如,当下贪吃一只卒,但 10 步后可能被将死。  又或者,眼前有美味的食物,但有些人选择不吃,因为怕吃了会变肥。

一个 state 的效用 U 就是: 假设方案固定,考虑到未来所有可能的 transitions,从这个 state 开始的平均期望的 total reward 是多少 :

$$ U(S_0) = \mathbb{E}[ \; \sum_{t=0}^{\infty} \; \gamma^t \; R(S_t) \; ] $$

其中 $\mathbb{E[\;]}$ 代表期望值,$\gamma$ 是 discount factor,例如 0.9 或什么。

实例: 考虑这简单的迷宫:

那些箭咀表示的是众多可能方案中的其中一个。

根据这个方案,由(1,1)开始的运行可能是这个结果:

下面橙色的值是每个 state 的 reward。  在这例子中,每个不是终点的格,也会扣 0.04 分。

但从同一起点,同一方案,也可以出现不同结果,例如在 (1,3) 企图向右爬,但实际结果是向下跌一格; 这些 state transitions 是由外在世界的机率决定的。  (例如某人读了大学文凭,但遇上经济不景,他的薪水未必能达到行动的预期效果。)

同一方案的运行结果可以是:

或者:

Temporal difference (TD) learning

这是 reinforcement learning 的中心思想

我们还是从简单情况开始:  假设方案固定,目标是学习每个 state 的 utility。

理想的 U(S) 值,是要从 state S 开始,试验所有可能的 transitions,再计算这些路径的 total rewards 的平均值。

实际上,agent 只能够每次体验一个行动之后的 state transition。

这时要用到另一个关键原理,即著名的 Bellman optimality condition。  它说,如果一系列的选择 ABCDE…… 是最优的,那么这系列除去开始的 A,那 BCDE…… 系列应用在后继的状态上也是最优的。 (例如,你从香港乘车到北京,选择了最便宜的路线,此路线经过 10 个车站,第二站是深圳,但如果除去出发点香港站,那么由第二站深圳到最后的北京站,这路线仍然是这 9 个站之间最便宜的。)

应用在我们的情况,一个 state S 的 U 值,是它自身的 reward,加上所有可能的后继 states 的 U 值,取其机率平均,再乘以 discount factor $\gamma$:

$$ U(S) = R(S) + \gamma \sum_{S‘} P(S \rightarrow S‘) \; U(S‘) $$

其中 P 是 transition 的机率,S‘ 是后继 state,$\sum$ 是对所有后继 states 求和。  换句话说,这是理想的 U(S) 和 U(S 的后继) 之间的关系,是一个 recursive relation。

例如,假设 agent 现时对 state (1,3) 和 state (2,3) 的估值,分别为 0.84 和 0.92。  又假设 agent 察觉到,根据现有方案,在 (1,3) 时总是会发生跳到 (2,3) 这个 transition。  那么这两个 states 的 U 值,应该符合这条约束:

$$ U(1,3) = -0.04 + U(2,3) $$

换句话说,这是两个 states 之间,U 值的 local (局部的)约束。

TD learning 的思想是:  假设其他 U(S‘) 的值正确,利用 Bellman optimality 来调整当下 state 的 U(S)。 当尝试的次数多了,所有 U 值都会趋向理想。 Agent 只需要用这条 update rule:

$$ U(S) \mbox{  +=  } \alpha ( \; R(S) + \gamma U(S‘) - U(S) \; ) $$

$\alpha$ 是 learning rate,它决定学习的速度(但它不能太大,避免 overshooting)。  后面那东西是 U(S) 和 U(S) 的估值 (estimation) 之间的差别。  对於理想的 U(S) 和 U(S‘),那差别会是 0。  而在每个 time step,我们只是用 $\alpha$ 部分地 调整这个差别。

这个 trick 其实贯穿很多机器学习的方法: 即,一步步地慢慢逼近理想值。  而,每次是增加一个微小的 $\Delta X$,这 $\Delta X$ 是由当前的 estimate 与某个理想约束之差得来的。

最后一提,在上面理想约束的公式里,有对於机率 P 的求和,但在 update formula 中 P 不见了。  那是因为 agent 在环境中的行动,暗含了对於 state transition 机率的 sampling (随机地取样本)。 换句话说,那机率求和是由 agent 本身体现的。

P 是 state transitions 的机率,换句话是关於世界的一个 model。 TD learning 不需要学习 P,所以叫 model-free learning。  但正如开篇时说过,model-free 并不一定是好事,人的智慧就是基於我们对外在世界有一些很好的 models。

Q value

Q 值只是 U 值的一个变种 ;   U 是对每个 state 而言的,Q 把 U 值分拆成每个 state 中的每个 action 的份量。  换句话说,Q 就是在 state S 做 action A 的 utility。

Q 的好处是什么?  下面将会介绍 active learning,而 Q value  配合 TD learning,可以在 active learning 中也消除 P,达到 model-free 的效果。

Q 和 U 之间的关系是:

$$ U(S) = \max_A  \; Q(A, S) $$

上面的 update rule 只要用这个关系改写就行:

$$ U(S) \mbox{  +=  } \alpha ( \; R(S) + \gamma \max_{A‘}  \; Q(A‘, S‘) - Q(A, S) \; ) $$

Active learning

在 passive learning 中,方案不变,我们已经能够计算每个 state S 的效用 U(S),或者每个 state S 之下行动 A 的效用 Q(S, A)。

如果方案是可以改变的,我们只需计算不同方案的 Q 值,然后在每个 state S 选取相应於最大 Q 值的行动 A,那就是最佳方案,不是吗?

实际上执行的结果,却发现这些 agent 的方案很差!  原因是,学习过程中的 Q 值是 estimate,不是理想的 Q 值,而如果根据这样的 Q 行动,agent 变得很短视,不会找到 optimal policy。  (例如,某人经常吃一间餐馆,但循另一路径走,可以发现更好的餐馆。)

Agent 需要尝试一些未知的状态/行动,才会学到 optimal policy;  这就是所谓的 exploration vs exploitation (好奇心 vs 短暂贪婪)之间的平衡。

方法是,人工地将未知状态的价值增加一点:

$$ U(S) = R(S) + \gamma \max_A \; \mathcal{F}[ \; \sum_{S‘} P(S \rightarrow S‘) U(S‘), \; N(A, S) \; ] $$

其中 N(A, S) 是状态 S 和行动 A 这对组合出现过(被经历过)的次数,$\mathcal{F}$ 是 exploration 函数,它平时回覆正常的 U 的估计值,但当 N 很小时(亦即我们对 S,A 的经验少),它会回覆一个比较大的估值,那代表「好奇心」的效用。

结语

本来想写一篇人人能读懂的 RL 简介,但发觉写到长篇大论才勉强解释完。  希望女朋友能读懂 :)

时间: 2024-10-06 03:26:23

什么是强化学习?的相关文章

深度强化学习Deep Reinforcement Learning 学习过程流水账

2016/10/23 这篇文章和那篇三维重建的流水账一样,用来记录一些关键资料来源和发牢骚. Python怎么学上手快,够用? 神经网络怎么上手? 强化学习怎么上手? 目标驱动,先去看用Python写的强化学习的代码,再去看一些实现各种神经网络的Python代码.再看两种融合的代码. 熟悉工作环境和工作所用工具,比如Tensorflow之类的.

【基础知识十六】强化学习

一.任务与奖赏 我们执行某个操作a时,仅能得到一个当前的反馈r(可以假设服从某种分布),这个过程抽象出来就是“强化学习”. 强化学习任务通常用马尔可夫决策过程MDP来描述: 强化学习任务的四要素 E = <X, A, P, R> E:机器处于的环境 X:状态空间 A:动作空间 P:状态转移概率 R:奖赏函数 学习目的: “策略”:机器要做的是不断尝试学得一个“策略” π,根据状态x就能得到要执行的动作 a = π(x) 策略的评价: 长期累积奖赏,常用的有“T步累积奖赏” 强化学习与监督学习的

强化学习 相关资源

最近因为某个不可描述的原因需要迅速用强化学习完成一个小实例,但是之前完全不懂强化学习啊,虽然用了人家的代码但是在找代码的过程中还是发现了很多不错的强化学习资源,决定mark下来以后学习用 [1]如何用简单例子讲解 Q - learning 的具体过程? https://www.zhihu.com/question/26408259 [2]最简单的讲解Q-Learning过程的例子 http://mnemstudio.org/path-finding-q-learning-tutorial.htm

深度强化学习(Deep Reinforcement Learning)入门:RL base &amp; DQN-DDPG-A3C introduction

转自https://zhuanlan.zhihu.com/p/25239682 过去的一段时间在深度强化学习领域投入了不少精力,工作中也在应用DRL解决业务问题.子曰:温故而知新,在进一步深入研究和应用DRL前,阶段性的整理下相关知识点.本文集中在DRL的model-free方法的Value-based和Policy-base方法,详细介绍下RL的基本概念和Value-based DQN,Policy-based DDPG两个主要算法,对目前state-of-art的算法(A3C)详细介绍,其他

深度强化学习(Deep Reinforcement Learning)的资源

来源:http://wanghaitao8118.blog.163.com/blog/static/13986977220153811210319/ Google的Deep Mind团队2013年在NIPS上发表了一篇牛x闪闪的文章,亮瞎了好多人眼睛,不幸的是我也在其中.前一段时间收集了好多关于这方面的资料,一直躺在收藏夹中,目前正在做一些相关的工作(希望有小伙伴一起交流). 一.相关文章 关于DRL,这方面的工作基本应该是随着深度学习的爆红最近才兴起的,做这方面的研究的一般都是人工智能领域的大

机器学习之非监督学习与强化学习

非监督式学习: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzQ3NjQ2NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 在此学习方式下.输入数据部分被标识,部分没有被标识,这样的学习模型能够用来进行预測,可是模型首先须要学习数据的内在结构以便合理的组织数据来进行预測.应用场景包含分类和回归,算法包含一些对经常使用监督

C++强化学习规划表

第一阶段 C语言加强以及C++语言详解(29天) 课程名称 课程内容 学习目标 C语言强化 · C语言基础复习(数据类型.变量.内存布局.指针基础) · C语言基础强化提高(C语言中的字符串.一维数组.二维数组) · C语言基础强化提高(一级指针,二级指针,三级指针实战,N级指针概念,指针数组和数组指针) · C语言基础强化提高(结构体.文件的使用) · 动态库的封装和设计 · 函数指针回调函数 · C语言面试题强化与提高 在基础班C语言知识点之上,掌握C语言深入技巧,为日后 做更大的项目打下坚

强化学习之智能出租车项目总结

项目介绍 这是优达学院机器学习课程的第4个实习项目,需要训练智能出租车学习交通规则,然后安全可靠地到达目的地.项目通过循序渐进的方式展开,从熟悉基本的领域知识开始,再以随机动作来直观感受智能车的状态,也是在这一步,让初学者有了心潮澎湃的感觉,"车终于动了!",是的,从0开始一路走来,以游戏闯关的方式,终于来到了4级,第一次体验了传说中的"智能"了,也许是"眼见为实"吧,小车在自己算法的控制之下行动,是一种很美好的感受.然后项目通过引导,让大家开始

Seq2SQL :使用强化学习通过自然语言生成SQL

论文: https://einstein.ai/static/images/layouts/research/seq2sql/seq2sql.pdf 数据集:https://github.com/salesforce/WikiSQL Seq2SQL属于natural language interface (NLI)的领域,方便普通用户接入并查询数据库中的内容,即用户不需要了解SQL语句,只需要通过自然语言,就可查询所需内容. Seq2SQL借鉴的是Seq2Seq的思想,与Seq2Seq应用于机器