深入理解 Actor-Critic 中 TD Target 的 a' 来源
本文整理自关于强化学习中 TD target 计算方式的系列问答,涵盖:a' 的来源选择、离线 RL 的 OOD 问题、SARSA 与 QAC 的区别、收敛性理论、以及从经典 AC 到深度 RL 的历史演进。
概念澄清:a' 出现在哪类 Critic 中
在深入讨论之前,需要先厘清一个关键概念:a' 只在 Q-critic 中出现,V-critic 的 TD target 里没有 a'。
| Critic 类型 | 输入 | TD Target | a' 是否出现 | 代表算法 |
|---|---|---|---|---|
| V-critic | s | r + γV(s') |
否(期望在 V 内部消掉) | A2C, PPO, 经典 AC |
| Q-critic | (s, a) | r + γQ(s', a') |
是,必须明确 | DDPG, TD3, SAC, 离线 RL |
- V(s') = E_{a'~π}Q(s', a'),期望运算在 critic 网络内部完成,a' 被积分消掉了
- Q(s', a') 需要明确指定 a' 是什么,因此才有"a' 从哪来"的问题
后文讨论的 QAC、离线 RL 均指 Q-critic 架构;A2C 及经典 actor-critic 使用 V-critic,不涉及 a' 选择问题。
问题 1:离线 RL 的 OOD 问题是否是 Critic 取 Actor 的 a' 的原因?
是的,这正是核心原因之一。
离线 RL 的设定
离线 RL 只有固定数据集 D(由某个行为策略 μ 采集),不能与环境交互。Critic 是 Q-critic,TD target:
ini
y = r + γQ(s', a')
这个 a' 必须明确指定。有两种选择。
选择 A:a' = actor(s')
离线 RL(如 BCQ, TD3+BC, CQL)都这么做------critic 用 actor 网络输出 a'。
为什么这会导致 OOD 问题:
actor 网络输出的 a' = actor(s') 是策略想要执行的动作。但这个 (s', a') 对可能在数据集 D 中从未出现过 ------因为数据集是行为策略 μ 采集的,actor 学到的策略 π 和 μ 不同,actor(s') ≠ μ 会选的动作。
于是 critic 要查询 Q(s', actor(s')),但这个 (s', a') 对是 OOD(Out-of-Distribution) 的:critic 从未在训练数据中见过这个组合,其 Q 值估计没有监督信号,可能是任意值(尤其是被高估)。这就是离线 RL 的 OOD 问题的直接来源。
选择 B:为什么不直接取数据集的 a'?
数据集里的 a' 是行为策略 μ 在 s' 处采取的动作。如果取数据集的 a',critic 学到的是:
css
Q^μ(s', a'_dataset) → 评估行为策略 μ 的 Q 值
但离线 RL 的目标是学一个比 μ 更好的策略 π,不是评估 μ。两个根本问题:
-
无法提供改进信息:如果 critic 只评估 μ 的行为,actor 从 critic 得不到任何"如何改进"的信息------它只能看到 μ 做过的事情的好坏,看不到 μ 没做过的动作的可能回报。
-
数据集只记录了一个动作:在状态 s' 下,数据集可能只见过 a₁,但 actor 想知道 a₂ 的 Q 值。数据集的 a' 无法提供这个信息。
为什么一定要与数据集分布匹配
不是"一定要匹配",而是"不匹配会出问题"。OOD 导致的后果链:
css
critic 对 OOD 的 (s', a') 估计 Q 值
→ 无监督信号,可能被高估(神经网络外推时常见)
→ actor 被吸引到虚高 Q 值的 OOD 动作上
→ 策略崩溃
所以离线 RL 的各种方法本质上都在缓解因为取 actor a' 而导致的 OOD 问题:
| 方法 | 缓解 OOD 的策略 |
|---|---|
| BCQ | 限制 actor 输出在数据集分布内 |
| CQL | 惩罚 OOD 的 Q 值(保守估计) |
| TD3+BC | 让 actor 模仿数据集动作(行为克隆约束) |
问题 2:如果 QAC 取数据集的 a' 会怎样?什么时候可以取?
注意:A2C 使用 V-critic,TD target 是
r + γV(s'),没有 a'。这里的讨论针对 QAC(Q-critic 的 Actor-Critic,如 DDPG, TD3, SAC)。
如果 QAC 取数据集的 a' 会怎样
会产生一条偏差传导链:
css
数据集 a' 来自旧策略 μ(经验回放的旧数据)
→ Critic 学到 Q^μ(s', a') 而非 Q^{π_θ}(s', a')
→ 优势/Q 值估计错误
→ Actor 基于错误的 Q 值更新
→ 优化方向错误,策略被旧行为误导
具体后果:如果旧策略 μ 偏好某个动作 a_old,critic 会错误地给这个动作高 Q 值,actor 会被诱导去模仿已经过时的行为,而非探索更好的新策略。
什么时候可以取数据集的 a'
关键条件:数据集的 a' 必须来自当前正在评估的策略。 根据训练范式不同,分为两种情况:
情况一:交替完全收敛(经典策略迭代)------可以取数据集 a'
如果每次更新 Actor 后,暂停训练,让新 Actor 重新与环境交互,采集一批全新数据(包含新 Actor 产生的 a'_new),然后让 Critic 在这个新数据集上收敛到 Q^{π_new},再更新 Actor......
css
1. 固定当前 Actor 策略 π_θ
2. 用 π_θ 收集一批全新数据(a' 全部由当前 π_θ 产生)
3. 取数据集 a' 训练 Critic 到完全收敛 → Q^{π_θ}
4. 用收敛的 Critic 更新 Actor
5. 回到步骤 1,重新采集
这实际上就是经典的策略迭代(Policy Iteration) 。在这种模式下,Critic 更新时使用数据集里的 a' 是完全正确且合法的 ------因为这个数据集就是由当前待评估的策略刚刚产生的,数据集里的 a' 等价于当前策略的输出。
情况二:增量式更新(现代 QAC/A2C)------不能取数据集 a'
既然交替完全收敛数学上是正确的,为什么现代深度 RL 不这样干?
效率太低:每次更新一次 Actor,就要让 Critic 在大量新数据上训练到完全收敛(可能需要成百上千步),然后再去环境里重新采样。这在计算上极其昂贵,在大规模连续控制任务中不可行。
现实做法 :现代 QAC 采用随机近似(Stochastic Approximation) ------每走一步(或每采一个 batch),Critic 更新一点点,Actor 也更新一点点。在这种情况下,Critic 必须紧跟当前 Actor 的步伐。此时如果从数据集(哪怕是很近的历史)取 a',由于 Actor 的参数已经在这一两步之间微妙变化了,这个 a' 代表的依然是"微旧"的策略,引入的误差会累积,导致算法不收敛。
所以在增量式更新中,必须用 a' = actor(s') 重算,而非取数据集的 a'。
对比总结
| 训练范式 | 数据集 a' 代表谁 | 能否取数据集 a' | 代表算法 |
|---|---|---|---|
| 交替完全收敛(策略迭代) | 当前策略 π_θ(刚采集) | ✅ 完全合法 | 经典策略迭代 |
| 增量式更新(现代 QAC) | "微旧"策略 | ❌ 误差累积 | DDPG, TD3, SAC |
| On-policy 批量收集 | 当前策略 π_θ | ✅ 可以 | A2C, PPO |
| 经验回放 | 旧策略 μ ≠ π_θ | ❌ 必须重算 | DDPG, TD3 + replay |
核心区别 :交替完全收敛保证数据绝对新鲜(采集时策略固定),可以取数据集 a';增量式更新中 Actor 每步在变,哪怕"很近的历史"数据中的 a' 也已经过时,必须重算 actor(s')。A2C/PPO 虽然也是增量式,但每批数据用完即扔、不回放,所以数据始终新鲜,取数据集 a' 也没问题。
问题 3:TD 本质取数据集 a',QAC 为什么用 Actor 输出?
纯 TD Learning 的正确性前提
纯 TD learning(如 Q-learning、SARSA 的 TD 部分)取数据集 a' 是正统做法,能从数据中学习出 Q 值。但前提是没有 actor 在同步更新:
css
纯 TD: 数据集固定 → 取 a'_dataset → 学 Q^μ → 完毕
QAC: actor 不断更新 → 数据集 a' 过时 → 取 actor(s') → 学 Q^{π_θ}
关键区别:有没有一个"正在变化的策略"需要评估
纯 TD Learning(无 actor):
- 数据集由某个固定策略 μ 采集
- 数据集 a' 就是 μ 的采样,取数据集 a' 学到 Q^μ,完全正确
- Q^μ 是最终产物,不需要评估任何"当前策略"
QAC(有 actor):
- actor 在不断更新,π_θ 每一步都在变
- critic 不是最终产物,是 actor 的工具------为策略梯度提供 Q 值估计
- 策略梯度要求
Q^{π_θ}(当前策略的 Q 值),不是 Q^μ(旧策略的 Q 值) - 数据集(经验回放)的 a' 来自旧策略,对应 Q^μ,不是 Q^{π_θ}
- 所以必须用
a' = actor(s')重算,保证评估的是当前策略
策略梯度公式清晰地展示了这一要求:
css
∇J(θ) = E_{s~π_θ, a~π_θ}[∇log π_θ(a|s) · Q^{π_θ}(s,a)]
^^^^^^^^
必须是当前策略的 Q 值
用 Actor a' 的三大好处
1. 保证评估当前策略
a' = actor(s') 保证 TD target 对应当前 π_θ 的贝尔曼方程:
css
Q^{π_θ}(s,a) = E[r + γQ^{π_θ}(s', π_θ(s'))]
^^^^^^^^^^^
用 actor 重算,而非旧数据
取数据集 a' 只能得到 Q^μ(旧策略的 Q 值),策略梯度方向错误。
2. 支持 off-policy + 经验回放
这是最关键的好处。QAC 通常用经验回放提高数据效率(如 DDPG, TD3, SAC)。经验回放意味着反复使用旧数据,但策略已变。
a' = actor(s') 实现了一个精妙的分离:
- 状态转移 (s, a, r, s') 是环境物理规律,可重用------无论什么策略,同样的 (s,a) 一定得到同样的 (r, s')
- 下一步动作 a' 是策略决策,不可重用------策略变了,a' 就得重算
这样就能结合经验回放的数据效率 + 评估当前策略的正确性。
3. 评估数据集外的动作
actor(s') 可以输出旧策略从未执行过的动作。取数据集 a' 只能评估历史行为过的动作,而 actor(s') 可以评估当前策略想做的任何事,包括 μ 从未探索的动作。
这对策略改进至关重要------策略梯度需要知道"如果当前策略选 a_new 会怎样",而不是"旧策略选了什么"。
问题 4:Actor 在变,TD Target 在变,为什么能收敛?
核心质疑
这个问题直指要害:actor 在变 → a' = actor(s') 在变 → TD target 在变 → 这确实不符合标准 TD 收敛的条件。
标准 TD 收敛要求一个固定的贝尔曼方程:
css
Q(s,a) = E[r + γQ(s', a')] ← 方程固定,a' 的选择规则不变
Q-learning 里 a' = argmax Q(s',a'),SARSA 里 a' ~ π(·|s'),只要策略固定,贝尔曼算子 T^π 是 γ-压缩映射,迭代必然收敛到唯一不动点 Q^π。
但 actor-critic 中:
less
a' = actor(s') ← actor 每步在更新
TD target = r + γQ(s', actor(s')) ← 每步都在变
actor 更新 → π_θ 变了 → 贝尔曼方程本身变了 → critic 在追一个移动的靶。标准 TD 收敛证明的假设被打破了。
答案:双时间尺度随机逼近
Actor-critic 的收敛不依赖标准 TD 框架,而是依赖一个更一般的理论:双时间尺度随机逼近(Two-Timescale Stochastic Approximation, Borkar 2008)。
核心思想:让 critic 比 actor 快得多。
| 更新频率 | 学习率 | 角色 | |
|---|---|---|---|
| Critic | 快 | α_critic >> α_actor | 在 actor"冻结"时快速收敛到 Q^{π_θ} |
| Actor | 慢 | α_actor << α_critic | 等 critic 收敛后,基于准确 Q 值缓慢改进 |
收敛过程:三阶段交替推进
阶段 1:Critic 追踪
- actor 几乎不变(慢时间尺度),critic 快速更新
- 此时 π_θ 近似固定,贝尔曼方程 T^{π_θ} 近似固定
- T^{π_θ} 是 γ-压缩映射,critic 快速收敛到 Q^{π_θ}
阶段 2:Actor 改进
- critic 已收敛,Q^{π_θ} 准确
- actor 用这个准确 Q 值计算策略梯度,小幅更新 π_θ
- 此时 Q 值可信,梯度方向正确
阶段 3:重新追踪
- actor 更新后 π_θ 变了,critic 的 Q 值又过时了
- 但 actor 只变了一点点,critic 不需要从头收敛,只需小幅修正即可重新追踪
这个过程不断交替,actor 缓慢改进,critic 始终紧追。当 actor 达到局部最优(梯度 ≈ 0)时,π_θ 不再变化,critic 也收敛到准确的 Q^{π*},系统达到均衡。
数学上为什么成立
关键条件:
-
快时间尺度(critic):α_critic → 0 但 α_critic >> α_actor。在 critic 看来,actor 几乎静止,critic 在求解一个近似固定的贝尔曼方程。即使方程在缓慢变化,只要变化足够慢,critic 就能追踪(γ-压缩性保证)。
-
慢时间尺度(actor):α_actor → 0 且远小于 α_critic。在 actor 看来,critic 已经收敛了,每次 actor 更新时拿到的 Q^{π_θ} 是准确的。Actor 的更新方向是正确的策略梯度。
-
联合收敛 :当 actor 的学习率趋于零时,系统收敛到一个不动点:
- Critic 准确:
Q = Q^{π*}(TD 误差 ≈ 0) - Actor 最优:
∇J(θ) ≈ 0(策略梯度 ≈ 0,无法再改进)
- Critic 准确:
标准 TD vs Actor-Critic 的收敛对比
| 标准 TD Learning | Actor-Critic | |
|---|---|---|
| 贝尔曼方程 | 固定不动 | 随 actor 缓慢变化 |
| 收敛对象 | 单一不动点 Q^π | 均衡点 (π*, Q^{π*}) |
| 收敛理论 | 压缩映射不动点定理 | 双时间尺度随机逼近 |
| 关键条件 | 方程固定 | critic 远快于 actor |
| Target | 静止 | 缓慢移动的靶 |
简单说:标准 TD 是"靶不动,枪手瞄准"→压缩映射保证收敛。Actor-critic 是"靶在移动,但靶移动得比枪手慢得多"→枪手总能追上靶。 当靶最终停下(actor 收敛),枪手也收敛到靶的位置(critic 准确评估),系统达到均衡。
Target Network:额外的工程稳定机制
实践上还有一层保护:目标网络(Target Network)。
DDPG/TD3/SAC 计算 TD target 时用的不是当前 actor/critic,而是延迟更新的副本:
scss
a' = actor_target(s') ← 不是 actor(s')
Q_target = r + γ·critic_target(s', a') ← 不是 Q(s', a')
target network 用 τ << 1 的软更新(如 τ=0.005),变化极慢。这让 TD target 在 critic 的一次收敛周期内近似固定,进一步缓解了"移动靶"问题。
| 机制 | 作用 | 效果 |
|---|---|---|
| 双时间尺度 | critic 快、actor 慢 | critic 追得上移动靶 |
| Target network | 延迟副本计算 target | 靶移动得更慢 |
| 延迟更新(TD3) | actor 更新频率 < critic | 进一步拉开两个时间尺度 |
问题 5:DQN 之前的时代,Critic 是否使用 Actor 输出的 a'?
答案:大多数情况下这个问题不存在
DQN 之前,"critic 用不用 actor 输出的 a'"这个问题在大多数情况下根本不存在 ,因为那个时代的经典 actor-critic 绝大多数使用 V-critic。
情况一:V-critic(DQN 之前的主流)------没有 a' 的问题
经典 actor-critic(Sutton 1999, Bhatnagar et al. 2009, Peters & Schaal 2008)绝大多数使用 V-critic:
css
TD target: y = r + γV(s')
优势函数: A(s,a) = r + γV(s') - V(s)
V(s') = E_{a'~π}Q(s', a'),期望在网络内部隐式完成。critic 的输入只有 s,输出 V(s),a' 根本不显式出现,不存在"从 actor 取还是从数据集取"的问题。
情况二:Q-critic(少数)------用了 actor a',但没有"选择"问题
少数 Q-critic 的 actor-critic(如 Heess et al. 2012 等)确实显式涉及 Q(s', a'),需要指定 a'。
但关键在于:那个时代是严格 on-policy 的,没有经验回放。
css
在线交互流程:
1. 当前策略 π_θ 在状态 s 执行动作 a
2. 环境返回 r, s'
3. 当前策略 π_θ 在 s' 执行动作 a' ← 这就是 actor 的输出
4. 用 (s, a, r, s', a') 做 TD 更新
5. 用完即丢,不留存
此时 a' = π_θ(s')------actor 在 s' 处实际采样执行的动作。在 on-policy 下,actor 输出的 a' 和数据中的 a' 是同一个东西,不存在"旧数据集的 a'"这种选项。
"取 actor a' 还是取数据集 a'"的争论何时产生
这个争论只有在经验回放引入后才出现:
| 时代 | 数据来源 | a' 来源 | "取谁"是问题吗 |
|---|---|---|---|
| DQN 之前(V-critic) | on-policy 实时 | 不显式出现 | 不是问题 |
| DQN 之前(Q-critic) | on-policy 实时 | actor 实时采样 | 不是问题(两者相同) |
| DQN 之后(经验回放) | off-policy 旧数据 | actor 旧输出 vs actor 新输出 | 才是问题 |
经验回放引入后,数据集里的 a' 是旧策略采样的,actor 已经更新了,这才产生了"取数据集旧 a' 还是重算 actor(s')"的区分。
历史演进:从经典 AC 到深度 Actor-Critic
技术发展时间线
| 时期 | 里程碑 | Critic 类型 | 收敛靠什么 | 需要 Target Network? |
|---|---|---|---|---|
| ~2000-2013 | 经典 AC(Sutton, Bhatnagar, Peters) | V-critic(主流) | 双时间尺度理论 | 不需要 |
| 2013 | DQN(经验回放,无 target network) | Q-critic | --- | ❌ 训练不稳定 |
| 2015 | DQN + Target Network(Mnih et al.) | Q-critic | 压缩映射 + target | ✅ 稳定 |
| 2016 | DDPG(深度 AC + 经验回放) | Q-critic | 双时间尺度 + target + 回放 | ✅ 稳定 |
| 2018 | TD3 / SAC | Q-critic | 双时间尺度 + target + 双Q + 延迟更新 | ✅ 更稳定 |
关键历史事实
-
经典 AC 不需要 target network:表格法下 TD 是 γ-压缩映射,线性函数逼近下也有收敛保证。双时间尺度理论(Borkar 2008)提供了严格的数学证明。
-
DQN 不是解决 actor-critic 收敛难题的救星:DQN 自身在 2013 年也有严重的不稳定问题------同一个 DNN 同时充当"学生"和"老师",自举导致正反馈振荡。
-
Target network 是 DQN 自己的发明:2015 年 Mnih 等人引入 target network,让 TD target 在一段窗口内固定,深度 Q-learning 才稳定下来。
-
DDPG 是 DQN 工程经验的搬运:DDPG(2016)将 DQN 的经验回放 + target network 搬入 actor-critic 架构,第一次让深度连续控制 actor-critic 稳定训练。
-
TD3/SAC 是进一步加码:在 DDPG 基础上增加延迟 actor 更新、双 Q 网络、熵正则化等,让收敛更稳。
技术演进的因果链
yaml
经典 AC(表格/线性,靠双时间尺度收敛)
↓ 引入深度网络
DQN 2013(深度 Q-learning,但不稳定:自举 + DNN 外推)
↓ 引入 target network
DQN 2015(稳定:target network 固定 TD target)
↓ target network + 经验回放 搬入 AC
DDPG 2016(深度 actor-critic 稳定)
↓ 进一步改进:延迟更新 + 双Q + 平滑
TD3 / SAC 2018(现代标准)
关键区分:经典 actor-critic 靠双时间尺度就能收敛(理论保证)。Target network 解决的是"深度网络 + 自举"这个新引入的不稳定问题,不是 actor-critic 收敛的唯一条件。
总结
核心原则
Critic 为谁服务,a' 就必须来自谁的策略。
| 算法 | Critic 类型 | Critic 服务于 | a' 来源 | 原因 |
|---|---|---|---|---|
| 纯 TD Learning | Q-critic | 固定 Q 值 | 数据集 a' | 学 Q^μ,无策略优化需求 |
| SARSA(在线) | Q-critic | 行为策略 | 实时采样 a' | on-policy,数据新鲜 |
| 经典 AC | V-critic | 当前策略 π_θ | 不显式出现 | V 内部消掉 a' |
| A2C / PPO | V-critic | 当前策略 π_θ | 不显式出现 | V 内部消掉 a' |
| DDPG / TD3 / SAC | Q-critic | 当前策略 π_θ | actor(s') 重算 |
策略已变,旧 a' 过时 |
| 离线 RL | Q-critic | 当前策略 π | actor(s') 重算 |
导致 OOD,需额外约束 |
五个问题的简要回答
-
离线 RL 的 OOD :确实源于 critic 取
actor(s')------actor 输出可能在数据集分布外。不取数据集 a' 是因为那样只能评估行为策略 μ,无法学到更好的策略。 -
QAC 取数据集 a':会评估旧策略导致梯度方向错误。当数据是当前策略刚采集的(on-policy)时可以取数据集 a',因为此时 a' = actor(s')。
-
QAC 用 actor a' :纯 TD 没有 actor,学固定 Q^μ,取数据集 a' 正确。QAC 有不断更新的 actor,必须评估当前 π_θ。用
actor(s')重算的好处是支持经验回放 + 评估数据集外动作。 -
为什么能收敛:不符合标准 TD 框架(方程不固定),但符合双时间尺度随机逼近理论------critic 远快于 actor,critic 在 actor 近似冻结时求解近似固定的贝尔曼方程。Target network 提供额外工程稳定。
-
DQN 之前:大多数经典 AC 用 V-critic,没有 a'。少数 Q-critic 用 actor 采样的 a',但因为没有经验回放(on-policy),actor 输出和数据中的 a' 是同一个东西。"取谁"的争论是经验回放引入后才产生的。