【李宏毅深度强化学习笔记】—1、策略梯度方法(Policy Gradient)

原文链接:https://blog.csdn.net/ACL_lihan/article/details/104020259

补充:
问题:为什么奖励R是正数,概率pθ就会变大?
理解1:
如果采取action得到正奖励,那就需要提高在s下采取a的概率p(a,s),才会让总的R变大,反之如果采取action得到负奖励,那就需要减少在s下采取a的概率p(a,s),才会让总的R变大

理解2:
借用分类中交叉熵损失函数,loss = argmin -ylg y’ = argmax ylg y’
类比上面损失函数,若R大于0,要argmax的话,则概率p(a,s)也要越大,
反之,若R大于0,要argmax的话,则概率p(a,s)也要越小

在这里插入图片描述

 

【李宏毅深度强化学习笔记】1、策略梯度方法(Policy Gradient)(本文)

【李宏毅深度强化学习笔记】2、Proximal Policy Optimization (PPO) 算法

【李宏毅深度强化学习笔记】3、Q-learning(Basic Idea)

【李宏毅深度强化学习笔记】4、Q-learning更高阶的算法

【李宏毅深度强化学习笔记】5、Q-learning用于连续动作 (NAF算法)

【李宏毅深度强化学习笔记】6、Actor-Critic、A2C、A3C、Pathwise Derivative Policy Gradient

【李宏毅深度强化学习笔记】7、Sparse Reward

【李宏毅深度强化学习笔记】8、Imitation Learning

 

-------------------------------------------------------------------------------------------------------

【李宏毅深度强化学习】视频地址:https://www.bilibili.com/video/av63546968?p=1

课件地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS18.html

-------------------------------------------------------------------------------------------------------

回顾

 

在强化学习中,主要有三个部件(components):actor、environment、reward function。其中env和reward function是事先就定好的,你不能控制的。唯一能调整的是actor的policy,使actor能获得最大的reward。

policy是actor中起决策作用的一个东西,决定了actor的行为。就是说输入什么状态(state)要输出什么动作(action)。 

这里以\pi来代表policy。在深度强化学习中,policy是通常使用network来实现,network中会包含很多参数,这里就用\theta来统一代表这些参数。

 这里以游戏画面作为输入,经过红框的网络(policy)决策后,得出采取各种动作的几率,所以最终得出做left这个动作。

(类似于图像分类,看到什么图像,分成哪几类。只是这里的类别是要做出的动作)

一个例子:

初始的游戏画面作为 s_1 ,针对 s_1 采取的动作为 a_1 ,行动后会得到一个reward记为 r_1 。之后会看到下一个游戏画面 s_2...

经过很多轮 (s,a,r) 后游戏结束了,从开始到结束玩的这一次游戏称为一个episode,将每一个episode的 reward 相加就能得到Total reward:  R=\sum_{t=1}^Tr_tactor 的目标就是将 Total reward R 最大化。

把每一个episode的所有s和a的序列,叫做Trajectory

在给定policy的参数 \theta 的情况下,可以计算每一个 \tau 存在的概率 p_\theta(\tau) 。

其中 p(s_{t+1}|s_t,a_t) 代表的是environment,一般我们没办法控制这一部分。我们能控制的是采取不同的\theta(policy网络的参数),进而影响 p_\theta(a_t|s_t),最终对p_\theta(\tau)产生影响。

给定一个 \tau 可以得到一局游戏的 R,我们要做的就是调整actor中的参数,使得 R(\tau) 最大化。但是注意 R(\tau) 不是常量 scalable,而是随机变量 random variable,因为采取哪个action是有随机性的,而环境给出哪个state也是有随机性的。

所以对于 R 我们要算它的期望 \bar{R_\theta} 。穷举所有的trajectory  \tau 并计算每个 \tau 出现的概率,最后算 \sum_\tau{R(\tau)p_\theta(\tau)} 。或者这样理解:从 p_\theta(\tau) 的分布中采样(sample)出一个 \tau ,然后计算 R(\tau) 的期望。

那很明显我们要做的就是最大化Expected Reward,所以可以采用policy gradient来做。

 

Policy Gradient:

为了使 \bar{R_\theta} 最大化,我们需要做gradient ascent(注意不是gradient descent!),即对 \bar{R_\theta} 求梯度。注意 \bar{R_\theta} 中 R(\tau) 是不可微的,但不影响。

E_{\tau \sim p_\theta(\tau)}[R(\tau)\nabla log p_\theta(\tau)] 是无法计算的,所以sample出N个 \tau ,对每个 \tau 求 R(\tau^n)\nabla log p_\theta(\tau^n) 再求和取平均。

 

上面提到,而 p(s_{t+1}|s_t,a_t) 由环境决定,我们无法知道,而且这一项本来也和\theta没关系,只能对 log p_\theta(\tau^n)计算梯度,本质上就是对p_\theta(a_t|s_t)计算梯度。

所以最后 R(\tau^n)\nabla log p_\theta(\tau^n) 改写为 \sum_{t=1}^{T_n} R(\tau^n)\nabla log p_\theta(a_t^n|s_t^n)

