Actor Critic

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Actor Critic相关的知识,希望对你有一定的参考价值。

参考技术A

Actor-Critic 算法有两部分组成:actor 和 critic。其中 action 就是Policy Gradient 算法,critic 是Q-learning。所以实际上 actor-critic算法是Q-learning算法和policy gradient算法的结合。

对于Q-learning,有如下特点:

如上图的网络都是为了近似 Q(s,a)函数,有了 Q(s,a),我们就可以根据Q(s,a)的值来作为判断依据,作出恰当的行为。

Q-learning算法最主要的一点是:决策的依据是Q(s,a)的值。即算法的本质是在计算 当前状态s, 采取某个动作 a 后会获得的未来的奖励的期望,这个值就是 Q(s,a)。换句话说,我们可以把这个算法的核心看成一个评论家(Critic),而这个评论家会对我们在当前状态s下,采取的动作a这个决策作出一个评价,评价的结果就是Q(s,a)的值。

但是,Q-learning 算法却不怎么适合解决连续动作空间的问题。因为如果动作空间是连续的,那么用Q-learning算法就需要对动作空间离散化,而离散化的结果会导致动作空间的维度非常高,这就使得Q-learning 算法在实际应用起来很难求得最优值,且计算速度比较慢。

而Policy Gradient 正好弥补了这个缺点。

Policy Gradient 算法的核心思想是: 根据当前状态,直接算出下一个动作是什么或下一个动作的概率分布是什么。即它的输入是当前状态 s, 而输出是具体的某一个动作或者是动作的分布。

我们可以想像,Policy Gradient 就像一个演员(Actor),它根据某一个状态s,然后作出某一个动作或者给出动作的分布,而不像Q-learning 算法那样输出动作的Q函数值。

Actor-Critic 是Q-learning 和 Policy Gradient 的结合。
为了导出 Actor-Critic 算法,必须先了解Policy Gradient 算法是如何一步步优化策略的。

如上图所示, 最简单的Policy Gradient 算法要优化的函数如下:

其中 要根据 Monte-Carlo 算法估计,故又可以写成:

但是这个 方差会比较大,因为 是由多个随机变量得到的,因此,我们需要寻找减少方差的办法。
一个方法就是引入一个 baseline 的函数 b, 这个 b 会使得 的期望不变,但是方差会变小,常用的 baseline函数就是 。再来,为了进一步降低 的随机性,我们用 替代 ,这样,源式就变成:

因为 ,故进一步演化成:

照上面的式子看来,我们需要两个网络去估计 和 ,但是考虑到贝尔曼方程:

弃掉期望, 得:

即最终的式子为:

这样只需要一个网络就可以估算出 值了,而估算 的网络正是我们在 Q-learning 中做的,所以我们就把这个网络叫做 Critic。这样就在 Policy Gradient 算法的基础上引进了 Q-learning 算法了

6. Actor-Critic算法

参考技术A

本文主要介绍如下几个内容:

首先我们还是回顾一下之前提到的REINFORCE算法:

在这个算法的第二步骤里面我们引入了“reward to go”这一项,该 表示了从当前的时间步t开始,所有的reward的期望之和。

我们可以把这个由casuality引出的期望称之为“true expected reward-to-go”, 之所以我们这里考虑的是期望,是因为我们在实际中每个trajectory采样出来都是不一样的,我们需要把这不同的采样结果进行最后的平均以求期望。

优势函数(Advantage function)

我们在policy gradient的方法中为了降低variance,也考虑过引入一个基线来减少梯度的方差。这里我们更进一步一点,我们使用 代替原来的"reward to go",并且使用值函数(V function)去代替原来的baseline,这样我们就有了新的估计值,即优势函数。

与原始版本的baseline相比,原来的估计是无偏估计,但是在单个采样估计中具有很高的方差(variance),现在使用了优势函数之后可以降低方差。他们的比较如下图:

三个函数的比较:Q, V and A

在模型拟合的阶段,我们需要去评估结果,这个时候就要考虑去拟合Q, V 还是A。他们之间是有密切关系的:

其中对于Q函数他是在已经确定了 的情况下,并且已经产生了 ,即我们可以写为:

既然他们是有关系的,那么我们在实际使用的时候只需要计算一个期望函数 .

对于如何去评估一个Policy是好是坏,我们从 的定义可以知道,强化学习的目标函数其实就是这个值关于初始状态 的期望值。

这里有两种Monte Carlo的方法来评估:

