强化学习(Reinforcementlearning,RL)讨论的问题是一个智能体(agent)怎么在一个复杂不确定的环境(environment)里面去极大化它能获得的奖励。通过感知所处环境的状态(state)对动作(action)的反应(reward),来指导更好的动作,从而获得最大的收益(return),这被称为在交互中学习,这样的学习方法就被称作强化学习。
在强化学习过程中,智能体跟环境一直在交互。智能体在环境里面获取到状态,智能体会利用这个状态输出一个动作,一个决策。然后这个决策会放到环境之中去,环境会根据智能体采取的决策,输出下一个状态以及当前的这个决策得到的奖励。智能体的目的就是为了尽可能多地从环境中获取奖励。
强化学习是机器学习的一个重要分支,是多学科多领域交叉的一个产物,它的本质是解决decisionmaking问题,即自动进行决策,并且可以做连续决策。
让我们以小孩学习走路来做个形象的例子:
小孩想要走路,但在这之前,他需要先站起来,站起来之后还要保持平衡,接下来还要先迈出一条腿,是左腿还是右腿,迈出一步后还要迈出下一步。
小孩就是agent,他试图通过采取行动(即行走)来操纵环境(行走的表面),并且从一个状态转变到另一个状态(即他走的每一步),当他完成任务的子任务(即走了几步)时,孩子得到奖励(给巧克力吃),并且当他不能走路时,就不会给巧克力。
策略是智能体用于决定下一步执行什么行动的规则。可以是确定性的,一般表示为:μ:
也可以是随机的,一般表示为:π:
因为策略本质上就是智能体的大脑,所以很多时候“策略”和“智能体”这两个名词经常互换,例如我们会说:“策略的目的是最大化奖励”。
在深度强化学习中,我们处理的是参数化的策略,这些策略的输出,依赖于一系列计算函数,而这些函数又依赖于参数(例如神经网络的权重和误差),所以我们可以通过一些优化算法改变智能体的的行为。
其中,mlp是把多个给定大小和激活函数的密集层(denselayer)相互堆积在一起的函数。
深度强化学习中最常见的两种随机策略是
使用和训练随机策略的时候有两个重要的计算:
环境可能会变化,在当前环境和行动下,衡量系统状态向某一个状态转移的概率是多少,注意环境的变化通常是未知的。
而可以是随机的:
智能体的行为由策略确定。
行动轨迹常常也被称作回合(episodes)或者rollouts。
强化学习中,奖励函数R非常重要。它由当前状态、已经执行的行动和下一步的状态共同决定。
指的是在一个固定窗口步数T内获得的累计奖励:
其中Rt表示第t时刻的奖励,agent的目标就是让Return最大化。
因此,强化学习通常用discountedreturn(折扣回报,又称cumulativediscountedfuturereward),取γ为discountrate(折扣率),γ∈(0,1],则有,
讨论预期收益之前,我们先讨论下行动轨迹的可能性分布。
我们假设环境转换和策略都是随机的。这种情况下,T步行动轨迹是:
强化学习中的核心优化问题可以表示为:
知道一个状态的值或者状态行动对(state-actionpair)很有用。这里的值指的是,如果你从某一个状态或者状态行动对开始,一直按照某个策略运行下去最终获得的期望回报。几乎是所有的强化学习方法,都在用不同的形式使用着值函数。
这里介绍四种主要函数:
全部四个值函数都遵守自一致性的方程叫做贝尔曼方程,贝尔曼方程的基本思想是:
同策略值函数的贝尔曼方程:
最优值函数的贝尔曼方程是:
同策略值函数和最优值函数的贝尔曼方程最大的区别是是否在行动中去max。这表明智能体在选择下一步行动时,为了做出最优行动,他必须选择能获得最大值的行动。
举例来说,在象棋游戏中,定义赢得游戏得1分,其他动作得0分,状态是棋盘上棋子的位置。仅从1分和0分这两个数值并不能知道智能体在游戏过程中到底下得怎么样,而通过价值函数则可以获得更多洞察。
价值函数使用期望对未来的收益进行预测,一方面不必等待未来的收益实际发生就可以获知当前状态的好坏,另一方面通过期望汇总了未来各种可能的收益情况。使用价值函数可以很方便地评价不同策略的好坏。
强化学习中,有些时候我们不需要描述一个行动的绝对好坏,而只需要知道它相对于平均水平的优势。也就是说,我们只想知道一个行动的相对优势。这就是优势函数的概念。
一个服从策略π的优势函数,描述的是它在状态s下采取行为a比随机选择一个行为好多少(假设之后一直服从策略π)。数学角度上,优势函数的定义为:
虽然强化学习给出了一个非常通用的解决问题的思路,但是面对具体问题,在不同场景下,强化学习又会有不同的侧重。这些侧重点主要体现在一下六类问题的不同探索点上:
六类问题本身并不独立,我们在这里把六类问题抽象出来看,每类问题下都有很多经典的应用。
本质上,所有强化学习算法,都可以抽象为如下的标准数学形式:
马尔科夫决策过程指的是服从马尔科夫性的系统:
状态转移只依赖与最近的状态和行动,而不依赖之前的历史数据。
有了上述六类问题,我们再看看如何通过方法或者方法的组合去定义解决问题的算法。
基于是否使用了Policy、Valuefuction、Model不同的方法组合,强化学习算法可以分为
一般情况下,环境都是不可知的,所以学术和工业界主要研究无模型问题。我们可以用一个最熟知的旅行商例子来看,
我们要从A走到F,每两点之间表示这条路的成本,我们要选择路径让成本越低越好:
对应到强化学习语境下几大元素分别是:
有一种走法是这样的,
在A时,可以选的(B,C,D,E),发现D最优,就走到D,此时,可以选的(B,C,F),发现F最优,就走到F,此时完成任务。
这个算法就是强化学习的一种,叫做epsilongreedy,是一种Policybased的方法,当然了这个路径并不是最优的走法(最优走法应该是A->C->F)。
此外还可以从不同角度使分类更细一些:
强化学习是除了监督学习和非监督学习之外的第三种基本的机器学习方法。
强化学习主要有以下几个特点:
两种学习方式都会学习出输入到输出的一个映射,
另外它们在反馈闭环时效性方面也不一样,
同时它们的输入分布也不一样,
通过强化学习,一个agent可以在探索和开发(explorationandexploitation)之间做权衡,并且选择一个最大的回报。
一般的监督学习算法不考虑这种平衡,就只是是exploitative。
自监督学习将输入和输出当成一个完整的整体,它通过挖掘输入数据本身提供的弱标注信息,基于输入数据的某些部分预测其它部分。在达到预测目标的过程中,模型可以学习到数据本身的语义特征表示,这些特征表示可以进一步被用于其他任务当中。
深度学习方法在计算机视觉领域所取得的巨大成功,要归功于大型训练数据集的支持。这些带丰富标注信息的数据集,能够帮助网络学习到可区别性的视觉特征。然而,收集并标注这样的数据集通常需要庞大的人力成本,而所标注的信息也具有一定的局限性。作为替代,使用完全自监督方式学习并设计辅助任务来学习视觉特征的方式,已逐渐成为计算机视觉社区的热点研究方向。
参考链接:
强化学习算法的思路非常简单,以游戏为例,如果在游戏中采取某种策略可以取得较高的得分,那么就进一步「强化」这种策略,以期继续取得较好的结果。这种策略与日常生活中的各种「绩效奖励」非常类似。
在Flappybird这个游戏中,我们需要简单的点击操作来控制小鸟,躲过各种水管,飞的越远越好,因为飞的越远就能获得更高的积分奖励。这就是一个典型的强化学习场景:
机器人很像强化学习里的「代理」,在机器人领域,强化学习也可以发挥巨大的作用。
总体来说,强化学习算法可以分为两大流派,即
这2个分类的重要差异是:智能体是否能完整了解或学习到所在环境的模型。
这个系列的方法将策略表示为
系统会从一个固定或者随机起始状态出发,策略梯度让系统探索环境,生成一个从起始状态到终止状态的状态-动作-奖励序列,s1,a1,r1,.....,sT,aT,rT,在第t时刻,我们让gt=rt+γrt+1+...等于q(st,a),从而求解策略梯度优化问题。
优化基本都是基于同策略的,也就是说每一步更新只会用最新的策略执行时采集到的数据。
基于策略优化的方法举例:
Q-Learning和DQN都是基于价值的强化学习算法,在给定一个状态下,计算采取每个动作的价值,我们选择有最高Q值(在所有状态下最大的期望奖励)的行动。如果我们省略中间的步骤,即直接根据当前的状态来选择动作,也就引出了强化学习中的另一种很重要的算法,即策略梯度(PolicyGradient,PG)
策略梯度不通过误差反向传播,它通过观测信息选出一个行为直接进行反向传播,当然出人意料的是他并没有误差,而是利用reward奖励直接对选择行为的可能性进行增强和减弱,好的行为会被增加下一次被选中的概率,不好的行为会被减弱下次被选中的概率。
举例如下图所示:输入当前的状态,输出action的概率分布,选择概率最大的一个action作为要执行的操作。
PolicyGradient算法的优缺点如下:
蒙特卡罗策略梯度reinforce算法是策略梯度最简单的也是最经典的一个算法。
算法流程如下:
首先我们需要一个policymodel来输出动作概率,输出动作概率后,我们sample()函数去得到一个具体的动作,然后跟环境交互过后,我们可以得到一整个回合的数据。拿到回合数据之后,我再去执行一下learn()函数,在learn()函数里面,我就可以拿这些数据去构造损失函数,然后扔给优化器去优化,去更新我的policymodel。
Actor-Critic算法的网络结果如下:
整体结构
Actor和Critic的网络结构
Actor-Critic算法流程如下:
Actor-Critic算法也存在一些算法上的原生瓶颈:
相比Actor-Critic,A3C的优化主要有3点,分别是
其中异步训练框架是最大的优化。
从DDPG这个名字看,它是由D(Deep)+D(Deterministic)+PG(PolicyGradient)组成。
Q-Learning是强化学习算法中value-based的算法,Q即为Q(s,a),就是在某一个时刻的state状态下,采取动作a能够获得未来收益的折现值,环境会根据agent的动作反馈相应的reward奖赏,所以算法的主要思想就是将state和action构建成一张Q_table表来存储Q值,然后根据Q值来选取能够获得最大收益的动作。我们不断的迭代我们的Q值表使其最终收敛,然后根据Q值表我们就可以在每个状态下选取一个最优策略。
QLearning的算法框架是让系统按照策略指引进行探索,在探索每一步都进行状态价值的更新。其中最优行动值函数Q的更新算法如下:
其中,Q是递归定义的,
参数介绍:
基于Q-Learning的方法
在普通的Q-learning中,我们以矩阵的方式建立了一张存储每个状态下所有动作Q值的表格。表格中的每一个动作价值Q(S,a)
对于这种情况,我们需要用函数拟合的方法来估计Q值,即将这个复杂的Q
以下图中所示的所示的车杆(CartPole)环境为例,它的状态值就是连续的,动作值是离散的。
智能体的状态是一个维数为4的向量,每一维都是连续的,其动作是离散的,动作空间大小为2,详情参见下表。
接下来看Q网络的损失函数,我们先来回顾一下Q-learning的更新规则,
至此,我们就可以将Q-learning扩展到神经网络形式——深度Q网络(deepQnetwork,DQN)算法。由于DQN是离线策略算法,因此我们在收集数据的时候可以使用一个ε-贪婪策略来平衡探索与利用,将收集到的数据存储起来,在后续的训练中使用。
DQN中还有两个非常重要的模块——经验回放和目标网络,它们能够帮助DQN取得稳定、出色的性能。
在一般的有监督学习中,假设训练数据是独立同分布的,我们每次训练神经网络的时候从训练数据中随机采样一个或若干个数据来进行梯度下降,随着学习的不断进行,每一个训练数据会被使用多次。在原来的Q-learning算法中,每一个数据只会用来更新一次Q值。为了更好地将Q-learning和深度神经网络结合,DQN算法采用了经验回放(experiencereplay)方法,具体做法为维护一个回放缓冲区,将每次从环境中采样得到的四元组数据(状态、动作、奖励、下一状态)存储到回放缓冲区中,训练Q网络的时候再从回放缓冲区中随机采样若干数据来进行训练。这么做可以起到以下两个作用。
目标网络
综上所述,整体算法流程如下,
DQN也存在一些算法上的原生瓶颈:
ExpertIteration是纯规划的后来之作,它使用、学习策略的显示表示形式:
智能体在模型中应用了一种规划算法,类似蒙特卡洛树搜索(MonteCarloTreeSearch),通过对当前策略进行采样生成规划的候选行为。这种算法得到的行动比策略本身生成的要好,所以相对于策略来说,它是“专家”。随后更新策略,以产生更类似于规划算法输出的行动。
经过了几十轮次的迭代后,Q-table基本收敛完成了,此时right概率的平均概率就超过了EPSILON*left,此时可以认为算法已经学会了一种大概率获胜的行动策略。
为了更好地理解这个算法,我们逐步分析Q-table的值变化过程,以N_STATES=8为例。
此时q_target=1;q_predict=0,所以ALPHA*(q_target-q_predict)=0.1,且只有(S=6,A=right)能获得这次Q-table概率更新。
注意!这是Q-table的第一次概率更新,这个概率更新的根源是”目标达到的R奖励“,而(S=6,A=right)是引导算法获得这次奖励的行动路径。后续的所有概率更新都是从这里开始的。
更新后的Q-table如下:
Q-table:leftright00.00.00010.00.00020.00.00030.00.00040.00.00050.00.00060.00.10070.00.000此时,整个Q-table,除了S=6,其他的(s,a)依然都为零,所以小圆点在S=5之前不管如何做随机运动,都不会发生概率更新动作。
有趣地”分水岭“发生在S=5的时候,在S=5这个点,由于此时(S=5,a)依然都为零,所以小圆点依然是在做随机运动,
计算得到(S=5,A=right)=0.09。
00.00.00010.00.00020.00.00030.00.00040.00.00050.00.00960.00.10070.00.000接下来S+1,继续更新S=6的动作概率。
在S=6这个状态上,
所以根据最大概率决策(本例中Epsilon=0.9,即90%时候按照最大概率,10%时候引入随机扰动),小圆点选择向right方向运动。注意!这里算法允许一定概率的随机扰动,即不按照最大概率方向选择action动作。
S=6向right运动到达终点,所以此时q_target=R=1
00.00.00010.00.00020.00.00030.00.00040.00.00050.00.00960.00.19070.00.000和前面的分析过程类似,”分水岭“发生在S=4的时候,在S=4这个点,由于此时(S=4,a)依然都为零,所以小圆点依然是在做随机运动,
计算得到(S=4,A=right)=0.09。
00.00.0000010.00.0000020.00.0000030.00.0000040.00.0008150.00.0090060.00.1900070.00.00000S=5的更新逻辑和S=4类似,S=6的更新逻辑和前面分析的也类似。
按照同样的漏记,不断循环,最终算法逐渐收敛,
至此,我们可以总结一下Q-learn算法思想:
现在,显而易见的问题是:
我们如何训练机器人以最短的路径到达最终目标而不踩矿井?
Q值表(Q-Table)是一个简单查找表的名称,我们计算每个状态的最大预期未来奖励。基本上,这张表将指导我们在每个状态采取最佳行动。
Q函数(Q-Function)即为上文提到的动作价值函数,他有两个输入:「状态」和「动作」。它将返回在该状态下执行该动作的未来奖励期望。
我们可以把Q函数视为一个在Q-Table上滚动的读取器,用于寻找与当前状态关联的行以及与动作关联的列。它会从相匹配的单元格中返回Q值。这就是未来奖励的期望。
在我们探索环境(environment)之前,Q-table会给出相同的任意的设定值(大多数情况下是0)。随着对环境的持续探索,这个Q-table会通过迭代地使用Bellman方程(动态规划方程)更新Q(s,a)来给出越来越好的近似。
下面来逐步分析算法优化过程,
我们将首先构建一个Q值表。有n列,其中n=操作数。有m行,其中m=状态数。我们将值初始化为0
如果每个Q值都等于零,我们就需要权衡探索/利用(exploration/exploitation)的程度了,思路就是,在一开始,我们将使用epsilon贪婪策略:
现在我们采取了行动并观察了结果和奖励。我们需要更新功能Q(s,a):
最后生成的Q表:
run_this.py
相比第一个命令行小游戏,该实验有几个值得注意的点:
贝尔曼方程的误差传递和优化过程和第一个实验都是一样的。
这种策略背后隐含的算法思想是:
每一步都脚踏实地,更多依靠已知的历史的经验和认知做出决策,当做出下一步决策后,不对未来展望抱过多的幻想,而是依然根据历史经验理性评估下一步决策能对最终目标带来的价值提升。按照这种稳妥地策略不断循环迭代,最终拟合出一个近似的全局最优行动策略。
用和前面例子同样的跳方格游戏,我们来对比一下Sarsa(λ)和Sarsa算法的主要区别:
对于奖励更新机制来说,历史轨迹的奖励累计有两种方法,本质上是是否要对历史轨迹的奖励积累进行归一化:
对于历史路径(s,a)奖励衰减机制来说,λ的不同取值,会带来不同的State权重衰减效果,本质是影响算法收敛速度。
但Sarsa(λ)也存在一些问题:
我们采用的测试环境是CartPole-v0,其状态空间相对简单,只有4个变量,因此网络结构的设计也相对简单:采用一层128个神经元的全连接并以ReLU作为激活函数。当遇到更复杂的诸如以图像作为输入的环境时,我们可以考虑采用深度卷积神经网络。