笔记整理自李宏毅老师的公开课
Asynchronous Advantage Actor-Critic (A3C)
回顾Policy Gradient的梯度参数:
∇Rˉθ≈1N∑n=1N∑t=1Tn(∑t′=tTnrt′−trt′n−b)∇logpθ(atn∣stn)
\nabla \bar{R}_{\theta}\approx \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_n}\left(\sum_{t^{'}=t}^{T_n}r^{t^{'}-t_{r^{n}_{t^{'}}}}-b\right)\nabla\log{p_{\theta}(a_{t}^{n}|s_{t}^{n})}
∇Rˉθ≈N1n=1∑Nt=1∑Tn⎝⎛t′=t∑Tnrt′−trt′n−b⎠⎞∇logpθ(atn∣stn)
如果令Gtn=∑t′=tTnrt′−trt′nG_{t}^{n}=\sum_{t^{'}=t}^{T_n}r^{t^{'}-t_{r^{n}_{t^{'}}}}Gtn=∑t′=tTnrt′−trt′n,GtnG_t^{n}Gtn是Actor跟环境互动而来的,那么GGG则会使不稳定的。因为数值本身具有随机性,而且环境也有随机性。不过,如果我们sample足够多的次数,那么均值会比较稳定。
其实,本质上来说,有下面的公式成立:
E[Gtn]=Qπθ(stn,atn)
E\left[G_{t}^{n}\right]=Q^{\pi_{\theta}}(s_t^{n},a_t^{n})
E[Gtn]=Qπθ(stn,atn)
那么问题转换成了求解Qπθ(stn,atn)Q^{\pi_{\theta}}(s_t^{n},a_t^{n})Qπθ(stn,atn);同时,bbb可以用Vπθ(stn)V^{\pi_{\theta}}(s_t^{n})Vπθ(stn)进行表示。但是,这样做的缺点在于,我们需要估计QπQ^\piQπ和VπV^\piVπ这两个神经网络,这样的训练量大,而且结果不稳定。引入一个代换法则:
Qπ(stn,atn)=E[rtn+Vπ(st+1n)]
Q^\pi\left(s_t^n,a_t^n\right)=E\left[r_t^n+V^\pi\left(s_{t+1}^n\right)\right]
Qπ(stn,atn)=E[rtn+Vπ(st+1n)]
实际使用时,可以去掉期望值,原作者的Paper实验这样做的效果比较好。
Qπ(stn,atn)=rtn+Vπ(st+1n)
Q^\pi\left(s_t^n,a_t^n\right)=r_t^n+V^\pi\left(s_{t+1}^n\right)
Qπ(stn,atn)=rtn+Vπ(st+1n)
可以这么理解,QQQ的意思是为了表示sts_tst状态下,采取行动ata_tat后会获得的所有的奖励总和,那么和自然,这个公式可以表示成当前这一步行动的奖励rtr_trt累加上下一个状态的奖励VVV。rrr是个随机值,由环境等的因素共同决定,这也是这个模型的缺点,由随机值的影响。
那么,最终的梯度可以表示为:
∇Rˉθ≈1N∑n=1N∑t=1Tn(rtn+Vπ(st+1n)−Vπ(stn))∇logpθ(atn∣stn)
\nabla \bar{R}_{\theta}\approx \frac{1}{N}\sum_{n=1}^{N}\sum_{t=1}^{T_n}\left(r_t^n+V^\pi(s^n_{t+1})-V^\pi(s^n_t)\right)\nabla\log{p_{\theta}(a_{t}^{n}|s_{t}^{n})}
∇Rˉθ≈N1n=1∑Nt=1∑Tn(rtn+Vπ(st+1n)−Vπ(stn))∇logpθ(atn∣stn)
训练时候的QQQ和VVV网络可以共享前面几层的参数,只是在最后输出的时候,变换到不同的网络层中。训练的时候,可以使用输出参数的交叉熵作为π(s)\pi(s)π(s)的参数,那么交叉熵越大,说明越需要进行Exploration。
A3C是同时开多个环境进行产生数据,并不断更新。
Pathwise Derivative Policy Gradient
在之前的QπQ^\piQπ网络中,我们输入一个游戏状态sss和一个行动aaa,时候会得到一个Qπ(s,a)Q^\pi(s,a)Qπ(s,a)作为输出。而该方法的特别之处在于,专门产生一个Actorπ\piπ网络用于生成行动aaa,这样,一个网络的输出就会作为另一个网络的输入。训练的时候,需要先训练QπQ^\piQπ网络,之后固定住该网络,再去训练π\piπ网络。
那么,Actor网络的梯度是:
θπ′=θπ+η∇θπQπ(s,a)
\theta^{\pi^{'}}=\theta^\pi+\eta\nabla_{\theta^\pi}Q^\pi(s,a)
θπ′=θπ+η∇θπQπ(s,a)
给出一般性的算法:
- 初始化Q-function QQQ,target Q-function Q^=Q\hat{Q}=QQ^=Q,actor π\piπ,target actor π^=π\hat{\pi}=\piπ^=π
- 在每个episode中:
- 对于每一步
- 给定一个状态sts_tst,基于π\piπ采取行动ata_tat,注意这里需要Exploration
- 获得一个奖励rtr_trt,并到达一个新的状态st+1s_{t+1}st+1
- 把(si,ai,ri,si+1)(s_i,a_i,r_i,s_{i+1})(si,ai,ri,si+1)存储到buffer中
- 从buffer中随机获取一个批次的(si,ai.ri,si+1)(s_i,a_i.r_i,s_{i+1})(si,ai.ri,si+1)
- 目标函数y=ri+Q^(si+1,π^(si+1))y=r_i+\hat{Q}(s_{i+1},\hat{\pi}(s_{i+1}))y=ri+Q^(si+1,π^(si+1))
- 更新QQQ的参数,使得Q(si,ai)Q(s_i,a_i)Q(si,ai)接近yyy
- 更新π\piπ的参数去最大化Q(si,π(si))Q(s_i,\pi(s_i))Q(si,π(si))
- 每C步执行更新Q^=Q\hat{Q}=QQ^=Q,π^=π\hat{\pi}=\piπ^=π
- 对于每一步