第一种是在一个sample里面累积 reward,第二种还考虑了多个sample的平均。

我们从上面的第一种简单得到 的方法中得到了训练数据,我们就可以把评估的问题转换成了一个监督学习的问题:

形式化理解为,我们用同一个函数去拟合了很多很多的样本。

上面使用的方法会有很高的方差,在实际中我们是用一种近似的方式去减少方差:

这里我们是直接使用了之前的V值( )去近似,然后得到了训练数据的样本 ,这种方式称之为bootstrap。

有了前面的基础,介绍了如何去拟合 ,计算优势函数我们就能够导出Actor-critic算法,

上面的actor-critic算法里第一步还需要采样一整个trajectory。想要变成每次只采样一个状态就需要先引入Discount factors的概念。

因为值函数V的定义是当前状态以后所有反馈值的和,在有限步长的任务中没有问题,但是如果是一个无限步长的任务,那么这个值有可能是无限大的。因此需要引入一个折损系数 ,它的意义在于让离当前状态比较近的反馈值更重要,而离得比较远的可能不那么看重.

上面举了个例子,在机器人做操作这种episodic tasks的时候是有限步长的就不需要discount factor,但是另外一种continuous任务,就不需要设定episodic所以这种情况加入discount factor就很重要。

加入了Dicount factor,我们对应的目标函数也变化:

这种情况下MC policy gradients有两种选择:

第一种是直接从当前时间t开始加系数 ,而第二种是从最开始t=1就开始加系数 。然后再通过利用causasity去掉 之前的反馈值。这样最终两种写法的系数还是有一些差别。

一般情况下两种方式有两种不同的解释和应用场景。第二种写法是对应着带有死亡状态的MDP形式。系数从第一步就开始加入,这就意味着这种写法更在意从头开始的动作,对于往后的动作给的关注更少。

而第一种写法是从时刻t开始加系数,也就是说它会一直在意从当前时刻开始的动作。这种形式一般用在一直连续运动的场景里。

第一种写法实际上不是一个正确的加了discount factor后的写法。它相当于是对平均反馈值加了一个系数来减小方差,它去除掉那些距离太远的反馈值的影响,因为可能太远了已经没有了意义。当然这样会是平均反馈的有偏估计。

第一种写法实际中更常用,也就是作为减小方差的方式。而第二种写法能够向我们解释在经典的场景里discount factor的意义。

加入了discount factors之后的actor-critic算法可以采用对每个状态进行采用的形式,这样就有了online形式的算法,两种算法对比如下

在实际实现actor-critic算法的时候可以选择两种结构。一种是让策略函数与值函数分别训练。这样做可能比较简单而且稳定,但是这样就不能共享一些提取特征的网络层。第二种是两种函数共享一部分网络,这样就能够共享前面提取特征的部分。

实际中如果实现一个online形式的算法,最好的做法并不是对每一个状态都做一次更新,而是得到足够多的样本里作为一个batch来更新。因为这样能够减小更新的方差。而实现这样的方式也有两种,一种是同步的一种是异步的。

我们把AC和PG对比一下,AC一般会因为有critic所以有更低的方差,但是如果critic不好那么他的bias会很大。PG是没有bias的,但是他的方差很高。把他们结合在一起就能产生比较好的unbias,低方差的算法。

之前用到作为baseline的函数一直都是V,实际上Q也能够作为baseline。只不过这样做实际上得到的不是一个advantage函数,在期望上得到一个期望为0的函数。因为减小了这部分的值,就能够减小对应部分的方差。

但是期望为0直接带入得不到目标函数的梯度值,因此计算梯度值的时候还需要把 以期望的形式修正回来,这样目标函数梯度值的期望与原来保持一致

目前我们有两种得到advantage函数的形式,一种 是bootstrap的,有更低的方差,但是有比较高的偏差。第二种是蒙特卡洛采样减去估计值的 ,这样做没有偏差,但是方差比较大。因此我们需要想办法把这两种结合起来。

我们可以使用n-step和Eligibility trace的方法来改善。

使用n-step的直觉如下图:

以上是关于Actor Critic的主要内容,如果未能解决你的问题,请参考以下文章

Erlang VS Akka- Actor模型介绍

不要在父供应商actor重启时重新启动处理actor

Actor模型

C++ Actor并发模型框架 Actor Framework (CAF)

第4节 Scala中的actor介绍:1actor概念介绍;2actor执行顺序和发送消息的方式

(转载)虚幻引擎3--Actor 更新(Actor Ticking)