Policy Gradient(PG)
PG 方法是直接对策略进行建模和优化的方法,利用目标函数的梯度来直接更新策略参数
$$ \theta \leftarrow \theta + \alpha \nabla_{\theta} J(\theta) $$这个目标函数 $J(\theta)$ 是一个关于策略参数 $\theta$ 的函数,表示在给定策略下的期望回报。
$$ J(\theta) = \mathbb{E}_{\pi_\theta} [G_t] = V^{\pi_\theta}(s) $$虽然 Value function 是一个直接关于 state 的函数,但是我们可以使用 Q function 来表示,此时便可以在 Value Function 的基础上引入 action,而在策略算法下,action 是由策略 $\pi_\theta$ 给出的,所以我们可以将目标函数写成
$$ \begin{aligned} \nabla J(\theta) &= \nabla_\theta V^{\pi_\theta}(s) \\ &= \nabla_\theta \sum_{a} \pi_\theta(a|s) Q^{\pi_\theta}(s, a) \\ &= \sum_{a} \nabla_\theta \pi_\theta(a|s) Q^{\pi_\theta}(s, a) + X \quad (X 代表第二项)\\ &\propto \textcolor{blue}{\sum_{a} \nabla_\theta \pi_\theta(a|s) Q^{\pi_\theta}(s, a)} \\ &= \sum_{a} \pi_\theta(a|s) \frac{\nabla_\theta \pi_\theta(a|s)}{\pi_\theta(a|s)} Q^{\pi_\theta}(s, a) \\ &= \mathbb{E}_{\pi_\theta} \left[ \frac{\nabla_\theta \pi_\theta(A|S)}{\pi_\theta(A|S)} Q^{\pi_\theta}(S, A) \right] \\ &= \textcolor{red}{\mathbb{E}_{\pi_\theta} \left[ \nabla_\theta \log \pi_\theta(A|S) Q^{\pi_\theta}(S, A) \right]} \end{aligned} $$Yahoo!我们完成了对目标函数的梯度推导,不过这有一个好玩的地方,那就是在后面的过程中我们使用了一个对数小技巧把 $\sum$ 变成了 $\mathbb{E}$ 的形式。
为什么要这么多此一举!OK,因为我们要使用蒙特卡洛方法来做估计,而求和的方法需要知晓整个状态空间的情况
好的,关于策略 $\pi$ 部分的优化就暂时到这里,下一步则需要将重点放在另外一半,即 Q function 上了。
REINFORCE 算法
REINFORCE,我们用采样得到的实际轨迹回报 $G_t$ 来替代 $Q^{\pi_\theta}(S, A)$,从而得到一个无偏的估计
$$\theta \leftarrow \theta + \alpha \nabla_\theta \log \pi_\theta(A_t|S_t) \textcolor{blue}{G_t}$$但是这个方法有一个问题,那就是 $G_t$ 是随机采样得到的,波动大,用它来更新策略,会导致策略分布的方差也很大,学习过程不稳定。
Actor-Critic 方法就是为了解决这个问题而提出的。
在正式介绍算法前,先给出一个减少方差的技巧—— Baseline
假设 $b(s)$ 是一个任意的函数(不依赖动作a),那么对于任意的状态 $s$ 和动作 $a$,都有
$$\begin{aligned} \sum_{a} \pi_\theta(a|s) \nabla_\theta \log \pi_\theta(a|s) b(s) &= b(s) \sum_{a} \pi_\theta(a|s) \nabla_\theta \log \pi_\theta(a|s) \\ &= b(s) \sum_{a} \nabla_\theta \pi_\theta(a|s) \\ &= b(s) \nabla_\theta \sum_{a} \pi_\theta(a|s) \\ &= b(s) \nabla_\theta 1 \\ &=0 \end{aligned}$$那么我们可以在 REINFORCE 的基础上引入一个 baseline $b(s)$ 来降低方差,得到新的更新公式
$$\theta \leftarrow \theta + \alpha \nabla_\theta \log \pi_\theta(A_t|S_t) \textcolor{blue}{(G_t - b(S_t))}$$Actor-Critic 方法
Actor-Critic 方法的核心思想是使用一个 Critic 来估计 Q function $Q^{\pi_\theta}(s, a)$,然后用这个估计值来替代 REINFORCE 中的 $G_t$,从而得到一个更稳定的更新过程
这里就遇到了一个问题,当我们使用近似的值函数时,能否满足估计的值函数它带来的梯度方向与真正的值函数一致?也就是值函数估计问题
先说结论,当值函数满足下面两个要求时,可以做到无偏估计
第一条要求 Critic 对自己的梯度与 Actor 的 Score function 一致
$$ \nabla_\omega \hat{Q}(s,a) = \nabla_\theta \log \pi_\theta(a|s) \quad 一致性 $$eg:可以通过令 $\hat{Q}(s,a) = w^t \nabla_\theta \log \pi_\theta(a|s)$
第二条则是最小化均方误差 $\nabla_{\omega} \epsilon = 0$
$$ \min \ \mathbb{E}_{\pi_\theta}[(\hat{Q}(s,a) - Q^{\pi_\theta}(s,a))^2] \quad 最小化均方误差 $$从两条要求中我们可以推导得到下面的关系
$$\begin{aligned} \textcolor{blue}{\mathbb{E}_{\pi_\theta} \left[ (Q^{\pi_\theta}(s,a) - \hat{Q}(s,a)) \nabla_\theta \log \pi_\theta(a|s) \right]} = 0 \end{aligned}$$诶,这个表达式就很有趣了,因为它再进一步可以展开成
$$ J(w | Q^{\pi_\theta}) - J(w | \hat{Q}) = \mathbb{E}_{\pi_\theta} \left[ (Q^{\pi_\theta}(s,a) - \hat{Q}(s,a)) \nabla_\theta \log \pi_\theta(a|s) \right] = 0 $$它保证了我们使用 Critic 估计的 Q function $\hat{Q}(s,a)$ 来更新 Actor 的策略参数时,所得到的梯度方向与使用真实的 Q function $Q^{\pi_\theta}(s,a)$ 所得到的梯度方向是一致的,从而保证了策略更新的有效性。