机器学习笔记(17.1): Actor-Critic

可能更好的阅读体验 Jeefy's Blog: Actor-Critic

为了解决 High Variance 和 High bias 之间的矛盾,可以把它们结合在一起,利用value based 和 policy based 两类方法各自的优势,还顺带把它们的短板都补上了。于是就有了集大成的 Actor-Critic 类方法。 具体来说,就是构造一个全能型的 agent,既能直接输出策略,又能通过 value function 来实时评价当前策略的好坏。所以我们需要两个网络,一个负责生成策略的 Actor 和一个负责评价策略的 Critic。这就有点类似一个演员在表演,而同时一个评论家在随时纠正他的表现,而且两者都还在不断更新,这种互补式的训练方式会比单独的策略网络或者值函数网络更有效。

├─→ Actor-Critic (A2C/A3C)
│   └── 引入 Critic 网络估计 V(s) 替代 G_t 作为 baseline
│   └── 解决:PG 高方差(你之前问的 baseline 机制在此成熟)
│   └── 问题:需要同时训练 Actor + Critic,步长敏感

没想到吧,AC 框架也有一万种变体

Q-Actor-Critic

on-policy

回顾 REINFORCE 算法 的核心损失:

\[\nabla J(\theta) = {\mathbb E}_{\tau \sim \pi_\theta} \left[ \sum_{t = 0}^T G_{\tau, t} \nabla \log \pi_\theta(a_t|s_t) \right] \]

那么如果说,让 \(G_{\tau, t}\) 由该模型一同计算呢?这不就是 DQN 中的 \(Q\) 网络吗。

所以还需要加上拟合 \(Q\) 的损失:

\[J_{critic}(\omega) = \frac 1 2\sum_{t = 0}^T (r_t + \gamma Q_\omega(s_{t + 1}, a_{t + 1}) - Q_\omega(s_t, a_t))^2 \]

为什么不直接使用 DQN?如果说动作空间不是离散的,那么我们就没法做:\({\rm softmax}_a Q(s, a)\) 的操作,得到最优的策略。

那既然我们有 \(Q(s, a)\) 了,真的需要这个 Policy Gradient 吗?其实没必要,直接定义:

\[J_{actor}(\theta) = - {\mathbb E}_{s \sim D} [Q(s, \pi_{\theta}(s))] \]

损失也很简单了。

所以训练流程就是:

  • 采样轨迹,更新 \(Q\) 网络(需要引入经验回放,和 DQN 一样,用于减少随时间传播的偏差)
  • 利用更新后的 \(Q\) 网络更新 \(actor\) 即可。

https://github.com/datawhalechina/easy-rl/blob/master/notebooks/A2C.ipynb


V-Actor-Critic

对于 Q-Actor-Critic 来说,构建的是 \(Q(s, a)\),能不能直接构建 \(V(s) = {\mathbb E}[Q(s, a)]\) 之类的东西?

\[J_{critic}(\omega) = \frac 1 2\sum_{t = 0}^T (r_t + \gamma V(s_{t + 1}) - V(s_t))^2 \]

那么策略函数就要和 REINFORCE 算法 函数一致了,因为这里没有 \(Q(s, a)\) 的东西来指导下一步的动作了。

\[\nabla J(\theta) = {\mathbb E}_{\tau \sim \pi_\theta} \left[ \sum_{t = 0}^T (r_t + \gamma V(s_{t+1})) \nabla \log \pi_\theta(a_t|s_t) \right] \]

但是别忘了我们还有一个问题,方差大,怎么办?减去 baseline 就好了:

\[\nabla J(\theta) = {\mathbb E}_{\tau \sim \pi_\theta} \left[ \sum_{t = 0}^T (r_t + \gamma V(s_{t+1}) - V(s_t)) \nabla \log \pi_\theta(a_t|s_t) \right] \]

为什么可以减少方差但是不引入偏差?(这和归一化有点像啊)

https://zhuanlan.zhihu.com/p/98506549

注意到 \(V(s_t)\) 是一个只与 \(s_t\) 相关的一个量,那么引入的损失部分是:

\[\begin{aligned} {\mathbb E}_{\tau} \left[ \sum V(s_t) \nabla \log \pi_\theta \right] &= \sum_{\tau} {\mathbb E}[V(s_t) \nabla \log \pi_\theta] \\ {\mathbb E}_{\tau} [V(s_t) \nabla \log \pi_\theta] &= {\mathbb E}_{s_t} [V(s_t) {\mathbb E}_{a_t} [\nabla \log \pi_\theta(a_t | s_t)] ] \\ &= {\mathbb E}_{s_t}[V(s_t) \cdot 0] \\ &= 0 \end{aligned} \]

其中:

\[\begin{aligned} {\mathbb E}_{a_t} [\nabla \log \pi_\theta(a_t | s_t)] &= \int_a \pi_\theta(a_t|s_t) \frac {\nabla \pi_\theta(a_t | s_t)} {\pi_\theta(a_t|s_t)} {\rm d} a_t \\ &= \int_a \nabla \pi_\theta(a_t | s_t) {\rm d} a_t \\ &= \nabla \int_a \pi_\theta(a_t | s_t) {\rm d} a_t \\ &= \nabla 1 \\ &= 0 \end{aligned} \]

如果说 \(\pi_\theta\) 关于 \(\theta\),对只有可数个 \(a\) 不可微,且 \(\nabla \pi_\theta\) 关于 \(\theta\) 有界,那么就可以交换 \(\nabla\) 和 \(\int\)。哦,我逝去的淑芬 QwQ

posted @ 2026-09-26 20:53  jeefy  阅读(3)  评论(0)    收藏  举报