这一章可以压成一条主线:
Policy Gradient 告诉我们怎样修改策略,但它需要 qπ;用 TD 在线估计价值便得到 Actor-Critic;减去 baseline 得到 Advantage Actor-Critic;数据来自另一策略时用 importance sampling 校正;若策略直接输出动作,则得到 deterministic actor-critic / DPG。
1. Policy Gradient 缺少什么?
上一章的策略梯度定理给出
∇θJ(θ)=ES∼ηπ,A∼πθ[∇θlogπθ(A∣S)qπ(S,A)].
相应的一次随机更新为
θt+1=θt+αθ∇θlogπθt(at∣st)qπ(st,at).
其中有两个角色:∇θlogπθ(a∣s) 决定如何修改策略,称为 Actor;qπ(s,a) 评价该动作好不好,称为 Critic。因此 Actor-Critic 的本质仍是 Policy Gradient,区别仅在于如何获得未知的 qπ(s,a)。
2. 从 REINFORCE 到 Q Actor-Critic
一种做法是等回合结束,以完整回报
Gt=Rt+1+γRt+2+⋯
估计 qπ(st,at)。这就是 REINFORCE:
θ←θ+αθGt∇θlogπθ(at∣st).
另一种做法是不等回合结束,而是用参数化 action value q^(s,a,w) 逼近 qπ(s,a)。若动作按当前策略采样,可用 Sarsa TD error:
δt=Rt+1+γq^(st+1,at+1,wt)−q^(st,at,wt),
wt+1=wt+αwδt∇wq^(st,at,wt).
Actor 使用 critic 的评价:
θt+1=θt+αθq^(st,at,wt)∇θlogπθt(at∣st).
这就是最直接的 Q Actor-Critic (QAC):
Policy Gradient⟶{MC estimateTD estimate⇒REINFORCE,⇒Actor-Critic.
3. Advantage Function
QAC 直接使用绝对价值 qπ(s,a),方差可能很大。例如 q(s,a1)=101、q(s,a2)=100 时,动作间实际差异很小,但两次更新的权重都很大。我们更关心动作是否优于该状态下的通常表现。
对任意只依赖状态的 baseline b(s),可以把梯度写为
E[∇θlogπθ(A∣S)(qπ(S,A)−b(S))].
它不改变期望梯度,因为固定 s 时
a∑πθ(a∣s)∇θlogπθ(a∣s)b(s)=b(s)a∑∇θπθ(a∣s)=b(s)∇θa∑πθ(a∣s)=b(s)∇θ1=0.
也就是说,baseline 会改变单个样本的随机梯度,却不会改变其期望;合适的 baseline 能显著降低方差。
严格的最优 baseline 还会按 ∥∇θlogπ∥2 加权;推导见下方折叠部分。实践中通常选择更自然、也更易学习的
b(s)=vπ(s)=EA∼π[qπ(s,A)].
于是得到 advantage function:
严格的最优 baseline
固定状态 s,记
g(A)=∇θlogπθ(A∣s).我们限制 baseline 为仅依赖状态的标量 b(s)。由于 baseline 不改变策略梯度的期望,最小化梯度总体方差等价于最小化其二阶矩:
b(s)minEA∼πθ(⋅∣s)[g(A)(qπ(s,A)−b(s))2].也就是
b(s)minEA[∥g(A)∥2(qπ(s,A)−b(s))2].对 b(s) 求导并令其为零:
0=∂b(s)∂EA[∥g(A)∥2(qπ(s,A)−b(s))2]=EA[∂b(s)∂{∥g(A)∥2(qπ(s,A)−b(s))2}]=EA[−2∥g(A)∥2(qπ(s,A)−b(s))]=−2EA[∥g(A)∥2(qπ(s,A)−b(s))].两边同时除以 −2:
EA[∥g(A)∥2(qπ(s,A)−b(s))]=0.将期望中的乘法展开:
EA[∥g(A)∥2qπ(s,A)]−EA[∥g(A)∥2b(s)]=0.b(s) 在这里是固定状态 s 下的常数,不随采样动作 A 改变,因此可移到期望外:
EA[∥g(A)∥2qπ(s,A)]−b(s)EA[∥g(A)∥2]=0.移项并除以 EA[∥g(A)∥2](该量非零时),得到
b∗(s)=EA∼πθ(⋅∣s)[∥∇θlogπθ(A∣s)∥2]EA∼πθ(⋅∣s)[∥∇θlogπθ(A∣s)∥2qπ(s,A)].如果不同动作的 ∥∇θlogπθ(a∣s)∥2 差别不大,该权重近似可以约掉,于是 b∗(s)≈EA[qπ(s,A)]=vπ(s)。
Aπ(s,a)=qπ(s,a)−vπ(s).
Aπ(s,a)>0 表示动作优于当前策略在该状态下的平均选择,应提高其概率;反之则应降低。Actor 更新因此变为
θ←θ+αθAπ(st,at)∇θlogπθ(at∣st).
4. TD error 就是 advantage 的一步样本
若分别学习 q 和 v,可以直接计算 q(s,a)−v(s),但需要两个 critic。利用 Bellman 方程:
qπ(st,at)=E[Rt+1+γvπ(St+1)∣st,at],
可得
Aπ(st,at)=E[Rt+1+γvπ(St+1)−vπ(st)∣st,at].
因此,一步 TD error
δt=Rt+1+γv^(st+1,wt)−v^(st,wt)
是 Aπ(st,at) 的样本估计(当 value critic 准确时无偏)。这只需要一个 state-value critic:
wt+1=wt+αwδt∇wv^(st,wt),
θt+1=θt+αθδt∇θlogπθt(at∣st).
4.1 随机策略(on-policy A2C)的伪代码
这里 actor 是随机策略:每次动作必须由当前 πθ 采样。δt 一方面训练 value critic,另一方面作为这次动作的 advantage 样本更新 actor。
actor = StochasticPolicy()
critic = ValueNetwork()
for _ in range(num_episodes):
state, _ = env.reset()
done = False
while not done:
action = actor.sample(state)
next_state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
value = critic(state)
with torch.no_grad():
next_value = 0.0 if done else critic(next_state)
td_target = reward + gamma * next_value
td_error = td_target - value
critic_optimizer.zero_grad()
(td_error.square()).backward()
critic_optimizer.step()
actor_optimizer.zero_grad()
(-td_error.detach() * actor.log_prob(state, action)).backward()
actor_optimizer.step()
state = next_state
5. Importance Sampling:从 on-policy 到 off-policy
上面的梯度期望要求 A∼πθ(⋅∣S),所以用于生成数据的 behavior policy 与待优化的 target policy 相同:这是 on-policy。
5.1 为什么不只用 on-policy?
当然可以,而且 on-policy 的估计最直接:每轮都用当前策略采样,再用这些新数据更新当前策略。但策略一更新,旧数据对应的是旧策略,严格来说便不能再直接用于新策略的梯度估计;昂贵的环境交互数据常常只用一次就被丢弃。
off-policy 将实际采集数据的 behavior policy β 与待优化的 target policy πθ 分开。它主要带来三项好处:
- 更高的数据效率:旧轨迹可被反复训练,经验回放(replay buffer)因此成为可能;这在环境交互昂贵时很重要。
- 更好的探索:β 可以保留较强随机性或额外探索噪声,而 πθ 可以学习更好的、甚至近乎确定性的决策。
- 利用既有数据:数据可以来自历史策略、其他控制器,甚至离线日志,而不必每次都由当前 target policy 重新采集。
代价是:数据分布不再与目标策略一致,直接使用会产生偏差;importance sampling 就是为处理这个代价而引入的。若数据动作来自另一个行为策略 β,我们仍想优化 target policy πθ,这便是 off-policy 的情形。
5.2 为什么需要 Importance Sampling?
策略梯度需要的是目标策略下的期望,例如
EA∼πθ(⋅∣s)[f(A)].
然而,手上的数据若由行为策略采集,则动作满足 A∼β(⋅∣s)。直接对这些样本求平均,会收敛到
N1i=1∑Nf(Ai)N→∞EA∼β(⋅∣s)[f(A)],
而不是我们需要的 EA∼πθ[f(A)]。
Importance Sampling 的作用就是为每个 behavior 样本乘一个权重,使其加权后的平均效果等同于从目标策略采样。
5.3 Importance Sampling 与 coverage 条件
这一校正要求 coverage 条件:目标策略可能选到的动作,行为策略必须也有机会采到。
πθ(a∣s)>0 ⇒ β(a∣s)>0,
这样 πθ(a∣s)/β(a∣s) 才有定义,且不会遗漏目标策略会选择、却从未出现在数据中的动作。现在可使用 importance sampling:
EA∼πθ[f(A)]=EA∼β[β(A∣S)πθ(A∣S)f(A)].
以离散动作空间为例,固定状态 S=s,左边先按目标策略展开:
EA∼πθ(⋅∣s)[f(A)]=a:πθ(a∣s)>0∑πθ(a∣s)f(a).
由 coverage 条件,和式中的每个动作都有 β(a∣s)>0,因此可以乘除同一个 β(a∣s):
a:πθ(a∣s)>0∑πθ(a∣s)f(a)=a:πθ(a∣s)>0∑β(a∣s)β(a∣s)πθ(a∣s)f(a)=a∑β(a∣s)β(a∣s)πθ(a∣s)f(a)=EA∼β(⋅∣s)[β(A∣s)πθ(A∣s)f(A)].
连续动作时只需将求和 ∑a 换成积分 ∫,结论相同。
其中
ρt=β(at∣st)πθ(at∣st)
称为 importance ratio,它补偿两种策略下的采样频率差异。
5.4 Off-policy Actor-Critic
将 importance ratio 乘到 actor 的样本梯度上,得到常见的一步形式:
θt+1=θt+αθρtδt∇θlogπθt(at∣st).
实际的 off-policy critic 往往还需要专门的稳定化设计;importance ratio 本身也可能造成高方差。
| 步骤 | 不用重要性采样:从当前策略采样 | 使用重要性采样:从旧策略采样 |
|---|
| 优化目标 | Ea∼πθ(⋅∣s)[A^(s,a)] | Ea∼πold(⋅∣s)[πold(a∣s)πθ(a∣s)A^(s,a)] |
| 展开成求和 | a∑πθ(a∣s)A^(s,a) | a∑πold(a∣s)πold(a∣s)πθ(a∣s)A^(s,a) |
| 直接求梯度 | a∑∇θπθ(a∣s)A^(s,a) | a∑πold(a∣s)πold(a∣s)∇θπθ(a∣s)A^(s,a) |
| 把梯度写成 log 形式 | Ea∼πθ(⋅∣s)[∇θlogπθ(a∣s)A^(s,a)] | Ea∼πold(⋅∣s)[πold(a∣s)πθ(a∣s)∇θlogπθ(a∣s)A^(s,a)] |
6. Deterministic Policy Gradient
6.1 同样从 J=vˉ 出发,为什么梯度形式不同?
此前的 stochastic policy 输出动作分布,我们去最大化高回报动作输出的概率 π(a∣s)。确定性策略则直接输出动作:
a=μθ(s).
它没有 logπ(a∣s) 可以求导,但有
vμ(s)=qμ(s,μθ(s)).
它表达的是 θ→a=μθ(s)→Q(s,a):∇aq(s,a) 指出动作朝哪个方向改变会使价值增长最快,∇θμθ(s) 再把这个方向反传回 actor 参数。
对于连续动作 a∈Rd,这种做法不需要枚举动作或对动作概率求和,因此很适合 continuous control。
6.2 Deterministic Actor-Critic 的 TD 学习
行为策略 β 可以执行带噪声的动作来探索,形成 (st,at,Rt+1,st+1);critic 则学习目标策略 μ 的 qμ:
δt=Rt+1+γq^(st+1,μθ(st+1),wt)−q^(st,at,wt),
w←w+αwδt∇wq^(st,at,w),
θ←θ+αθ∇θμθ(st)∇aq^(st,a,w)a=μθ(st).
6.3 确定性策略(DDPG 风格)的伪代码
这里 buffer 保存的是过去真实发生的 transition (s,a,r,s′,d),不保存旧 Q 值。为稳定训练,DDPG 还维护缓慢变化的 target actor μθˉ 与 target critic q^wˉ。
actor = DeterministicActor()
critic = CriticNetwork()
target_actor = copy.deepcopy(actor)
target_critic = copy.deepcopy(critic)
replay_buffer = ReplayBuffer(capacity)
for _ in range(num_episodes):
state, _ = env.reset()
done = False
while not done:
action = actor(state) + exploration_noise()
next_state, reward, terminated, truncated, _ = env.step(action)
done = terminated or truncated
replay_buffer.add(state, action, reward, next_state, done)
batch = replay_buffer.sample(batch_size)
with no_grad():
target = batch.reward + gamma * (1 - batch.done) * target_critic(
batch.next_state, target_actor(batch.next_state)
)
critic_loss = ((critic(batch.state, batch.action) - target) ** 2).mean()
update(critic_optimizer, critic_loss)
actor_loss = -critic(batch.state, actor(batch.state)).mean()
update(actor_optimizer, actor_loss)
soft_update(target_actor, actor, tau)
soft_update(target_critic, critic, tau)
state = next_state
6.4 Deterministic Actor-Critic 是 off-policy
注意 TD target 中的 μθ(st+1) 不是要立即在环境执行的动作;它只是询问 critic:若下一步开始按目标策略行动,价值是多少。
deterministic policy gradient 是:
∇θJ=ES∼ρ[∇θμθ(S)∇aQμ(S,a)a=μθ(S)]
注意这里没有:
A∼μ.
只有:
S∼ρ.
也就是说,actor 更新时只需要一个状态 s。这个状态 s 当初是谁采出来的,不重要。它完全可以来自另一个 behavior policy
由于 actor 更新只需要历史状态,再由当前 actor 计算 μθ(s),deterministic actor-critic 天然可以复用其他行为策略收集的状态。这正是 DDPG 能使用 replay buffer 的理论基础;DDPG 和 TD3 则是它的深度学习稳定化实现与改进。
7. 总结
整章的决策树如下:
Policy Gradient E[∇logπqπ]MC estimateREINFORCETD estimateQ Actor-Critic−vπ(s)Advantage Actor-CriticAπ≈δA2Cimportance samplingoff-policy ACa=μθ(s)DPG / DDPG.
最值得保留的直觉始终不变:Actor 决定怎么做,Critic 评价这个选择有多好,Actor 根据 Critic 的信号修改策略。