狗都能看懂的Actor-Critic强化学习算法讲解
李宏毅老师的关于Actor-Critic算法的课程笔记
Review Policy Gradient

上面的公式是Policy Gradient的更新函数,这个式子是指在sts_tst时刻采取了ata_tat,计算出对应发生的概率pθp_\thetapθ,然后计算在采取了这个ata_tat之后,所得到的reward有多大。但这里需要减去一个baseline,不能让reward都大于0,这样会降低没有sample到的action的概率。同时还需要加上衰减因子,保证后期得到的reward不会过大,从而影响了一开始的action概率。最后把所有时刻的reward求和。
我们将画蓝色横线的式子记作GtnG_t^nGtn,它虽然没有偏差,但因为方差大,数值波动比较大。波动大的原因也很好理解,GtnG_t^nGtn从执行了这个action之后到episode结束得到的所有reward总和,由于sample的概率不相同,所以中间会遇到各种不同的state。
如果我们收集数据的数量足够多,这个波动会被平均掉。但实际收集数据是比较耗时,所以也不会有太多数据。如果说能用期望值(平均)替代GtnG_t^nGtn,那可以让训练过程更稳定。这里就需要引入Value-Based的方法。
Review Q-Learning

Value-Based的方法有两种:
- Vπ(s)V^{\pi}(s)Vπ(s)输入state,输出可能会得到reward的期望值
- Qπ(s,a)Q^{\pi}(s,a)Qπ(s,a)输入state和会采取的action,输出可能会得到reward的期望值
以上两个方法都可以用TD或MC的方法更新,用TD比较稳定,用MC更精确。
Actor Critic

刚刚说到,如果能用期望值(平均)替代GtnG_t^nGtn,训练会更加稳定。那GtnG_t^nGtn的期望值是什么?它是希望在sts_tst时刻,用π\piπ这个策略得到ata_tat,执行了ata_tat之后所得到的reward总和的期望值,那这个其实就是Qπθ(stn,atn)Q^{\pi_\theta}(s^n_t,a^n_t)Qπθ(stn,atn)的定义。所以有:
E[Gtn]=Qπθ(stn,atn) E[G_t^n] = Q^{\pi_\theta}(s^n_t,a^n_t) E[Gtn]=Qπθ(stn,atn)
那么我们用Qπθ(stn,atn)Q^{\pi_\theta}(s^n_t,a^n_t)Qπθ(stn,atn)替代GtnG_t^nGtn这一项即可。还有一项baseline,正常是自己设置,但这里我们可以用Value Function替代,V(s)V(s)V(s)是不包含action的,Q(s,a)Q(s,a)Q(s,a)是包含action的,V(s)V(s)V(s)是Q(s,a)Q(s,a)Q(s,a)的期望值,为什么这么说呢?原因是这样的:
- 在sts_tst下,价值函数Vπ(s)V^\pi(s)Vπ(s)表示从状态sts_tst开始,遵循策略π\piπ的期望回报。
- 由于策略π\piπ定义了在sts_tst下采取各个action的概率分布,因此,价值函数Vπ(s)V^\pi(s)Vπ(s)可以看作是动作价值函数Q(s,a)Q(s,a)Q(s,a)在所有可能动作上的加权平均,即期望值。
所以上图红框内的式子就可以被Value-Based的两个方法给替换掉,这样就可以将Actor和Critic的两个方法给结合起来。
Advantage Actor Critic

这样结合的缺点就是需要训练两个网络,有办法可以只训练一个网络用来预测两个值吗?可以,事实上可以只训练V(s)V(s)V(s),用V(s)V(s)V(s)替代Q(s,a)Q(s,a)Q(s,a)。回到Q(s,a)Q(s,a)Q(s,a)的定义,因为rtr_trt本身是一个随机值,只有我们取了期望值之后才是Q(s,a)Q(s,a)Q(s,a)的定义。现在为了简化Actor-Critic的训练,直接将求期望值去掉。这样就可以用V(s)V(s)V(s)替代Q(s,a)Q(s,a)Q(s,a)。
但这样做的坏处也显而易见,是引入了一个随机的变量。但不过相较于GtnG_t^nGtn来说还好,rtr_trt只是某一个step会有的随机变量,方差会比GtnG_t^nGtn小的多。所以整体上还是能接受的。

红框里面是原来的Advantage项,已经用Value-Based的方法替代了。那么Advantage Actor-Critic完整流程如上图:
- 有一个Policy π\piπ 和环境做互动收集训练数据。(Policy Gradient中是用这些训练数据直接优化Policy)
- 用TD或MC优化V(s)V(s)V(s)
- 套用上面的公式更新Policy π\piπ
- 重复1-3直至收敛
Tips

backbone shared
和很多CV任务一样,前面的特征提取都是可以共享的。然后预测action和预测value分成两个分支,这部分和Dueling DQN很像,只是最后没有合并成一个Q(s,a)Q(s,a)Q(s,a)
large entropy
我们可以设置一些限制,使得action的entropy会大一点,不同的action被采用的概率平均一些,才会有几率探索更多state,得到比较好的结果。
asynchronous
强化学习通常花时间都是在收集训练数据过程中。开多个线程与环境做互动收集数据可以有效缩短训练时间。
Asynchronous Advantage Actor-Critic

Asynchronous Advantage Actor-Critic简称为A3C,具体如何实现?
首先有一个初始的global network
- 复制N个network
- 让它们都和环境做互动,收集数据
- 计算梯度
- 更新模型
这里值得注意的是,所有的actor都是并行去收集,训练,更新的。可能有人问,如果复制出来的参数是θ1\theta^1θ1,但是要更新的时候已经被别覆盖成θ2\theta^2θ2了呢?这个没关系,直接覆盖就行。
Pathwise Derivative Policy Gradient

之前说到Q-Learning在连续的问题上表现不好。我们完全可以利用Actor预测action的能力,为QπQ^\piQπ提供action,使得QπQ^\piQπ的值越大越好。在训练的时候会直接将两个网络连起来,并且freeze QπQ^\piQπ的参数,只训练Actor,这个思路和CV任务里的GAN很像,用生成器生成一个图片,用判别器去判断是好是坏。

算法的流程也很简单,有一个π\piπ去和环境交互,收集数据,训练QπQ^\piQπ,然后将QπQ^\piQπ固定,只训练actor使得QπQ^\piQπ输出的值越大越好。在Q-Learning中能用到的trick,这里也能用上,比如replay buffer等。

相较于之前的Q-Learning算法,改动四个地方就行:
- 之前使用QπQ^\piQπ决定用什么action,现在改用π\piπ来预测action
- 用π^\hat{\pi}π^预测的action代入到QπQ^\piQπ中,不再解argmaxa Qπ(s,a)arg \max\limits_{a} \ Q^\pi(s,a)argamax Qπ(s,a)(会有两个π\piπ,其中一个是固定的,和训练DQN是一样的)
- 训练π\piπ(其优化目标是让QπQ^\piQπ越大越好)
- 更新π\piπ的参数
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)