狗都能看懂的Reinforcement Learning简介和Policy-Based方法的讲解

一、什么是强化学习

RL

强化学习的流程可以用上面这张图来说明:智能体(Agent)对环境进行观测,然后根据观测结果(Observation / State)采取相应的动作(Action),动作作用于环境(Environment)之后,环境就会产生相应的变化,这样智能体就可以再一次得到新的观测结果,同时环境也会给智能体一个反馈(Reward)表明这个动作是好的还是不好的。强化学习就是想办法找到一个策略能够最大化总的反馈(Total reward)。

比较成功的应用,如:AlphaGo,下围棋时,它的Observation就是棋盘的情况,根据棋局的形式采取一个Action下一步棋。然后根据Environment的反馈情况,得到一个Reward和新的Observation,再进行下一次的分析和动作。

chess

通过上述围棋的例子,我们不难发现,Environment是由系统本身决定的,Observation本质上也只是通过某种转换由Environment变动过来的,在这个例子中,可以是一个视觉神经网络,将棋局转换成数学矩阵。同时,有一个好的 Agent(策略生成) 也很重要,它决定了实际的Action,在没有深度学习之前,用过一些类似于表格的形式,根据局势进行查表,决定怎么下一步怎么走。这种方式本质上也是一种有监督学习。但围棋这个数学组合很难穷举,但有了Reinforcement Learning就不同了,通过一个通用的神经网络来分析形势。这也是Supervised Learning和Reinforcement Learning的差异。

sl vs rl

而Reward这个变量就比较特殊,虽然也是和Environment有关系,但也是由人为定义的一些规则来决定的,比如围住了对方的棋子,得1分;被围住得-1分,没有棋子数量变动为0分。所以如何从一个定义好的Reward规则也很重要。这里的Reward设定也有它的弊端,即得分为0的情况是比较常见的,得分或扣分的情况是比较少见的,所以它的Reward是比较稀疏。

chess problem

二、强化学习的应用

chatbot-train

Supervised Learning的方法在某些问题也不适用,比如在聊天机器人(Chatbot)训练时,上一个人的提问,没有完全对应的答案。

在这里插入图片描述

而利用Reinforcement Learning的思想,虽然对话没有像围棋一样有明确的得分Reward规则,但我们可以train两个Chatbot互相对话,人为定义一个规则:“通过查看对话记录,来评判是好是坏”

chatbot rule

还有一个比较常见的应用:电子游戏OpenAI也有对应的python游戏环境,可以用于强化学习的训练。

video game

比如上述的Video Game就来自于gym。左上角是分数,中间是需要打击的目标,玩家可以左右移动,开火。转换到RL中就是三个Action。

alien

gym中的游戏Environment已经转换成矩阵给到用户,可以直接给到Agent,得到Action。像这个游戏中击杀一个外星人,可以得到5分。当采取一个Action之后,Environment也会发生变化(通常都是随机的),这样我们又进入了下个Action生成的阶段。

alien end

当游戏进行了N次这样的循环之后,当采取了某次Action- α T \alpha_T αT之后,游戏进入了终止状态,这时候得到了一个总的Reward。那么这一整个游戏过程,我们称为episode,通常我们以一个episode和它对应总的Reward为一个训练数据。为什么这么做呢?

difficulties

这里就要回到我们上面提到Reward设计的弊端了,有时候Reward的规则往往会导致Agent没法得到即时的奖励,但这又是无法避免的。在现实生活中,这种问题比较常见,比如下棋中,短期的诱敌牺牲可能为后期的胜利做铺垫。所以Reward的delay是很常见的,所以我们在训练的时候也需要将这种情况考虑进去。

其次Agent作为一个小白,如果仅以即时奖励为优化目标,那么在alien游戏中,它只有开火才能得分,那么训出来的Agent就只会开火。

三、强化学习的分类

actor critic

强化学习的方法分为两大块,一个是Policy-based的方法,一个是Value-based的方法

  • **Policy-based:**训练一个做策略的的Actor
  • **Value-based:**训练一个评价的Critic

两个方法各有各的好处,也有对应的弊端,而后出来了一个Actor-Critic的方法,是将两个方法结合起来,有点类似于CV中的GAN(对抗生成式网络),而著名的Alpha Go则是几种方法的大杂烩,甚至还有Model-based的方法,它是擅长预测未来会发生的事情,一般在棋类中遇到的比较多。而电子游戏中的用的比较少(比较难穷举未来可能会发生的情况)

四、如何训练强化学习

Policy-Based

actor function

以Policy-Based的方法为例子,首先我们要明确,我们所需要的是什么,刚刚上面的介绍说到了,Environment是外界环境,而Reward是由人为制定的规则或环境本身所产生的。那么实际上,我们能控制的只有Agent本身,那么用深度学习实现Agent,思路就很明确了,我们只需要优化一个模型,使得它的输入为Observation,输出为实际的Action即可。这个Agent的输出可以是一种行为的汇总(Actor)或是一种策略(Policy)。

