
强化学习这个系列写到第二篇了。上一篇我聊完了MDP建模、贝尔曼方程、动态规划以及Q-learning这类表格型方法不少读者私信说入门以后最困惑的就是表格型算法和如今到处被提及的深度强化学习、离线强化学习、因果强化学习之间到底是怎么接上的。这篇就专门来补这个断层——从策略梯度这个“第一个真正的分水岭”讲起一路聊到DQN工程化、基于模型的样本效率优化、离线强化学习里的IQL以及正在被越来越多人注意到的因果强化学习。内容会偏进阶一些但推导都会落到能直接上手的程度适合已经跑通过基础RL例程、想系统理解现代强化学习算法尤其是准备做机器人路径规划这类任务的读者。1. 从表格型到策略梯度RL算法演进的第一个分水岭1.1 为什么表格型方法撑不住大规模场景表格型方法的思路其实很朴素把每个状态s和动作a组合的Q值存成一张大表训练完直接查表决策。这种方案在状态空间很小的时候非常好用比如经典的Cliff Walking、Frozen Lake几百个状态跑几千轮就能收敛。但它有个死穴状态一旦多了表就存不下了。网格是10x10表只有100个格子没问题。但如果你要做一个仓库里的多AGV路径规划每台车的位置、速度和目标点组合起来状态空间动辄百万级起步你拿什么建表更别提连续控制问题机械臂每个关节的角度本身就是实数你根本没法枚举。这就是为什么现代强化学习必须引入函数近似——用一个神经网络去逼近Q函数而不是把每个state-action对硬记下来。但神经网络逼近Q值这件事早期有个很尴尬的问题用神经网络做Q-learning收敛非常不稳定甚至经常发散。这个问题的根源在于Q-learning本身只更新当前状态-动作对的值却用了一个“max”来引导目标导致值函数被持续高估再加上神经网络参数小幅更新就会改变所有状态的值估计训练波动会被放大。所以在DQN真正成熟之前学界更先走通的是另一条路——直接优化策略也就是策略梯度。1.2 策略梯度的核心推导与REINFORCE落地策略梯度的出发点很简单既然我最终要的是“策略”本身那我干脆把策略参数化直接朝着“最大化累计回报期望”的方向调参。记策略为 π_θ(a|s)目标是 J(θ) E_{τ ~ π_θ} [R(τ)]其中 τ 是一条完整的轨迹 (s_0, a_0, r_0, s_1, a_1, ...)。对参数求梯度经过概率分布的log-derivative技巧可以得到一个非常优雅的结果∇_θ J(θ) E_{τ ~ π_θ} [ Σ_t ∇_θ log π_θ(a_t | s_t) · R(τ) ]这个式子可以直观理解为如果某条轨迹的总回报R(τ)高就把这条轨迹上所有动作的概率调大如果回报低就把这些动作的概率调小。整个推导的关键就是那个log代数变换它把对概率分布的梯度变成了对log概率的梯度乘上一个回报标量从而可以用采样来估计期望因为采样本来就是强化学习最擅长做的事。REINFORCE就是把这个公式直接落地的算法采样完一整条轨迹计算总回报然后沿梯度更新。实现起来代码量极小一个策略网络加一个损失函数就完了。我用PyTorch写过一次核心更新语句就这么几行log_probs policy.log_prob(actions) loss -(log_probs * returns).mean() optimizer.zero_grad() loss.backward() optimizer.step()注意这里的returns是蒙特卡洛回报也就是轨迹上每一步未来奖励的折扣累加。如果你直接拿每一步的即时奖励去乘log_prob训练基本不收敛。算returns的时候还要做标准化减去均值除以标准差相当于给梯度加一个白化操作能让收敛速度明显变快。1.3 降低方差的基线技巧与Actor-Critic雏形REINFORCE理论漂亮但实际用起来方差大得惊人。用生活化类比来说它像蒙着眼睛在山上找路每次只能沿一个方向走一大步走对了就加几级台阶走错了就下几级台阶来回震荡非常剧烈。原因是同一个动作在不同状态下回报差异很大但REINFORCE只用了整条轨迹的总回报这一个标量来指导所有动作没法区分“这个动作本身好不好”和“当前状态本身好不好”。一个经典的改进是引入基线b(s)用回报减去基线之后再乘log_prob公式变成∇_θ J(θ) E[ Σ_t ∇_θ log π_θ(a_t | s_t) · (R(τ) - b(s_t)) ]基线不会改变梯度的期望因为概率分布的归一化条件会让任何只依赖状态的b(s)项在期望中消掉但会显著降低方差。最常用的基线是状态值函数V(s)它表示“从当前状态出发平均能拿到多少回报”。用回报减去V(s)得到的就是“这个动作相对平均水平好多少”这个量叫优势函数A(s,a)。顺着这个思路再往深处走你会发现与其等一条完整轨迹算回报不如用另一个神经网络去实时估计优势函数一边更新策略、一边更新价值网络。这就是Actor-Critic架构Actor负责调策略Critic负责打分。今天几乎所有主流的深度强化学习算法——A2C、PPO、SAC、TD3——都是在这个框架上演进的。所以我说策略梯度是分水岭因为它把强化学习从“查表”切换到了“参数化策略梯度优化”的范式后面所有高维控制任务都建立在这个基座上。2. DQN及其工程化深度学习是如何嵌入强化学习的2.1 DQN的三大关键机制策略梯度虽然解决了连续动作问题但在离散动作场景比如游戏、路径节点选择、电网调度这类任务里基于价值的方法往往更稳定、样本利用率也更高。DQN把深度学习引入Q-learning靠的是三个关键机制缺一个都训练不起来。第一个是经验回放experience replay。在线Q-learning每采一个样本就立刻更新样本之间的相关性极强神经网络用强相关序列更新容易过拟合最近的状态分布表现就是loss震荡、策略忽好忽坏。经验回放的做法是把(s, a, r, s)存进一个环形缓冲训练时随机采样一个小批次打断相关性同时提高了样本利用率。我习惯把buffer大小设在100万条左右采样batch用32或64项目初期切忌buffer设太小否则随机性不够训练非常容易陷入局部震荡。第二个是目标网络target network。Q-learning的更新公式里有一个“未来的Q值”作为目标如果用同一个网络既算当前Q值又算目标Q值每更新一次参数目标也在变网络等于在追逐一个移动的靶子极易发散。DQN的做法是维护一份滞后更新的目标网络Q_target每隔固定步数比如1000步或按软更新系数比如τ0.005同步一次。这样训练网络在追赶一个相对稳定的目标数值上才可控。第三个是奖励裁剪和值函数裁剪这算是工程经验了。早期DQN在Atari上会把即时奖励统一裁剪到[-1,1]防止不同游戏量纲差异过大导致训练不稳定。虽然这会损失一部分信息但对价值网络来说让奖励幅度在同一数量级是收敛稳定的前提尤其在多任务或困难环境的早期探索阶段。2.2 DQN家族的常见改进DQN在2013年首次提出后两年内就涌现出一大批改进各自解决一个具体痛点组合起来效果会非常明显。Double DQN解决的是过估计问题。标准Q-learning用max_{a} Q(s,a)作为目标这个max在函数近似误差下会系统性高估真实值尤其在随机环境里更明显。Double DQN的思路是用训练网络选择动作、目标网络计算这个动作的值两者分工减小选择与评估共用同一份误差带来的正偏差。实验证明这个方法在不少Atari游戏上能把估计误差显著降下来而实现只需要在目标计算时改一行代码。Dueling DQN解决的是“很多状态下动作其实没那么重要”的问题。它把Q网络拆成状态值V(s)和动作优势A(s,a)最后合并成Q(s,a) V(s) A(s,a) - mean_a A(s,a)。实际好处是网络能学到“某个状态普遍比较危险还是安全”的全局信息不需要每个动作都重新评估。对状态重要、动作影响小的环境比如路径规划中遇到死胡同需要掉头这种分解能明显加速收敛。优先经验回放则是针对采样的。普通回放均匀采样但真正能教会智能体的样本往往是那些TD误差大的“困难样本”比如靠近边界或者意外发生碰撞的状态。优先回放按TD误差大小分配采样概率并辅以重要性采样权重修正偏差能让样本效率提升一倍以上。2.3 训练DQN的工程化细节跑DQN踩过的坑比算法本身多得多。我先说学习率如果用Adam经验上3e-4这种量级比较稳千万不要上手就用1e-3很多新手训DQL发散的根源就在这。epsilon-greedy的衰减也是一个关键超参我一般从epsilon1开始在总训练步数的前10%线性衰减到0.1后面保持0.1作为持续探索率。如果任务比较复杂探索率甚至可以降到0.05但不要直接设为0否则智能体稍微碰到一点环境变化就完全不会应变。还有一个经常被忽略的点梯度裁剪。神经网络在RL里很容易因为一条异常轨迹产生巨大梯度导致参数一下子崩掉。我的习惯是给优化器加clip_grad_norm_max_norm设为10或40之间这套操作救了我很多次。训练长度也需要有心理预期。一个小规模的CartPole或简单网格路径几万步就能看到效果但Atari级别或者多AGV这类复杂环境往往需要跑1000万帧以上也就是GPU跑几个小时甚至几天。很多初学者以为算法写对了应该很快收敛结果跑几个小时没有明显提升就怀疑自己改错了其实在复杂任务里前几百万帧都只是探索阶段真正开始提升往往在中后期。判断是否正常的一个简单办法是看平均回报曲线是否在缓步上升而不是看单次回合的波动。3. 基于模型的强化学习用世界模型换样本效率3.1 Model-free与Model-based的本质区别前面聊的DQN、PPO、SAC都属于无模型model-free方法意思是智能体不知道或者根本不去学环境的动力学规律纯粹靠和真实环境交互试错来调整策略。优势是通用性强代码结构简单训练也不依赖额外的环境建模代价是样本效率极低——一个机械臂任务要在真实环境里做几十万次动作才能学会这在物理世界中成本高到不可接受。相反基于模型model-based的强化学习先学一个环境动态模型用这个模型来代替真实环境生成模拟数据再在模拟数据上优化策略。你可以把model-free理解成“直接下水游着学游泳”model-based则是“先在模拟器里把动作要点练熟再下水验证”。后者在数据效率上通常高一个数量级但难点在于模型误差会带来偏差如果学到的环境模型不够准策略在模型中练得再好到真实环境还是会翻车。3.2 常用的实现路线MBPO与Dreamer当前较流行的基于模型方法有两条路可走。一条是MBPOModel-Based Policy Optimization的思路在真实环境里收集一部分真实轨迹训练一个动态模型通常是一个高斯过程的神经网络输入状态和动作预测下一状态和奖励然后从当前策略采样的状态出发用模型做短期推演rollout生成若干假想轨迹参与到策略优化中。MBPO有个关键设计模型只做短horizon推演通常5~10步而不是一推到底因为模型误差会随推演步数指数累积短推演能最大限度把误差控制在可接受范围内同时又能明显提升样本效率。另一条是Dreamer系列思路更激进完全在潜在空间中学习一个世界模型不直接预测像素级的下一帧而是把观测压缩成低维潜变量然后在潜空间做想象轨迹策略在想象的轨迹上学习。DreamerV2在Atari上取得了接近甚至超过model-free方法的分数但样本效率却高得多。相对MBPODreamer实现复杂度高不少如果你刚开始做基于模型的RL我建议先尝试MBPO这种轻量路线网络结构也不复杂能被SAC复用一半代码。3.3 什么场景该用基于模型的RL我的经验是如果环境本身有低成本仿真器那就没必要折腾基于模型直接model-free加仿真并行就完事。真正适合基于模型的是那些真实交互成本极高的场景比如手术机器人、精密装配、电网调度每一次试错都意味着昂贵的设备和安全风险。这种情况下哪怕只是拿模型做一部分预训练、再切到真机精调也能节省大量成本。另外还有一种常见用法是和离线学习结合先用真实历史数据训练一个环境模型然后在这个模型上跑大量仿真缓解离线数据不足的问题。这个方法在工业界被叫做“数据增强式RL”效果相当实用。但要注意别忘掉前面说的模型误差问题模型训练好之后要拿验证集做评估如果预测误差过大就不要把推演步数拉长宁可多采几轮真实数据。4. 离线强化学习与IQL不与环境交互也能学习4.1 离线学习为什么难分布外动作问题离线强化学习offline RL要解决的是一个极度现实的问题在很多真实业务场景里你根本没有条件让算法在线交互。比如医疗治疗策略、自动驾驶决策让智能体乱试探的代价太大了手里只有一堆历史记录状态、动作、奖励要从这些静态数据里学出一个好策略。直觉上这可能不难反正也是监督学习。但实际做起来有一个绕不开的硬骨头分布外动作问题。回忆Q-learning的更新公式它需要一个“后续动作a的最优Q值”。如果数据里根本没有出现某个状态下的某些动作算法就会对这些未见过的动作乱猜而且因为max操作它会大概率高估这些动作的价值。让算法误以为某个危险动作回报极高学习出来的策略在真实环境里一执行就崩。这个问题的本质是策略产生的数据分布和行为策略产生的数据分布不一致而离线数据无法提供任何纠正信号。很多直接把SAC之类在线算法套到离线数据上的论文实验都翻车了问题就出在这里。4.2 IQL的核心机制不问OOD动作要值IQLImplicit Q-Learning是最近两三年非常受关注的离线RL算法它的核心思想相当巧妙既然OOD动作的Q值不可信那我干脆在更新Q函数时绝不问OOD动作要值。回顾标准Q-learning的targetQ(s,a) ≈ r γ max_{a} Q(s,a)这个max必须对s下所有动作取最大值必然涉及数据集中未覆盖的动作。IQL的替代方案是不取max而是用分位数回归expectile regression去拟合一个类似V(s)的东西。expectile回归和均值回归很像但可以偏向高分位数或低分位数。使τ接近1它估计的就是“在数据集覆盖的动作分布里上侧分位数的价值”相当于在数据分布内部逼近最优价值而不是跑到分布外去max。然后把V(s)代入TD targetQ(s,a) ≈ r γ V(s)更新Q的时候只用了数据集里真实出现过的(s,a)对彻底绕开了OOD动作的Q值。策略提取阶段用的是类似AWR的方法用Q值作为权重去最大化数据集中动作的似然只在数据分布支持的区域内提升策略。三管齐下IQL能够在完全不访问OOD动作的情况下学到不错的策略实现上也不需要额外的对抗网络或者流模型工程友好度很高。4.3 离线强化学习的落地建议如果你要把IQL用到自己的数据上我的建议是第一步先检查数据集的质量一个状态至少要有足够多的覆盖动作如果数据本身就太窄任何离线算法都救不回来。数据收集阶段的探索随机性决定学习上限。实现上的关键点在于expectile损失。PyTorch里可以用torch.where配合huber损失实现τ通常取0.7到0.9之间。取太小会让V接近均值退化成类似BCQ的低性能算法取太大会让V对噪声敏感需要配合数据清洗。奖励的归一化也要做离线数据里的奖励分布如果跨度很大建议先做标准化否则expectile回归很容易被极端值带跑。我在实际项目里用IQL处理过一个AGV调度日志数据场景是不允许在线试错只有过去三个月的运行记录。把状态特征位置、队列长度、目标点距离和动作路径选择、等待时间清洗成固定维度向量后IQL训练出来的策略在仿真环境里明显优于直接用行为克隆和随机策略成功率提升了接近30%。这说明离线数据利用得好确实能带来真实业务价值。5. 因果强化学习让智能体从“相关”走向“因果”5.1 为什么RL需要引入因果视角标准强化学习学到的本质上是相关性某个状态下采取某个动作观察到某个回报然后建立状态动作到价值的映射。但相关性并不等于因果性举个简单例子一个机器臂学习抓取时如果传感器数据和执行动作之间存在混杂因素比如震动导致视觉抖动和环境亮度变化同时出现模型可能把亮度和动作成败的错误关联学了进去换一个光照环境就失效。在封闭、固定分布的环境里相关性足够了。但现实中的强化学习系统一旦面对分布偏移、外部干预或环境变化只基于关联的策略往往立刻崩盘。这就是因果强化学习Causal RL的价值所在它把因果推断的工具嵌入强化学习流程让智能体学会区分“真正的因果关系”和“虚假的相关关系”从而在环境发生变化时依然能做出稳定决策。5.2 CRL的核心机制因果推断工具嵌入强化学习流程因果强化学习的核心机制是把因果推断的工具嵌入强化学习流程。最典型的是用结构因果模型SCM刻画环境变量之间的因果图用do算子替代条件概率来计算干预后的分布。普通RL在环境变量变化时只会被动地重新学一个相关性映射而因果RL会在因果图上做干预分析。例如当智能体想知道“如果我强制改变这个状态变量的值后续回报会如何”时它不能直接用观测到的条件概率 P(回报 | 状态)因为这个条件概率里混杂着其他变量的影响。正确的做法是用do-演算计算 P(回报 | do(状态值))也就是把因果图上与状态变量相关的入边切断只保留从干预节点向外的路径。这个区别在文字上很小但数值结果差异巨大在存在混杂因子的场景下因果方法学到的策略泛化性能明显更强。把因果工具嵌入RL流程具体有几种做法一是先做因果发现从历史数据中学出变量之间的因果图二是把SCM嵌入world model让环境模型具备干预反演能力三是在策略评估中引入反事实推理回答“如果当时换一个动作会怎样”这类问题从而更高效地利用历史数据。5.3 关键能力与研究方向CRL中线值得关注的关键能力包括几个方面。第一是因果表征学习在部分可观测环境中从原始观测中提取出因果相关的隐含变量过滤掉虚假特征这直接决定了策略在下游分布变化的鲁棒性。第二是因果策略学习不只是拟合数据分布而是学习数据生成机制的干预响应让策略在环境机制改变时能够推断适应而不是完全重新训练。第三是反事实决策评估通过反事实推断比较不同动作的可能结果对离线数据利用尤其重要。这个领域目前还在快速演化很多方法还停留在论文阶段但从工程视角看即使是简单引入因果图先验做特征筛选就能让现有RL算法碰到分布偏移时更稳。我建议做应用的人不要觉得CRL离自己很远——但凡你的场景存在外部干预、传感器混杂、或者需要迁移到新环境因果视角迟早会成为一种刚需。6. 实操记录仿真环境与多AGV路径规划实战6.1 从GAZEBO到训练环境仿真到实机是强化学习落地最实用的路径GAZEBO是目前机器人领域常用仿真平台之一配合ROS使用非常广泛。做多AGV路径规划这类任务通常不必从零写物理引擎直接在GAZEBO里建地图、配传感器用ROS做通信中间件再封装一个gym风格的强化学习环境更高效。我的经验是环境接口设计要稳。需要把AGV的位姿x,y,yaw、目标点坐标、障碍物距离等信息构成观测向量动作空间按离散或连续分别处理。对路径规划来说离散动作前进、左转、右转、停止已经够用连续动作转向角油门更适合做平滑控制。封装环境时至少提供reset()和step()两个函数每step返回obs, reward, done, info。如果直接用ROS话题做数据收发要加上超时保护防止Gazebo卡死时训练脚本等不到数据而一直挂起。如果不想纠结GAZEBO也可以用Python轻量仿真替代用networkx表示地图拓扑、A*或Dijkstra算最短路径做基准、AGV之间发生冲突时判定碰撞。这种简化仿真跑通算法逻辑后再迁移到GAZEBO做精细验证能省大量调试时间。我自己做项目时就是先写500行Python仿真确认pppo收敛之后才上Gazebo。6.2 Reward设计稀疏奖励怎么解决多AGV任务最典型的坑是稀疏奖励AGV到达目标点给1奖励碰撞给-1其他时刻都是0。奖励太稀疏智能体在早期完全随机探索时几乎没有正反馈很难学到有效策略。解决思路之一是给reward“加密度”每一步给一个小惩罚项比如-0.01提示智能体不要绕远路距离目标点缩短时给一个小的正向增量奖励让智能体感知“接近了”。但这里更要注意别被reward hack坑了——如果你的奖励函数只和距离有关智能体会学会原地不动等待或者故意绕到距离目标点更近但撞墙的位置。一个安全做法是同时叠加多个信号到达目标给大正碰撞给大负每步给微小时间惩罚再用距离减量做中间引导权重需要反复调。我在一个四AGV协同搬运场景里的配置是到达目标10碰撞-5障碍物接近距离小于0.5米-0.2每步-0.01完成任务额外5。实验下来收敛速度比纯稀疏奖励快了三倍。调参的时候借助tensorboard看各项reward分量曲线逐项确认让智能体“明白”每个信号的含义别把所有东西混成一团难解释的总loss。6.3 训练过程中的调参经验算法层面多AGV路径规划用PPO或SAC都可以。PPO训练稳定、超参敏感度低适合离散动作和需要鲁棒性的任务SAC更适合连续控制样本效率略高一点但熵温度系数要调。网络结构不一定要很复杂两层128或256的MLP对大部分AGV环境足够了一上来堆大模型反而容易过拟合训得慢还泛化差。这里要多提一句噪声数据的问题真实场景的状态观测里时不时会有丢包、延迟、传感器噪声在仿真训练时最好主动加入高斯观测噪声让智能体学会对噪声鲁棒否则实机部署时观测稍微抖一下就会崩。给AGV训练时对观测加入均值为0、方差0.01的高斯噪声训练时间不需要变但实机成功率能提升明显。还有几个我重复踩进去的坑一是reward scale不一致有的分量是10有的分量是0.01梯度会过分偏向数值大的项解决办法是初始化时把所有奖励分量做一次归一化或至少保持量纲在同一数量级。二是RNN时序信息的处理如果任务需要记住历史位置可以加上GRU层或者直接把最近N帧观测拼接成上下文窗口单纯加MLP层数是没用的。三是并行环境数量不要迷信开很多并行环境数量过多会让采样分布太广、策略更新不稳定8到16个并行环境通常是性价比最高的区间。7. 常见问题与排查技巧实录7.1 高频问题速查表团队内部带新人时我整理过一张RL训练问题速查表把遇到次数最多的问题、原因和解决方向列在一起分享在这现象常见原因排查方向训练Loss直接发散学习率太大 / 奖励未归一化 / 梯度爆掉降到1e-4到3e-4检查reward量级加梯度裁剪奖励曲线一直不变epsilon衰减太快 / 动作空间离散化不当拉长探索期检查动作粒度是否过于粗糙训练后期策略退步回放buffer过小 / 目标网络更新太快增大buffer到1e6级别目标网络更新频率放慢采样效率极低环境step频率太低 / reward稀疏加快仿真物理步长改造reward中间引导仿真能跑实机就废未加观测噪声 / 仿真-实机gap过大训练时注入噪声在Sim2Real中做域随机化多AGV时互相打架reward没考虑合作惩罚加入冲突惩罚和合作bonus让智能体学避让这张表解决了不少“看起来写得对但就是不出效果”的疑难杂症。排查时有个好习惯每一行曲线总回报、每个reward分量、entropy、Q值都单独画出来不要只盯一个总指标。entropy降得太快说明策略过早固化探索不足Q值和真实回报差太远说明估计值有偏需要检查目标网络或奖励设计。7.2 经典疑难杂症的排查思路拿“Loss发散但reward看着在涨”这个例子来说新手最容易慌。表面看reward在涨好像还不错但loss一上来就崩往往并不是学习出了问题而是Q值被高估了算法在“自我吹嘘”它以为某个状态以后能拿很高的回报但实际根本拿不到。这种自嗨式高估最终会把策略推向危险动作因为Q值对错误动作的泡沫越来越大策略顺着泡沫选动作自然越来越激进。遇到这种情况我通常先检查奖励是否被刻意放大太多同时确认Double DQN或SAC中的目标平滑机制有没有正确生效。另一个高频坑是reward hacking这在带惩罚项的任务里极其常见。我之前调一个AGV任务时为了让智能体少走弯路给每步加了一个距离缩短奖励结果训练出来的AGV学会了在几个关键点之间反复横跳骗奖励平均走了三倍正常路径才到目标。这类问题的本质是智能体发现了你奖励函数里的漏洞而不是真正理解了任务。解决方式切记不要只加惩罚因为惩罚会被“刷奖励策略”绕过去更有效的是对整条轨迹的合理性做约束比如限制任务总时长、加入行为正则项或者用课程学习逐步逼近真实目标。课程学习curriculum learning也是个常常能救命的技巧先让智能体在简单环境中比如单AGV、无障碍物学会基本技能再逐步增加AGV数量和障碍物密度最后过渡到全难度场景。这么做比一上来就丢给复杂任务收敛快得多也更容易定位算法瓶颈到底是环境复杂度还是策略表达能力。7.3 几个独门技巧最后分享几个我在项目里验证有效的独门技巧。第一个是关于探索与利用的平衡如果你发现策略陷入局部最优一个简单但有效的做法是周期性调大epsilon或SAC的熵系数让智能体“重新发现”一些被遗忘的路径。我常用“退火加周期回跳”策略让探索率在训练中期从0.1回调到0.2再逐渐降到0.05几轮之后策略质量往往能上一个台阶。第二个是经验回放时的数据重放策略给最近的高TD误差样本加一个更高采样权重普通优先经验回放可能引入偏差但如果你用的算法本身足够稳权重的负面影响不大收益通常更明显。要注意如果熵项已经比较小、策略趋于确定性时优先采样可能进一步压缩探索空间需要配合探索率使用。第三个是关于模型保存与评估不要只保存最终模型每隔一定步数保存一个checkpoint并按固定间隔跑一次完整评估测试。有的策略在训练曲线上表现好是过拟合了训练时的随机种子checkpoint评估能帮你选出真正有泛化能力的版本。多AGV任务里我一般每1万步存一个checkpoint每次评估跑50条随机初始位置的完整任务统计平均成功率选成功率最高而非训练reward最高的权重做部署这个经验帮我避开了很多次“训练高分、实机翻车”。就我个人经验来说强化学习算法的迭代速度非常快今天写下的这些经验可能明年就有更好的替代方案但底层的思路是稳定的清楚地知道你的环境动态、设计可解释的奖励信号、重视训练过程的曲线观察、时刻警惕相关性不等于因果性。这些沉淀下来的判断能力比多会背几个算法公式有用得多。下一篇如果继续写我大概率会拿完整的IQL和CRL代码来拆解落地细节欢迎持续关注。