TD3+BC

Deep_Reinforcement_Learning/Deep_Reinforcement_Learning/Offline_RL/TD3_BC.md

在之前探索 离线强化学习 时,我们学过 CQL。CQL 就像一位极其严谨、悲观的数学家,它通过在 Q 网络的损失函数里加入复杂的惩罚项,把没见过的动作的分数狠狠压低。

但就在 CQL 统治学术界一年后(2021年),TD3 算法的亲生父亲 Scott Fujimoto 大神看不下去了。他带着 TD3+BC 杀回了战场,并极其嚣张地对整个学术界说:"你们把离线 RL 搞得太复杂了!只要加一行代码,我最原始的 TD3 就能把你们按在地上摩擦!"


一、 痛点回顾:CQL 虽好,但实在太重了

在 Offline RL 中,最大的死敌是外推误差(Extrapolation Error):如果 Actor(策略网络)选了一个历史数据里根本没出现过的动作,Critic(Q网络)就会产生严重的幻觉,给这个烂动作打出 10000 的超高分。

CQL 的解法是去改造 Critic:让 Critic 变成一个悲观主义者。 但改造 Critic 的数学推导极度复杂,代码写起来很容易出错,而且训练速度很慢。

Fujimoto 大神反向思考:既然是 Actor 瞎选动作导致 Critic 产生幻觉,那我们为什么要去折磨 Critic?我们直接把 Actor 的手脚捆住不就行了吗!


二、 TD3+BC 的核心哲学:戴着镣铐跳舞

TD3+BC 的名字已经剧透了它的全部秘密:TD3 算法 + 行为克隆(Behavior Cloning, BC)

在普通的 TD3(或 DDPG)里,Actor 网络的唯一目标是:"让 Q 网络打出的分数越高越好。" LossActor=Q(s,π(s))Loss_{Actor} = - Q(s, \pi(s))

而在 TD3+BC 中,Actor 网络的损失函数被硬生生地加上了一个"紧箍咒(BC 惩罚项)",最终的 Loss 形式为: Loss=α1NQiQ(s,π(s))+(π(s)adata)2Loss = - \frac{\alpha}{\frac{1}{N}\sum |Q_i|} \cdot Q(s, \pi(s)) + (\pi(s) - a_{data})^2

公式极其直白:

  1. 第一项 αQQ(s,π(s))-\frac{\alpha}{\overline{|Q|}} \cdot Q(s, \pi(s)):依然是想追求高分(强化学习的灵魂),但被一个自适应系数缩放过。
  2. 第二项 (π(s)adata)2(\pi(s) - a_{data})^2:这就是行为克隆(BC)的均方误差。它要求 Actor 输出的动作 π(s)\pi(s),必须和历史数据集里老司机真实做过的动作 adataa_{data} 长得一模一样
  3. 系数 α\alpha:通常设为 2.52.5,控制了"贪婪"与"怂"的平衡。

物理意义: Actor,你可以去追求高分,但你必须在"老司机真实动作"的方圆一两米之内去寻找高分! 只要你不乱跑(不产生分布外 OOD 动作),Critic 就绝对不会产生幻觉。

TD3_BC_Normalization_Sign:为什么是除以 1NQi\frac{1}{N}\sum |Q_i|,不应该是乘才能变成一个数量级吗?


三、 魔鬼在细节:极其关键的"数值平衡"

听起来简直简单得像个笑话,对吧?其实很多人以前也试过"RL + BC",但都失败了。为什么到了 Fujimoto 手里就封神了呢?

因为这里有一个极其致命的数值量级问题

  • 均方误差 (π(s)adata)2(\pi(s) - a_{data})^2 的值通常很小,在 0011 之间。
  • 但 Q 值 Q(s,π(s))Q(s, \pi(s)) 的量级是跟着游戏环境走的!在有些游戏里,Q 值可能高达 10001000,在有些游戏里可能只有 11

如果你用固定的超参数 α\alpha,在 Q 值为 10001000 的游戏里,BC 惩罚项就变成了微不足道的灰尘,Actor 会瞬间挣脱镣铐,导致幻觉爆炸。

TD3+BC 的两个神级工程 Trick:

1. Q 值归一化 (Q-value Normalization)

Fujimoto 把归一化系数动态地乘在 Q 值这一项上。直接用当前一个 Batch 里所有 Q 值的平均绝对值,把 Q 值的量级给除掉了!强行让 QQBCBC 这两股力量在任何游戏里都保持绝对的势均力敌。

2. 状态归一化 (State Normalization)

在离线 RL 里,因为你不能和环境交互,你手里只有那死死的一批数据。TD3+BC 极其暴力地在训练前,把整个数据集里的所有状态特征 ss 都做了一次标准化(减去均值,除以标准差)。 这看似不起眼的一步,直接抹平了不同物理特征(比如速度和坐标)之间的鸿沟,让神经网络学得又快又稳。


四、 为什么 TD3+BC 让工业界狂喜?

  1. 极简的代码:在原版 TD3 的基础上,只需要加 5 行代码! 不需要复杂的保守 Q 函数计算,不需要负样本,不需要对数求导。
  2. 超乎想象的稳定:因为直接捆住了 Actor,它在真实机器人控制、离线数据模拟中表现出了极其变态的稳定性。
  3. 性能登顶:在 D4RL(离线 RL 最权威的测试基准)上,这区区 5 行代码的改动,硬是打平甚至超越了那些推导了几十页公式的复杂算法(如 CQL、BEAR 等)。

它再次证明了我们在 DrQ 那节得出的真理:在深度学习的工程实践中,极简的直觉 + 扎实的归一化技巧,往往能秒杀一切花里胡哨的数学魔法。

子节点

出链

  • [[Offline_RL]]
  • [[CQL]]
  • [[TD3]]
  • [[TD3_BC_Normalization_Sign]]