FBRC 离线强化学习实战Fisher 散度 Critic 正则化在 google-research 中的完整实现与训练指南【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-researchFBRCFisher Divergence Critic Regularization是 Ilya Kostrikov、Jonathan Tompson、Rob Fergus 与 Ofir Nachum 于 2021 年提出的离线强化学习算法旨在通过约束 Critic 对策略动作的敏感度来缓解离线数据分布外OOD动作导致的价值过估计问题。本文以 fisher_brc/README.md 为骨架结合仓库内全部源码与运行脚本完整讲解该算法在 google-research 仓库中的依赖安装、命令行训练、全部超参数含义以及 Critic 正则化、行为克隆预训练、SAC 式 Actor 更新的底层实现原理读完即可复现hopper-medium-expert-v0等 D4RL 基准任务的训练与评估。论文与算法背景FBRC 是面向离线强化学习Offline / Batch RL的算法核心论文为Offline Reinforcement Learning with Fisher Divergence Critic Regularization作者Ilya Kostrikov、Jonathan Tompson、Rob Fergus、Ofir Nachum2021。若在研究中使用了本仓库代码README 给出了标准的 BibTeX 引用格式article{kostrikov2021fbrc, title{Offline Reinforcement Learning with Fisher Divergence Critic Regularization}, author{Ilya Kostrikov and Jonathan Tompson and Rob Fergus and Ofir Nachum}, year{2021}, }离线 RL 的关键难点在于训练数据由某个行为策略预先采集训练过程中无法与环境交互而 Q 学习在评估从未见过的state, action对时会产生系统性过估计。FBRC 的思路是在 Critic 的训练目标中显式加入 Fisher 散度正则项惩罚 Q 函数在策略采样动作上的梯度范数从而抑制对分布外动作的乐观估计详见下文核心实现原理一节。仓库结构总览fisher_brc目录是一个轻量、自包含的实现共 9 个文件模块划分清晰文件职责train_eval_offline.py训练与评估入口定义全部命令行参数与主循环fisher_brc.pyFBRC 算法主体Critic 正则化、Actor 与温度更新behavioral_cloning.py行为克隆BC策略的训练用于预训练与 Critic 正则critic.py孪生 Q 网络Twin Critic与软更新实现policies.py对角高斯策略与混合高斯策略TanH squashingd4rl_utils.py加载 D4RL 数据集并构造tf.data流水线evaluation.py策略在线评估平均回报与平均步数requirements.txtPython 依赖清单run.sh一键训练脚本含虚拟环境创建从文件布局可以看出FBRC 的实现建立在 TensorFlow 2、TF-Agents、TensorFlow Probability 与 D4RL 之上训练、策略、评估各自独立成模块便于替换网络结构或评测逻辑。环境安装依赖清单README 给出了安装命令但需注意其中存在一处笔误# README 中的原始命令-m 应为 -r pip install -m requirements.txtpip install -m并非合法用法仓库 run.sh 中实际使用的是pip install -r fisher_brc/requirements.txt依赖内容requirements.txt包括gym0.17.0MuJoCo 环境的 Gym 封装mujoco-py~1.50.1.68旧版 MuJoCo1.50的 Python 绑定numpy~1.19.2数值计算与数据转换tqdm4.36.1训练进度条tensorflow2.4.0主深度学习框架tensorflow-probability0.9.0提供高斯分布、混合分布与 TanH 变换policies.py 中使用tf-agents0.6.0提供 Gym 环境包装gym_wrapper.GymWrapper与 spec 类型d4rl与dm_env均以 git 源码方式安装其中d4rl用于加载离线数据集d4rl_utils.py 通过import d4rl调用d4rl.qlearning_dataset。MuJoCo 与许可证由于 FBRC 实验跑在 D4RL 的 Gym-MuJoCo 任务halfcheetah / hopper / walker2d 系列上README 明确要求你还需要安装 MuJoCo 并使用有效许可证请遵循mujoco-py的安装说明。MuJoCo 1.50 时代需要物理引擎本体与激活密钥license key安装完成后应能通过import mujoco_py自检。该前提同样由 run.sh 隐含依赖——脚本本身不校验 MuJoCo但运行任何 D4RL 任务前环境创建都会失败。一键脚本方式若希望复现仓库作者给出的标准流程可以直接使用 run.sh其内部逻辑为set -e set -x virtualenv -p python3 . source ./bin/activate pip install -r fisher_brc/requirements.txt python -m fisher_brc.train_eval_offline \ --task_name hopper-medium-expert-v0 \ --num_updates 100 \ --bc_pretraining_steps 100 \ --seed 42 \ --alsologtostderr注意脚本把num_updates与bc_pretraining_steps都压到 100 步属于**冒烟测试smoke test**配置用于快速验证整条流水线可运行真实复现论文结果请去掉这两个参数或恢复默认值见下文参数表。运行训练标准训练命令在仓库根目录README 明确说明 From the root google_research directory执行python -m fisher_brc.train_eval_offline \ --task_name hopper-medium-expert-v0 \ --seed 42 \ --alsologtostderrpython -m形式要求从仓库根目录运行使fisher_brc成为可导入的包默认算法即为 FBRCalgo_name默认fbrc该命令等价于论文主实验的标准配置训练默认执行 100 万步num_updates并在前 100 万步bc_pretraining_steps内完成行为克隆预训练随后进入完整 FBRC 更新详见下文主循环解析。主循环解析train_eval_offline.py 的main函数展示了完整流程创建环境与数据集d4rl_utils.create_d4rl_env_and_dataset(task_name, batch_size)返回 Gym 环境与tf.data.Dataset环境包装通过gym_wrapper.GymWrapper与tf_py_environment.TFPyEnvironment转成 TF-Agents 环境随机种子tf.random.set_seed(FLAGS.seed)固定全局随机种子TensorBoard 日志目录在save_dir下分别建立tb/训练指标与results/评估指标子目录目录名格式为{algo}_{task}_seed{seed}模型选择algo_name bc时只训练行为克隆否则构建 FBRC 模型先做bc_pretraining_steps步 BC 预训练每log_interval步记录一次训练标量主训练循环执行num_updates步model.update_step每log_interval步写训练标量每eval_interval步调用evaluation.evaluate做在线评估结果归一化评估回报通过gym_env.get_normalized_score(average_returns) * 100.0转为 D4RL 官方归一化分数。命令行参数详解所有参数都在 train_eval_offline.py 中通过 absl.flags 定义下表为完整清单默认值、类型与说明均取自源码参数类型默认值说明--task_namestringhalfcheetah-expert-v0D4RL 环境名如hopper-medium-expert-v0--seedint42随机种子决定数据打乱与网络初始化--batch_sizeint256每个 mini-batch 的样本数--num_updatesint1000000主训练循环的更新步数--algo_nameenumfbrc可选bc或fbrcbc仅做行为克隆基线--bc_pretraining_stepsint1000000BC 预训练步数仅fbrc生效--num_eval_episodesint10每次评估采样的 episode 数--log_intervalint1000训练标量写 TensorBoard 的间隔--eval_intervalint10000在线评估间隔--save_dirstring/tmp/save/TensorBoard 与结果保存根目录--eagerboolFalse是否以 eager 模式执行调试用--f_regfloat0.1Fisher 正则化权重Critic 梯度惩罚系数--reward_bonusfloat5.0CQL 风格奖励加成加到每个即时奖励上其中--f_reg与--reward_bonus是 FBRC 算法的两个关键旋钮前者控制对分布外动作的惩罚强度后者通过给所有奖励加常数偏置间接提升策略的熵/探索倾向对应 CQL 中保守偏移的思想。注意--f_reg的 CLI 默认值0.1与 fisher_brc.py 中 FBRC 构造函数的默认参数f_reg1.0不同实际生效值以 CLI 传入为准构造时会用命令行值覆盖类默认值。核心实现原理1. Critic 的 Fisher 散度正则化FBRC 与普通 SAC/BRAC 最大的区别在 fisher_brc.py 的fit_critic中。除了标准的双 Q 回归损失mean_squared_error(target_q, q1)与mean_squared_error(target_q, q2)target 取两个目标 Q 的min损失还包含q_reg tf.reduce_mean(q1_grad_norm q2_grad_norm) critic_loss ... self.f_reg * q_reg其中q1_grad_norm/q2_grad_norm是 Critic 对当前 Actor 采样动作policy_actions梯度的平方 L2 范数。其直观含义是Fisher 散度正则直接惩罚 Q 在策略常用动作邻域内的剧烈变化迫使 Critic 对分布外动作输出平滑、保守的值从而遏制离线学习中经典的过估计问题。这一实现对应论文标题中的 Fisher Divergence Critic Regularization。2. 行为克隆的双重作用仓库在 FBRC 中引入了行为克隆策略behavioral_cloning.py它承担两个角色预训练初始化训练主循环开始前先运行bc_pretraining_steps步用数据集中的 (state, action) 对拟合行为策略为后续 RL 更新提供良好的起点Critic 行为正则dist_critic在 Q 值上叠加行为策略的 log 概率q1 log_probs相当于在价值估计中惩罚偏离数据集行为的动作这是 BRAC 风格的行为正则化log_probs self.bc.policy.log_probs(states, actions) return (q1 log_probs, q2 log_probs)BC 策略默认使用MixtureGuassianPolicy混合高斯num_components5behavioral_cloning.py以更精细地刻画真实行为分布。BC 的学习率采用分段常数衰减behavioral_cloning.py080 万步为1e-38090 万步为1e-490 万步之后为1e-5同时用 SAC 式的自动熵温度alpha目标熵为-action_dim平衡拟合与探索。3. SAC 式 Actor 与自适应温度Actor 与熵温度沿用 SAC 的更新方式fisher_brc.pyactor_loss tf.reduce_mean(self.alpha * log_probs - q) alpha_loss tf.reduce_mean(self.alpha * (-log_probs - self.target_entropy))Actor 最大化熵加权 Q在分布内动作上提高回报期望的同时维持熵alpha由可训练变量log_alpha通过tf.exp导出向目标熵自动调整target_entropy -action_dim由入口传入train_eval_offline.py动作由 policies.py 的DiagGuassianPolicy生成对角高斯输出均值与 log 标准差裁剪到[-20, 2]再经Shift → Scale → Tanh双射链压到动作边界内TanH squashing。4. 孪生 Critic 与软更新critic.py 实现双 Q 结构Critic包含两个独立的CriticNet每个网络由三层 ReLU 全连接加单输出线性层构成隐藏层宽度由 FBRC 传入(256, 256, 256)fisher_brc.py。初始化采用正交初始化隐藏层用Orthogonal(sqrt(2))ReLU 增益输出层用Orthogonal(1e-2)近零输出避免初始 Q 值过大。目标网络通过指数软更新同步new_value var * tau target_var * (1 - tau)默认tau0.005fisher_brc.py初始化时用tau1.0将目标网络直接拷贝为在线网络。5. 数据流水线与奖励加成d4rl_utils.py 负责把 D4RL 数据转为训练流水线env gym.make(task_name) dataset d4rl.qlearning_dataset(env)从qlearning_dataset中取出observations / actions / rewards / next_observations并把terminals转为折扣掩码discountslogical_not(terminals)构造tf.data.Dataset后依次经过.cache()、.shuffle(全量, reshuffle_each_iterationTrue)、.repeat()、.batch(batch_size, drop_remainderTrue)与.prefetch(AUTOTUNE)——即每次 epoch 重新打乱、无限循环、固定 batch 的离线训练范式。在update_step中每个样本的奖励都会加上reward_bonus默认 5.0rewards rewards self.reward_bonus这一 CQL 风格的奖励偏移在实现层面直接改变了 Bellman 目标配合 Fisher 正则共同调节策略的保守/激进程度。评估与日志解读评估逻辑位于 evaluation.py默认跑num_eval_episodes10个 episode用policy.act(observation)的确定性动作与环境交互返回平均回报与平均步数。主循环再通过gym_env.get_normalized_score()换算成 D4RL 官方归一化分数0~100 区间因此 TensorBoard 中evaluation/returns可直接与论文表格对照。日志按两种 writer 分开save_dir/tb/{algo}_{task}_seed{seed}记录training/*标量包括actor_loss、alpha、critic_loss、q1、q2、q1_grad、q2_grad以及 BC 预训练阶段的bc_actor_loss、bc_entropy等fisher_brc.py、behavioral_cloning.pysave_dir/results/{algo}_{task}_seed{seed}记录evaluation/returns与evaluation/length。观察q1_grad/q2_grad随训练的变化是判断 Fisher 正则是否生效的直观方式而alpha曲线则反映自动熵调节的动态。若想调试网络结构可加--eager以 eager 模式运行便于断点追踪每一步梯度。快速上手指南安装 MuJoCo 1.50 并配置有效许可证在仓库根目录执行pip install -r fisher_brc/requirements.txt注意 README 中-m为笔误应以 run.sh 的-r为准冒烟测试运行 run.sh 验证整条流水线100 步 BC 100 步 FBRC正式训练python -m fisher_brc.train_eval_offline \ --task_name hopper-medium-expert-v0 \ --seed 42 \ --alsologtostderr查看结果tensorboard --logdir /tmp/save观察训练与评估曲线。更换任务只需修改--task_name为其他 D4RL 名称如halfcheetah-medium-replay-v0、walker2d-medium-expert-v0等若要对比基线将--algo_name设为bc即可得到纯行为克隆结果用于衡量 FBRC 的价值学习增益。【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考