ML2.2.2 PG 之 AC 方法思路和实践

1. 资料

PG 方法基础思路:https://pangruitao.com/post/5164

PG 最基础的 REINFORCE 方法实践:https://pangruitao.com/post/5258

2. AC 方法思路

AC (Actor-Critic) 方法是对基本的 REINFORCE 方法的改进。改进前,我们先找到 REINFORCE 的问题:稳定性和收敛能力比较差。

其背后原因被发现的至少有两个。

第一个原因, 即梯度高更新幅度问题,REINFORCE 在更新神经网络参数时采样的价值通常很不稳,忽大忽小。

  • 而我们更理想的是每个样本均匀地对模型造成拉扯最终拉到理想的最大化目标函数的状态,而非经常性猛拉导致越过最佳点,模型反而变差。(回忆一下梯度下降/上升)

第二个原因,是采样偏差,由于模型的最后输出是对各行为价值估计取 softmax ,先天值(神经网络初始随机)越大则越容易被取到。但很可能一些实际很优势的行为因为先天不足而被难以采样。而被采样的行为的策略优势在进一步被采样后越来越大。虽然理论上只要采样次数足够多,任意行为都能被采样到,且真正优势的行为的价值估计会在被采样后很快赶超。但“足够次数”往往在现实中的体现则是收敛慢。

对于这两个原因/问题,发现有个方式可以显著减轻其影响

  • 减去一个 baseline 就可以减少更新的方差。baseline 通常选择状态 s 的平均期望回报 \(V(s)\)

基于这个方法,修改策略网络的梯度公式修改为:

\(\theta \leftarrow \theta + \alpha \mathbb{E_{\pi_{\theta}}} \left[ \sum_{t=0}^{T} \nabla_{\theta} \log \pi_{\theta}(a|s_t) (\hat{A}(s, a) – V(s)) \right]\)

举一个例子说明为什么减一个 baseline 这样做能有效减少梯度更新时的幅度:

  • 在很多实际场景下,蒙特卡洛的采样的价值变动的方差本身可能非常大。
  • 比如对状态 s 下选择行为 a 的价值/优势(即 \(\hat{A}(s, a)\))的采样了 4 次,得到值是5, 20, 50, 10。
  • REINFORCE 方法中,对应的梯度更新则是
    • \(5 * \nabla_{\theta} \log \pi_{\theta}(a|s_t)\)
    • \(20 * \nabla_{\theta} \log \pi_{\theta}(a|s_t)\)
    • \(50 * \nabla_{\theta} \log \pi_{\theta}(a|s_t)\)
    • \(10 * \nabla_{\theta} \log \pi_{\theta}(a|s_t)\)
  • 幅度很大。而如果减去一个估计的均值,如 20,则更新变为
    • \(-15 * \nabla_{\theta} \log \pi_{\theta}(a|s_t)\)
    • \(0\)
    • \(30 * \nabla_{\theta} \log \pi_{\theta}(a|s_t)\)
    • \(-10 * \nabla_{\theta} \log \pi_{\theta}(a|s_t)\)
  • 整体都更接近 0 ,即减小了更新值的波动幅度,而这种小绝对值的更新,间接地提高了梯度估计的稳定性。

现在问题来到如何建模这个 \(V(s)\) ?

可以又一次求助于我们的万能神经网络。AC就是这个思路,用第二个神经网络专门用于估计 \(V(s)\) 的值。在 AC 里被称作 Critic 。

如何更新 Critic 神经网络呢?

可以用时序差分 TD (Temporal Difference) 的方法(TD说明见:https://pangruitao.com/post/5164 蒙特卡洛部分)

\(V(s_t) \leftarrow V(s_t) + \alpha [r + \gamma V(s_{t+1}) – V(s_t)]\)

注:这个 \(r + \gamma V(s_{t+1}) – V(s_t) \) 也被叫作 TD-error

或者设置

\(\text{loss} = (r + \gamma V(s_{t+1}) – V(s_t))^2 \)

3. AC 方法实践

发表评论