ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TD3 算法实战:3 个机制压住连续控制里的 Q 值过估计与训练震荡

TD3 算法实战:3 个机制压住连续控制里的 Q 值过估计与训练震荡 TD3 算法实战3 个机制压住连续控制里的 Q 值过估计与训练震荡【免费下载链接】cp-algorithmsAlgorithm and data structure articles for https://cp-algorithms.com (based on http://e-maxx.ru)项目地址: https://gitcode.com/GitHub_Trending/cp/cp-algorithms用 DDPG 做连续控制时你大概率见过这种训练曲线Q 值一路爬升不回头回报曲线锯齿状波动最后策略停在远差于论文报告的数值。这是Q 值过估计和更新节奏失控两个问题叠在一起。TD3Twin Delayed DDPG用双 Critic 取保守值、延迟策略更新、目标动作平滑三个机制把 MuJoCo 上的平均回报拉高 40%~77%。读完你可以逐项在自己的训练里落地并用开关对比法验证每个机制各自压住的是哪一段偏差。Q 值自己往上爬DDPG 的过估计从哪来这一节说清楚你的训练里 Q 曲线为什么自己往上爬以及这个爬升的闭环卡在哪一环。把 DDPG 的目标值拆开看target_q r gamma * max_a critic_target(next_s, a)max本身没错错在网络拟合不完美的现实Critic 对动作的估值带随机误差而 max 永远挑误差偏高的那个动作。于是目标值里天然掺着高估Critic 去拟合这个目标高估又被下一轮 max 放大偏差像滚雪球一样自激上去。这就是 Q 曲线爬升的根源。这个闭环和图里 Floyd 圈套的链路是同一个结构偏差进入目标值 → 目标值训练 Critic → Critic 更新后 max 更偏向高估方向 → 偏差再次进入目标值循环闭合。识别出闭环在哪一环才能决定在哪一环打断它——这正是 TD3 三个机制的共同思路。先看图TD3 比 DDPG 到底好多少这一节只回答一个问题值不值得换 TD3以及它在什么环境下收益最大。核心结论环境越复杂、动作维度越高提升幅度越大Walker2d 这种多关节任务提升接近八成且训练标准差平均降低 35%。环境DDPG 平均回报TD3 平均回报⚡️ 提升幅度HalfCheetah-v24718 ± 3206617 ± 18940.3%Hopper-v22306 ± 1323234 ± 9840.2%Walker2d-v22939 ± 2875212 ± 21577.3%单看均值40% 的提升已经够换框架但标准差缩得更明显才是真正值钱的部分——它意味着 TD3 对超参数的敏感度更低你调参试错的成本会大幅下降。双 Critic 取 min两个裁判只认低分这一节解决为什么取 min 就能压过估计取平均为什么不行。类比先行两个独立裁判给同一动作打分取低分比分更稳。平均分让两个裁判的高估互相中和成温和的偏高取 min 则直接掐掉乐观偏差——因为总有一个裁判估得偏低min 的期望正好落在真值附近。技术细节上两个 Critic 独立初始化、独立训练对同一动作的估值误差是相互独立的随机量min 操作让两个方向的偏差互相抵消。这段代码在做的事两个目标 Critic 分别给下一动作打分取 min 后再套 Bellman 目标。tq1 target_critic1(next_s, next_a) tq2 target_critic2(next_s, next_a) target_q torch.min(tq1, tq2) target_q r (1 - done) * gamma * target_q这段逻辑解决了单一 Critic 的高估偏差被 target 自反馈放大的问题。注意一个容易踩的实现细节min 只加在 target 侧训练 loss 里 Q1、Q2 各自去拟合同一个 target_q。如果你把 loss 也分别 min 一下两个网络会被迫输出同样的保守值等价于又退回单 Critic过估计原样回来。延迟策略更新Actor 慢一步的写法这一节解决Actor 的更新节奏怎么定代码里 delay 具体怎么加。类比先行先让体能教练Critic把数据看够再让战术教练Actor改动作。Critic 每步都更新Actor 每 k 步才更新一次k 默认取 2。原因和上一节的闭环有关Actor 每次更新都会改变 Critic 要拟合的分布如果 Actor 动得太快Critic 还没消化上一批策略变化估值就被新一轮动作分布带偏——更新节奏失衡会直接制造震荡。这段代码在做的事Actor 的梯度每两步才走一次Critic 每步都走。critic_loss F.mse_loss(q1, target_q) F.mse_loss(q2, target_q) critic_loss.backward() critic_optimizer.step() if update_count % 2 0: # policy_delay 2 actor_loss -critic1(s, actor(s)).mean() actor_loss.backward() actor_optimizer.step()这段逻辑解决的是 Actor 在 Critic 还没学好时就按噪声梯度改动作的问题。k 的取值可以调状态维数高、奖励稀疏的环境可试 3~5但延迟过大 Actor 会欠拟合回报上不去。双 Critic 延迟更新这两个保守化组件也是后来 SAC、TD7 等算法沿用的基础件。目标动作平滑给下一动作注入噪声这一节解决目标噪声的标准差和裁剪范围该怎么配。类比先行评估对手下一手时故意在对手的选择上加一点随机扰动防止估值对最坏对手行为过度敏感。这里对手就是目标 Actor 本身——不加噪声时估值只在自反馈轨迹上精确动作空间里微小扰动处的估值全是不可信的外推。这段代码在做的事给目标动作叠加截断高斯噪声再把结果压回动作范围。noise torch.randn_like(next_a) * 0.2 noise noise.clamp(-0.5, 0.5) next_a (next_a noise).clamp(-1.0, 1.0)这段逻辑解决目标动作过于确定导致估值外推不可信的问题。默认noise_std0.2、noise_clip0.5动作维数越高大于 10 维这个机制的收益越明显因为高维动作空间里自反馈轨迹的覆盖密度更低扰动处的估值更需要平滑。TD3 超参数怎么配一张表加三个故障对照这一节解决参数从哪开始调训练出问题时先查什么。核心结论默认值delay2、噪声 0.2/0.5就能跑出论文级结果先跑通再动单个参数。参数建议值作用批量大小256平衡样本多样性和计算开销策略延迟步数 k2控制 Actor-Critic 更新比例目标噪声标准差0.2过大会破坏目标值稳定性目标噪声裁剪0.5限制动作扰动范围学习率Actor/Critic3e-4两个 Critic 与 Actor 可同率起步⚡️ 训练出问题时按这张表对照排查症状先查什么Q 值持续上升无界奖励缩放是否失控先做归一化再看 min 是否加在 target 侧回报震荡、标准差大policy_delay 调大、批量调大、学习率调小策略卡在局部最优提高 noise_std 并延长训练检查动作是否做缩放把这套配置跑在 HalfCheetah 上然后逐个关掉 min、delay、target noise 三个开关对比 Q 曲线斜率和回报标准差——每个开关对应压住哪一段偏差你会比读十篇博客记得牢。【免费下载链接】cp-algorithmsAlgorithm and data structure articles for https://cp-algorithms.com (based on http://e-maxx.ru)项目地址: https://gitcode.com/GitHub_Trending/cp/cp-algorithms创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表