Actor-critic
李宏毅深度强化学习
学习笔记
学习资料:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS18.html
Review-Policy Gradient
- 采用了以下这个式子来更新policy gradient:
- 这个式子在说我们先和环境互动,然后让我们可以计算出在某一个state采取了某一个action a的机率,接下来计算出从这个state采取这个a之后到游戏结束的累积回报有多大,把时间 t t t到时间 T n T_n Tn的reward通通加起来。有时候会在前面乘以一个discount factor(折扣因子),因为离现在这个action比较久远的action和现在是没有什么关系的,0.9或者0.99。接下来会减掉一个baseline值b,目的是希望括号里面这一项是有正有负的。如果括号里这一项是正的,我们就要增加这个state采取这个action的机率;反之,减少。
- 但是
G
G
G这个值是非常unstable的,因为互动的process是有随机性的,所以在某一个state s采取某个action a,然后计算累积回报,每次算出来的结果都是不一样的。所以
G
G
G是一个random variable,给同一个s和a,
G
G
G可能会有个distribution。但是我们采取的是sample的方式,我们采取某个s和a然后玩到底,我们看看说会得到多少的reward就当作
G
G
G。所以相当于是拿一些sample的结果当作sample的参数。
- 但是实际上在某一个s采取a会发生什么事?虽然说有固定的distribution,但它本身是有随机性的。而这个random variable它的变化可能会非常大。
- 假设我们可以sample足够的次数就没有什么问题,但实际是我们每次update之前sample的次数是不可能太多的,显然结果会是很差的。
- 那么我们能不能让整个training的process变得stable一点?能不能够直接估计出
G
G
G这个变量的期望值?我们在state采取a的时候我们想办法用network去估计在采取action a的
G
G
G的期望值,如果可行,就可以用期望值代替sample的值,这样让training变得比较stable。
-那么怎么让期望值代替sample值呢?这里要用到value-based的方法。我们就用的Q-learning。
Review-Q-learning
- 在讲Q Learning的时候,有两种critic。
- 状态值函数 V π ( s ) V^{\pi}(s) Vπ(s)。它的意思是说在假设actor是 π \pi π的时候,我们拿 π \pi π去做互动时,累积回报有多少。
- 状态-动作值函数
Q
当
s
t
a
t
e
采
取
a
c
t
i
o
n
a
,
接
下
来
都
用
Q^当state采取action a,接下来都用
Q当state采取actiona,接下来都用\pi$来跟环境进行互动,累积回报是多少。
Actor-Critic
- G G G这个随机变量的期望值正好是 Q Q Q, Q Q Q的定义是在某一个state s采取某个action a,假设我们现在的policy就是 π \pi π的情况下的累积回报。
- 所以画蓝线的那一项如果要用期望代表,就是需要估计出Q function,然后把Q function套进去。就可以结合起来了。baseline可以用不同的方法,最常见的是用value function。V其实是Q的期望值,括号里的这一项就会是有正有负的。
Advantage Actor-Critic(A2C)
- 这样做有个缺点,需要估计两个network,Q和V的。就有两倍估测不准的风险,那么能不能只估计一个呢?事实上,可以只估计V这个network。
- Q可以用V表示:
- r本身是随机变量,在state s采取了action a,接下来会得到什么样的reward和跳到 s t + 1 s_{t+1} st+1其实是不确定的。所以要加上期望值才是准确的。
- 现在把期望去掉,让Q function用r+V取代掉。这样的好处是可以只用估计一个network了,但是坏处是引入了r是随机的,但是这个相较于
G
G
G的随机性小一些,因为它是某一个state得到的reward,而G是所有未来state的reward总和。所以这样做是合理的。
- 虽然把期望值去掉听起来有点不合理,但是A3C的paper里面做出来就是这个结果最好。
- 括号里的式子是Advantage function
- 整个过程是:先有一个 π \pi π,一个初始的actor先在原来的policy里面收集资料,收集好资料后,就要拿去update你的policy,但是在actor-critic里面不是直接拿资料去update。而是先拿这些资料去估计出value function,(A2C),这个估计的过程可以用TD或者MC。估计出value function后,用上面的式子去update π \pi π。有了新的 π \pi π以后再去和环境互动,进入下一个循环。
- 两个Tip
- 实际需要估计两个network。一个是V,一个是policy的network。V这个network是input state,output 一个scaler标量。actor这个network是input state,output action的distribution。他们的network 的input都是s,所以前几个layer其实是可以共享的。尤其是像Atari或者3D的游戏,input是image,非常复杂,通常用CNN处理。所以通常前面共用同一个参数。
- 另外一件事情是我们同样需要exploration的机制。有一个很常见的exploration的方法是在对 π \pi π output的distribution下一个control,希望这个distribution的entropy(熵)不要太小,也就是希望不同的action被采用的机率多一点。这样它才会把环境探索的比较好。
- 实际需要估计两个network。一个是V,一个是policy的network。V这个network是input state,output 一个scaler标量。actor这个network是input state,output action的distribution。他们的network 的input都是s,所以前几个layer其实是可以共享的。尤其是像Atari或者3D的游戏,input是image,非常复杂,通常用CNN处理。所以通常前面共用同一个参数。
Asynchronous Advantage Actor-Critic(A3C)
强化学习的一个问题就是很慢。那么怎么增加训练的速度呢?
- 我们就可以建立很多的分身。
- 我们可以开很多的worker,把经验集合在一起。
- 一开始有global network(前面说过actor和critic前面几个layer是在一起的),有关policy的network和value的network。每一个worker用一个cpu去跑。
- 每一个worker工作前就把参数 θ \theta θ copy过来,接下来就和actor做互动,每一个actor都会不一样就会收集到多样性的data,互动完后就会得到gradient,gradient就可以去update参数。注意,所有的actor是平行跑的。意思是在传回去的时候,可能是更新的别的worker更新的参数。
Pathwise Derivative Policy Gradient
这是Q learning解连续性问题的方法。
传统的actor-critic在只知道现在做的这个行为好还是不好,但是在Pathwise Derivative Policy Gradient里面可以直接知道要怎样做才是好的,critic会直接引导actor做action得到更多的reward。
-
Q learning不能考虑连续性问题,那么我们可以用一个continuous vector来解这个优化问题。
-
假设这个actor就可以得到最大的Q value。在GAN里面,要知道一个discriminator的东西好不好,discriminator要自己生东西非常困难。所以另外写一个generator来生成。Q就可以类比GAN里面的discriminator,另外加一个actor来解。
-
因此我们原来的Q learning可以加一个actor来改进。或者说,原来的actor-critic不能知道应该怎样是好的,用Pathwise Derivative Policy Gradient可以。
-
用一个actor从s中得到a,a丢到Q function以后,可以让 Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)越大越好。实际上是把actor和Q接起来,变成比较大的network。然后固定住Q的参数,去调Actor的参数,用梯度上升的方法最大化Q的output。
-
开始有actor π \pi π去和环境互动,估计出Q value。然后把Q value固定,只更新actor,然后得到怎样的a可以最大化Q,更新 π \pi π,进入循环。