最后的 \frac{1}{N} \sum_{n=1}^N \sum_{t=1}^{T_n} R(\tau^n)\nabla log p_\theta(a_t^n|s_t^n)若在 s_t^n 下执行 a_t^n 使得 R(\tau^n) 为正,则增加概率 p_\theta(a_t|s_t) ;为负则减少概率。

 

在实际实验中,我们会让actor去和environment做互动,产生左边的数据。左边的方框是做sample,获得很多 (s, a) 的pair(代表在s下采取a,得到 R(\tau) )。然后将这些数据送入训练过程中计算 \nabla log p_\theta(a_t^n|s_t^n) 。然后更新模型的参数\theta

注意数据只用一次,就是说更新一次参数后前面收集的所有数据就不能再用了,效率比较低。因为policy gradient ascend是on-policy的算法,具体说明可以看我的另一篇文章,前半段有讲on-policy和off-policy(https://blog.csdn.net/ACL_lihan/article/details/103989581)。

以下是policy gradient的两个小技巧:

技巧1:add a baseline

蓝色柱子的代表在某一state下,采取三种动作的概率p_\theta(a_t|s_t),绿色箭头则代表每种动作的Reward,长的标示Reward比较大。

之前约定的做法:假如执行 action a 后 R 为正,则提高 action a 出现的概率;R 为负,则降低 action a 出现的概率。

但是可能某个游戏不管什么执行动作得到的 reward 都是正的(比如0-20),则若执行 action a 后 R 的增加量大,则 action a 出现概率增加得大;执行 action b 后R的增加量小,则 action b 出现概率增加得小。(注意在reward恒为正的情况下,看起来无论如何执行某 action 的概率都会增加,只是增加多少的问题) 因为所有action出现的概率和为1,那么在理想情况下,在归一化后相当于 action a 出现概率上升而 action b 出现概率下降。(即增加得少的归一化后相当于下降,增加得多的归一化后才上升)

 

问题是在sample中可能有些动作没有sample到,比如 action a(我们不知道这个action得到的reward是大是小),但归一化后 action a 出现的概率会必然下降(因为 action b/c 出现的概率无论如何都会上升,这样就把 action a 出现的概率给压下去了),这显然是不妥的。

为了解决这个问题,我们希望reward不要总是正的,将所以 R(\tau^n)-b ,b是一个baseline,这样如果一个 reward 是一个很小的正值,减掉b后就会变负。b \approx E[R(\tau)] 可以用 R(\tau) 的平均值代替。

技巧2:assign suitable credit 

由上图可知,在同一场游戏中,不管其中的某个 action 是好是坏,总会乘上相同的权重 R,这显然也是不公平的。

比如上图左边部分,整场游戏的 reward 是+3,按规定其中三个 \nabla log p_\theta(a_t^n|s_t^n) 都要被乘上 3 的权重,但是 a_3 未必见得好,因为执行 a_3 后的即时得分是 -2。如果我们sample的次数够多,可能会看出 a_3 不够好,这个问题能够得到解决。但是实际中可能没办法搜集足够多的数据,所以在sample次数不够多的情况下,我们希望每个action的权重不同。

解决的方法是,不把整场游戏的 R(+5+0+-2=+3)作为统一权重,而将执行该动作后剩下序列的【reward之和】作为该动作的权重。比如对于 (s_b,a_2) ,它的权重应该为(+0-2=-2)。即执行某个 action 前得到多少 reward 都跟该 action 无关,该 action 只影响之后的游戏过程。

所以把权重中的 R(\tau^n) 换成  \sum_{t'=t}^{T_n}r_{t'}^n ,其中 t 代表该 action 执行的时刻,T_n 代表游戏结束的时刻,即把当前的 r 以及之后每一步的 r 做一个求和。

还需要考虑的一点是,当前的 action 对之后游戏的影响会随之时间推移而减弱,所以我们要有 discount,在求和的每一步都乘上一个小于1的 \gamma(比如0.9),这样 action 之后的动作越多,即时分数乘上的 \gamma 越多,越往后得到reward就会打上更大的折扣。

把 R(\tau^n)-b 这一项称作Advantage Function,也叫优势函数。它表示在actor在s_t下采取a_t,相较于其它action(同样对于s_t)有多好。

上标 \theta 代表 采用参数为\theta的policy 的 actor 。

 

最后总结:

1、介绍了actor、environment、reward function 

2、在深度强化学习中,policy可以看成是参数为\theta的网络,输入state,输出采取各种action的概率

3、一轮游戏叫做episode

4、trajectory={s1,a1,s2,a2,……},在给定policy的参数 \theta 的情况下,可以计算每一个 \tau 存在的概率 p_\theta(\tau) 。

5、总的expected reward=\sum_\tau{R(\tau)p_\theta(\tau)}

6、使用policy gradient ascend求 expected reward的最大值

7、采集一次数据,更新一次参数后,要重新采集一次数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值