Actor Critic Algorithms¶
基本思想
引入 critic,通过 bias 换取 lower variance
RECAP: REINFORCE Algorithm¶
步骤
- sample \(\set{\tau^i}\) from \(\ac(a_t | s_t)\)
- \(\nabla J(\theta) \approx \sum_i^N \sum_t^T \nabla \log \ac(a_{i, t} | s_{i, t}) \hat Q^\pi_{i, t}\)
- 在 REINFORCE 中,\(\hat Q^\pi_{i, t} = \sum_{t'=t}^T r(s_{i, t'}, a_{i, t'})\)
- \(\theta \leftarrow \theta + \alpha \nabla J(\theta)\)
也就是经典的三步走:
- 使用当前策略进行采样
- 使用采得的样本求 policy gradient
- 更新策略
How to Reduce Variance?¶
Notation
注意,这三个 \(Q, V, A\) 都是准确的。
由于 \(Q^\pi(s_{i, t}, a_{i, t}) = E_{(s_{i, t+1}, a_{i, t+1}, s_{i, t+2}, a_{i, t+2}, \dots) \sim \pi}[\hat Q^\pi_{i, t}]\),因此我们可以把 \(\hat Q^\pi_{i, t}\) 替换成 \(Q^\pi\),从而减小方差:
- 为什么还是约等号?因为虽然 \(Q(s_{i, t}, a_{i, t})\) 是准确的,但是 \(s_{i, t}\) 和 \(a_{i, t}\) 仍然是 stochastic 的
为了进一步减小方差,不难想到,我们需要使用 baseline。这里,我们使用 \(V^\pi\) 当做 baseline:
证明:如果一个 baseline 只与 state 有关,那么最终求得的梯度就是 unbiased
由条件期望定理:
而
因此
由于 \(V(s_t)\) 只与 state 有关,因此就是 unbiased。
- 甚至,即便不用准确的 \(V\),而是用对 \(V\) 的估计——\(V_\phi\)(下文提到)。由于 \(V_\phi\) 也只与 state 有关,因此在 \(Q\) 准确的情况下,也是 unbiased
Bias-Variance Tradeoff: Fit a Value Function¶
显然,我们无法得到准确的 \(Q^\pi, V^\pi\)。如果我们用 sample 的方式去逼近,会很浪费样本。又由于我们可以仅用一个 \(V\) 来估计 \(V, Q, A\) 三个函数。因此,我们决定用拟合的方式——拟合一个函数 \(V^\pi_\phi\),来近似 \(Q^\pi, V^\pi\)。
AC Algorithms¶
每一步的解释
- 从当前策略中采样轨迹
- 拟合 \(V^\pi_\phi\)
- 通过轨迹以及 \(V^\pi_\phi\),估计 advantage \(A^\pi_\phi\)
- (通过 advantage)估计策略梯度
- 反向传播
相比 REINFORCE 算法而言,多了两步:
- 拟合 \(V^\pi_\phi\)
- 通过轨迹以及 \(V^\pi_\phi\),估计 advantage \(A^\pi_\phi\)
如上图:
- 所谓 batch,就是我们走 k 步之后(或者走完一个/若干个 trajectories 之后),再统一进行更新
- 所谓 online,就是我们每走一步,就进行一次更新
Realworld AC Algorithm¶
Warning
下图中的 batch,和上面的 batch 不一样。
- 下面的 batch 指的是 \(\sum_{i = 1}^N\) 这个 batch,即 multi-trajectories
- 而上面的 batch 指的 \(\sum_{t = 1}^T\),即 multi-steps
简单来说,下图中就是
- 多个 trajectories 并行
- 对于左边,所有 trajectories 都仿真一步之后,才统一更新一次 \(\theta\);右边,每一个 trajectory 仿真一步完成之后,立即更新 \(\theta\)
在实际中,我们经常采用所谓 A3C 算法:Asynchronous Actor-Advantage-Critic(如下图中右侧所示)。其目标就是:通过异步更新,提高采样效率。
Replay Buffer¶
Info
如何进一步加速?开源、节流是两大法宝。
- 上面的 A3C 就是开源(利用了并行和异步)
- 下面的 replay buffer 就是节流(重用了之前的样本)
每一步的解释
- 从当前策略中采样轨迹,储存到 replay buffer 里面
- 从 replay buffer 中 sample 一个 batch
- 拟合 \(V^\pi_\phi\)
- 通过轨迹以及 \(V^\pi_\phi\),估计 advantage \(A^\pi_\phi\)
- (通过 advantage)估计策略梯度
- 反向传播
相比上面的 vanilla AC 算法而言:
- 多了一步:轨迹储存到 replay buffer 里面
- 改了一步:从 replay buffer 中取出一个 batch,而不是直接用当前的采样
How to Fix the Broken Algorithm?¶
但是,如果就按照上面的步骤,那么在数学上是有问题的(我们这里先不考虑 \(s_i\) 本身的分布):
-
\(y_i = r_i + \gamma V^\pi_\phi (s_i')\) 中,按理说,假设 \(V^\pi_\phi\) 是准确的,那么 \(y_i\) 就应该是 \(V_\phi^\pi(s_i')\) 的无偏估计。
但是这里的 \(a_i\) 是通过旧的策略 sample 的,因此 \(a_i\) 的分布不对,从而 \(s_i' \sim p(s_i'|s_i, a_i)\) 的分布不对,从而 \(y_i\) 显然不是无偏的 2. 同上,由于 \(a_i\) 的分布不对,因此 \(\log_\theta \ac(a_i | s_i)\) 也不对
如何改正?
- 实际上,对于异策略的 \((s_i, a_i, r, s_i', a_i')\),我们有 \(V^\pi(s_i) \neq Q^\pi(s_i, a_i) = E[r_i + \gamma V^\pi_\phi (s_i')]\),因此,我们拟合一个 \(Q\) 就行,而不需要拟合 \(V\)
- 改正第一个错误:\(y_i = r_i + \gamma Q^\pi_\phi(s_i', a_i'^\pi), \text{ where } a_i'^\pi \sim \pi_\theta(a_i'^\pi | s_i')\)。这里,我们不用之前的 \(a_i'\),而是通过当前的策略抽样一个 \(a_i'^\pi\)
- 改正第二个错误:\(\log_\theta \ac(a_i^\pi | s_i), \text{ where } a_i'^\pi \sim \pi_\theta(a_i^\pi | s_i)\)。同样,这里,我们不用之前的 \(a_i\),而是通过当前的策略抽样一个 \(a_i^\pi\)
Rule of Thumb¶
- 为什么之前我们要想办法降低一个样本的 variance 呢?
- 因为采样困难,因此我们需要谨慎利用每一个样本
- 现在,我们直接从 replay buffer 中抽取,想抽多少就抽多少,因此我们可以用大样本量的方式来降低方差
因此,我们这里直接用 Q 函数就好,没必要估计 advantage - 第一因为直接用 Q 函数更简单 - 第二因为估计 advantage 也是额外的计算量,我们还不如多抽一些样本
Use Critic as Baseline¶
Info
这是在 policy gradient 上的改进
我们可以把 critic 用作 policy gradient 里面的 baseline。这样:
- 不会产生 bias(所有 policy gradient 的方法,都是 unbiased;但是 actor-critic 由于引入了一个 critic,因此存在 bias)
- 相比 vanilla policy gradient,如果 critic 足够准确,那么 variance 可以大大降低
\(V\): State-dependent Baselines¶
Actor-critic:
- low variance
- not unbiased
Policy gradient:
- high variance
- unbiased
上文中,我们证明了如果一个 baseline 只与 state 有关,那么最终求得的梯度就是 unbiased。因此,我们直接令 \(b = V^\pi_\phi(s_{i, t'})\) 即可。也就是:
\(Q\): action-dependent baselines¶
相比 \(V\) 而言,\(Q\) 可以实现更低的 variance(因为多了一个 action,更加精确)。
- \(\sum_{t^{\prime}=t}^{\infty} \gamma^{t^{\prime}-t} r\left(\mathbf{s}_{t^{\prime}}, \mathbf{a}_{t^{\prime}}\right)-V_\phi^\pi\left(\mathbf{s}_t\right)\) 就是我们刚才推出的 state-dependent baseline
- \(\sum_{t^{\prime}=t}^{\infty} \gamma^{t^{\prime}-t} r\left(\mathbf{s}_{t^{\prime}}, \mathbf{a}_{t^{\prime}}\right)-Q_\phi^\pi\left(\mathbf{s}_t, \mathbf{a}_t\right)\) 就是我们希望直接将 \(V\) 替换成 \(Q\)(但是这样做不对)
- 最后一个式子,在倒数第二个的基础上,增加了一个小尾巴,就 unbiased 了
对于这个小尾巴,
- 对于简单的函数来说,可以直接求出解析式
- 对于复杂的函数(如神经网络)来说,也可以多次采样求平均(由于不需要实际在环境中采样,因此代价很小)
Eligibility Trace and N-Step Returns (Advantage Estimation)¶
Info
这是在 Vanilla AC Algorithm 上的改进,旨在让我们更加精确地对 bias-variance 进行 tradeoff
另外,Eligibility Trace 和 GAE 是同一个公式的两种解释。
- 我们通过将所有 N-Step Returns 求个加权平均,直接得到 GAE
- 我们将 GAE 进行变形,从而得到可以通过递推实现 \(\mathcal O(n)\) 复杂度的算法。同时,我们得到了 GAE 的另一种解释
N-Step Returns¶
经典的 One-step advantage estimation 就是:
从而,N-step advantage estimation 就是:
一般而言:N 越大,方差越大,bias 越小;N 越小,方差越小,bias 越大。
GAE: Generalized Advantage Estimation¶
解释
Advantage Estimation 指的是各种 step 或长或短的 \(\hat A\)。GAE 的所谓 "generalized",就在于将这些 \(\hat A\) 进行了加权平均。
因此,我们到底选择哪一个 N 呢?实际上,我们不只用一个 N,而是构造 Generalized Advantage Estimation,用所有的 N 求一个加权平均数:
一般而言,我们选择使用指数衰减,主要原因是我们这样可以从后往前递推,从而计算的时间复杂度是 \(\mathcal O(n)\) 而不是 \(\mathcal O(n^2)\):
但是,上面这个公式,直接看起来,并不是能够递推的。那么,如何转变形式才能递推呢?我们就要把这个 GAE 形式转变成 Eligibility Trace。
Another POV: Eligibility Trace¶
解释
Trace 就是“(留下的痕)迹”,也就是所有 \(t\) 对应的 \(\delta_t\)。Eligibility 就是“资格”——你这个 \(\delta_t\),在我最终结果中,有多大的资格(i.e. 加权平均的权重多大)?
因此,资格迹本质上就是所有的“迹”的一个加权平均
递推计算方法:
不难看出,我们得到了 GAE 的另一种解释。这种解释被称为 Eligibility Trace。其内涵如下:
- 对于每一个 \(t'\),都有一个人拿着喇叭在喊话:\(\delta_{t'}\)
- 喊话的声音,需要从 \(t'\) 一直传回 \(t\),才能算被听见
- 声音每隔一个单位,就衰减 \(\gamma\lambda\)
- 因此,远方的声音,几乎听不到(i.e. 几乎没资格);近处的声音最响亮(i.e. 资格最大)