0 引言
同时用函数逼近策略和值函数,可以用“演员-评论家”算法来实现。对于连续动作空间,为什么不直接使用PG,非要折腾出一个Actor-Critic算法。
它的优点是:
- 相对于Q-learning来说,收敛性更好
- 相对于PG来说,可以单步更新参数,而不用回合更新,提高了效率。
1 AC
首先,介绍什么是演员评论家算法。
AC算法来自策略梯度。
策略梯度公式:
$$
\Delta_{\theta}J(\theta)=\mathbb{E}_{\pi_{\theta}}[\nabla_{\theta}log\pi_{\theta}(s,a)Q^{\pi_{\theta}}(s,a)]
$$
第一部分$\nabla_{\theta}log\pi_{\theta}(s,a)$决定参数调整的方向,第二部分$Q^{\pi_{\theta}}(s,a)$决定调整的幅度。AC算法的思想就是把第二部分独立出来,使用另外一个网络来表示。也就是评论家部分。保留第一部分为演员部分。
然后,介绍两个部分如何更新自己的参数。引用一张网上经典的图:
Actor部分,使用策略梯度更新参数,不同的是,策略梯度的第二部分换成一个带有参数的$Q^w(s,a)$。
Critic部分,使用策略评估的方式更新参数,如TD。$Q^w(s,a) \approx Q^{\pi_{\theta}}(s,a)$
图中的TD-error是个什么鬼?就是TD-target减去V的估计值。
问题:引入Critic部分,会不会引入偏差?理论证明只要满足下面两个条件就不会引入偏差。
- $Q^w(s,a)=\nabla_{\theta}log\pi_{\theta}(s,a)^Tw$
- 参数$w$由最小化均方误差$\epsilon^2(w)=\mathbb{E}_{s\sim\rho^{\pi},a\sim\pi_{\theta}}[(Q^w(s,a)-Q^{\pi_{\theta}}(s,a))^2]$获得。
那么Actor部分的梯度误差便成了:
$$
\Delta_{\theta}J(\theta)=\mathbb{E}_{\pi_{\theta}}[\nabla_{\theta}log\pi_{\theta}(s,a)Q^w(s,a)]
$$
根据第二部分,可以将AC算法总结如下:
2 QAC
伪代码为:
advantage function
对于一个策略$\pi_{\theta}$来说,advantage function定义为
$$
A^{\pi_{\theta}}(s,a)=Q^{\pi_{\theta}}(s,a)-V^{\pi_{\theta}}(s)
$$
则策略梯度可以表示成:
$$
\nabla_{\theta}J(\theta)=\mathbb{E}_{\pi_{\theta}}[\nabla_{\theta}log\pi_{\theta}(s,a)A^{\pi_{\theta}}(s,a)]
$$
使用advantage function的好处在于:
- 减小策略梯度的方差
- critic可以很好地估计出advantage function
- 用两套参数分别估计状态值函数和动作-状态值函数
$$
V_v(s) \approx V^{\pi_{\theta}}(s)
$$
$$
Q_w(s,a) \approx Q^{\pi_{\theta}}(s,a)
$$
则advantage function为
$$
A(s,a) = Q_w(s,a) - V_v(s)
$$
3 算法实现
设计两个类,一个Actor,另一个Critic。首先,介绍离散动作空间的问题,CartPole
Actor的输入是状态、输出是动作。
接着定义Critic类如下:
Critic的输入是状态,输出是TD-error。
最后就是学习的过程
CartPole-v0实现
如果是连续动作空间,这时候Actor类就需要改写
其他部分不变。
Pendulum-v0实现
参考文献
[1] David Silver, reinforcement learning lecture 7
[2] Morvan 强化学习教程 AC