train model

训练分三步走,1、确定方法是什么,2、确定方法的好坏,3、选择最好的方法。用神经网络的当作Actor的方式,就可以用深度学习的方式训练它。

Define function

actor

如上述例子所示,将神经网络作为一个Actor,它的输入是游戏画面,输出则为三个action的概率,根据概率最大值做对应的策略。如果用查表的方式去做强化学习(把所有可能的情况都穷举),这个方法在游戏中是不可能的,尤其是MOBA类的游戏,可能性太多了。用神经网络替代的最大好处就是泛化性强。

Goodness of Function

goodness of actor

如何确定一个Actor是好还是不好呢?最直接的方法就是让这个Actor去玩游戏,每一轮迭代得到一个奖励 r t r_t rt,将所有的 r t r_t rt累加起来就是总的奖励 R θ R_\theta Rθ,其中 θ \theta θ为一个网络的参数。即使 θ \theta θ的参数完全相同,由于Actor本身带有随机性和Environment的变化, R θ R_\theta Rθ总是有可能不一样。所以我们是希望去使得 R θ R_\theta Rθ的值越大越好,也即 R θ R_\theta Rθ的期望值 R ‾ θ \overline{R}_\theta Rθ越大越好。

trajectory.png

我们将一次探索(episode)的过程称为trajectory - τ \tau τ(即 s 1 , a 1 , r 1 . . . s T , a T , r T {s_1, a_1, r_1 ... s_T, a_T, r_T} s1,a1,r1...sT,aT,rT的集合),如果我们用一个Actor去玩游戏,每一个 τ \tau τ都有其可能出现的概率记作 P ( τ ∣ θ ) P(\tau|\theta) P(τθ),那么我们就可以 R ‾ θ \overline{R}_\theta Rθ的公式写出来:
R ‾ θ = ∑ t R ( τ ) P ( τ ∣ θ ) ≈ 1 N ∑ n = 1 N R ( τ n ) \overline{R}_\theta = \sum_tR(\tau)P(\tau|\theta) \approx \dfrac{1}{N}\sum_{n=1}^N R(\tau^n) Rθ=tR(τ)P(τθ)N1n=1NR(τn)
实际上,穷举所有的 τ \tau τ也不可能。但我们可以进行有限次的尝试:用这个Actor玩N次游戏,某个 τ \tau τ出现的次数特别多,那对应的Probability会越高,在采样的时候也会更容易被选中。最后我们将N次的Reward求和取平均,就得到了最终的 R ‾ θ \overline{R}_\theta Rθ,不难发现,我们尝试的次数越多,其覆盖的情况就越全面, R ‾ θ \overline{R}_\theta Rθ则越准。

Pick the best function

problem statement.png

按照前文所表述,我们的优化目标是 R ‾ θ \overline{R}_\theta Rθ,所以接下来我们可以用梯度上升的方式去找一个最好的 θ \theta θ,其实这一块就和深度学习的梯度下降优化刚好反过来了。

optim.png

梯度上升的过程推导如上图所示,这一块主要是一些数学的证明,这边只做简单的解释,如果不想看的话可以直接跳过。

首先 R ( τ ) R(\tau) R(τ)是外界环境所决定的,这个变量本身就推不出来,算是个黑盒子,所以不可微分,我们可以不理它。 ∇ P ( τ ∣ θ ) \nabla P(\tau|\theta) P(τθ)上下同乘一个 P ( τ ∣ θ ) P(\tau|\theta) P(τθ),可得:
∇ R ‾ θ = ∑ t R ( τ ) P ( τ ∣ θ ) ∇ P ( τ ∣ θ ) P ( τ ∣ θ ) = R ( τ ) P ( τ ∣ θ ) ∇ l o g P ( τ ∣ θ ) ≈ 1 N ∑ n = 1 N R ( τ n ) ∇ l o g P ( τ n ∣ θ ) \begin{aligned} \nabla \overline{R}_\theta &= \sum_tR(\tau)P(\tau|\theta) \nabla \dfrac{P(\tau|\theta)}{P(\tau|\theta)} \\ & =R(\tau)P(\tau|\theta) \nabla logP(\tau|\theta) \\ & \approx \dfrac{1}{N}\sum_{n=1}^N R(\tau^n) \nabla logP(\tau^n|\theta) \end{aligned} Rθ=tR(τ)P(τθ)P(τθ)P(τθ)=R(τ)P(τθ)logP(τθ)N1n=1NR(τn)logP(τnθ)
为什么会等于下面这一项呢?这是个数学定理。最后结果约等于加权所有的Reward取平均,再乘上计算 l o g P ( τ n ∣ θ ) logP(\tau^n|\theta) logP(τnθ)

那么现在问题就转变成,如何计算 l o g P ( τ n ∣ θ ) logP(\tau^n|\theta) logP(τnθ)了。

logP.png

如上图所示,我们将 P ( τ ∣ θ ) P(\tau|\theta) P(τθ)拆分开,其中:

p ( s 1 ) p(s_1) p(s1)是指游戏刚开始时,碰上 s 1 s_1 s1的概率;

p ( a 1 ∣ s 1 , θ ) p(a_1|s_1,\theta) p(a1s1,θ)是指环境为 s 1 s_1 s1且用 θ \theta θ生成策略时,得到 a 1 a_1 a1的概率;

p ( r 1 , s 2 ∣ s 1 , a 1 ) p(r_1, s_2|s_1,a_1) p(r1,s2s1,a1)是指环境为 s 1 s_1 s1时,采用了 a 1 a_1 a1的动作,得到了 r 1 r_1 r1奖励且环境由 s 1 s_1 s1转变为 s 2 s_2 s2的概率;

后面的几项以此类推。

那么从图上可以看除,黄色的两项和Actor是无关的,红色的那项是和Actor有关的。

logP2.png

P ( τ ∣ θ ) P(\tau|\theta) P(τθ)分解完之后,继续加上 l o g log log项,无非就是相乘变相加。 l o g p ( s 1 ) logp(s_1) logp(s1) l o g p ( r t , s t + 1 ∣ s t , a t ) logp(r_t,s_{t+1}|s_t, a_t) logp(rt,st+1st,at)都和Actor无关,我们都可以忽略。

R.png

所以整个式子最后可以简化成:
1 N ∑ n = 1 N ∑ t = 1 T n R ( τ n ) ∇ l o g p ( a t n ∣ s t n , θ ) \dfrac{1}{N}\sum_{n=1}^N \sum_{t=1}^{T_n} R(\tau^n) \nabla logp(a^n_t|s^n_t,\theta) N1n=1Nt=1TnR(τn)logp(atnstn,θ)
这个式子可以理解为:在某次玩游戏的过程中,即 τ n \tau^n τn的情况下,遇到 s t n s_t^n stn采取了 a t n a_t^n atn的行为,得到一个 R ( τ n ) R(\tau^n) R(τn),如果它是正的,那我们希望它出现的概率 p ( a t n ∣ s t n ) p(a^n_t|s^n_t) p(atnstn)越大越好,反之越小越好。

这里再次强调一下,虽然 ∇ l o g p ( a t n ∣ s t n , θ ) \nabla logp(a^n_t|s^n_t,\theta) logp(atnstn,θ)这一项是某个时刻下采取了一个action的概率微分,但它是需要乘上总的Reward作为系数。如果是拿当下得到的reward,那么它每次都只会选择目前能得到reward的action,这样训练出来的network是非常**“短视”,没有“大局观”**

logP3.png

回过来再细说一下为什么要对 p ( a t n ∣ s t n , θ ) p(a^n_t|s^n_t,\theta) p(atnstn,θ)取对数呢?根据前面图片的定理,有:
∇ l o g p ( a t n ∣ s t n , θ ) = ∇ p ( a t n ∣ s t n , θ ) p ( a t n ∣ s t n , θ ) \nabla logp(a^n_t|s^n_t,\theta) = \dfrac{\nabla p(a^n_t|s^n_t,\theta)}{ p(a^n_t|s^n_t,\theta)} logp(atnstn,θ)=p(atnstn,θ)p(atnstn,θ)
这个式子就更好解释了,现在我们按照上图假设:总共四次 τ \tau τ,其中采取了action b有3次,得到的reward是1,采取action a有1次,得到的reward是2。理论上我们应该多采样action a,因为它得到的reward是更高的。但实际上,action b出现的次数比较多,它的概率会更高,实际采样的时候会偏向于action b。那么在优化的时候我们就应该除一个 p ( a t n ∣ s t n , θ ) p(a^n_t|s^n_t,\theta) p(atnstn,θ),相当于做一次normalization,给reward更高的action a更多优化空间。

baseline.png

这边其实还有一个细节需要注意,当Environment给到的Reward都是非负值时,需要加上一项,降低其baseline。按照刚刚normalization的优化思路,它会让a、b、c出现的概率更均衡,这是理想的思路。但实际优化过程中,我们做的是有限次数的采样,可能就只采样到b、c,而a压根就没采样到,network根本不知道a表现如何,a的几率会越变越小。

所以我们减去一个 b b b值(是个超参数),当实际得到的Reward大于这个baseline,你才能让它优化,小于baseline,就应该让它减少。

以上内容为李宏毅老师课程中的总结。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值