Action-Gap RL:基于动作间隙的强化学习实验代码库运行与原理指南 Action-Gap RL基于动作间隙的强化学习实验代码库运行与原理指南【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research本指南围绕 google-research 仓库中的action_gap_rl子项目展开介绍其在 Pendulum 环境上收集数据 → 训练价值函数 → 评估策略的完整研究实验流程以及指数族策略Exponential Family Policy、L-Norm 策略、Soft-Hot 特征嵌入等核心实现原理。读完本文你将掌握该代码库的环境搭建、数据采集、离线训练与评估的具体操作方法并理解各源码模块之间的调用关系可直接复现作者在连续动作强化学习上的实验管线。项目定位与实验思想action_gap_rlAction-Gap RL是 google-research 仓库中的一个独立研究子项目由danabogoogle.com与schuurmansgoogle.com合作维护核心聚焦于强化学习中动作间隙action gap相关的学习问题。从代码库结构来看它围绕 OpenAI Gym 的Pendulum-v0连续控制摆环境搭建了一条完整的实验链路离线数据收集用均匀随机行为策略uniform behavior policy与环境交互把经验存入 replay buffer 并序列化为 pickle 文件价值回归训练通过 Monte CarloMC回报构造回归目标使用 TensorFlow Keras 模型拟合状态-动作价值函数策略评估加载训练好的 checkpoint在环境中采样 episode记录 return 与 episode length 等指标。该代码库action_gap_rl/以 Python 为主依赖 TensorFlow 2.x 与 Gym运行入口包括命令行脚本与 Jupyter Notebook 两类下文将逐层展开。环境搭建仓库根目录下的 action_gap_rl/README.md 给出了官方的环境安装步骤核心是先创建独立的 Python 虚拟环境再安装依赖。以下命令需在仓库根目录即google-research/执行。1. 创建 Python 虚拟环境sudo apt-get install python3-pip python3 -m pip install --user virtualenv python3 -m virtualenv ~/env source ~/env/bin/activate前三步分别安装 pip、安装virtualenv工具并创建名为env的虚拟环境位于用户主目录下最后一步激活该环境后续所有依赖安装与实验命令都应在激活后的 shell 中执行。提示也可以参考 action_gap_rl/run.sh 中的写法直接在仓库内创建虚拟环境并一键启动演示virtualenv -p python3 . source ./bin/activate pip install -r action_gap_rl/requirements.txt python -m action_gap_rl.demo --logtostderr2. 安装依赖激活虚拟环境后安装项目声明的全部依赖pip3 install -r requirements.txt其中requirements.txt位于仓库根目录而子项目自身的依赖清单为 action_gap_rl/requirements.txt内容如下absl-py0.5.0 numpy1.13.3 tensorflow2.1.0 gym0.12.1 pyyaml3.12.0各依赖在项目中的作用依赖版本约束在项目中的用途absl-py0.5.0提供absl.app/absl.flags/absl.logging所有命令行脚本的参数解析与日志输出均基于它numpy1.13.3经验回放数组的存储与序列化、MC 回报的向量化计算tensorflow2.1.0固定版本构建价值网络Keras Model、checkpoint 保存与恢复、Summary 指标记录gym0.12.1提供Pendulum-v0连续控制环境pyyaml3.12.0评估阶段解析实验目录下的config.yaml配置文件需要特别说明的是项目代码统一使用tensorflow.compat.v2 as tf导入方式见 demo.py、evaluate.py并在入口处调用tf.enable_v2_behavior()因此运行时要求 TensorFlow 2.x 环境requirements.txt将版本锁定为2.1.0如需在其他 TensorFlow 2.x 版本上运行请自行验证兼容性。项目文件结构与运行入口从仓库文件列表可以看到action_gap_rl目录由三部分组成action_gap_rl/ ├── notebooks/ # Colab 式 Notebook数据收集、训练、模式回归演示 │ ├── pendulum_collect_data.ipynb │ ├── pendulum_train.ipynb │ ├── mode_regression.ipynb │ └── mode_regression_nn.ipynb ├── policies/ # 策略价值函数实现 │ ├── exponential_family.py │ ├── l_norm.py │ └── layers_lib.py ├── README.md ├── __init__.py ├── collect_data.py # 命令行随机策略收集数据并保存 pickle ├── demo.py # 命令行随机策略采样一条 episode 并打印 ├── evaluate.py # 命令行加载 checkpoint 评估策略 ├── replay.py # 经验回放缓冲区Memory ├── requirements.txt ├── run.sh # 一键建环境 → 装依赖 → 跑 demo ├── util.py # AttrDict 工具 └── value.py # Monte Carlo 回报计算整体调用关系可以概括为collect_data.py / Notebook 负责产生离线数据集 → replay.py 存储经验 → value.py 将奖励序列折叠为 MC 回报 → policies/中的 Keras 模型拟合回报 → evaluate.py 加载模型权重做在线评估*。快速演示demo.pydemo.py 是理解环境交互流程的最小示例。它创建Pendulum-v0环境用UniformContinuousAgent直接调用action_space.sample()均匀采样动作运行一个最多 1000 步的 episode并将每一步的TimeStep(t, a, s, r)元组记录下来后打印env gym.make(Pendulum-v0) agent UniformContinuousAgent(env.action_space) rollout sample_episode(env, agent, max_episode_length1000)值得注意的细节是sample_episode中对奖励做了裁剪reward max(min(reward, 1), -1)即将单步奖励限制在[-1, 1]区间这有助于稳定后续的价值回归训练。运行方式为python -m action_gap_rl.demo --logtostderr一键脚本run.shaction_gap_rl/run.sh 把建环境、装依赖、跑演示串成一条命令脚本开头已用set -e保证任一步失败即终止virtualenv -p python3 . source ./bin/activate pip install -r action_gap_rl/requirements.txt python -m action_gap_rl.demo --logtostderr离线数据收集collect_data.py 与 replay.py实验的第一阶段是用行为策略采集数据。命令行入口 collect_data.py 的实现非常简洁创建Pendulum-v0环境以均匀随机策略lambda obs: env.action_space.sample()作为行为策略代码中注释掉的null_policy则始终输出零动作可作为一种对比行为策略采集100 个 episode、每个 200 步将经验写入replay.Memory序列化后保存为pendulum.pickle反序列化做一次一致性检查sanity check对比entered_states、exited_states、attempted_actions、observed_rewards四个视图是否一致。运行方式python -m action_gap_rl.collect_data --outdir/tmp/action_gap_rl/datasets/v2其中outdir是唯一的必填 flagflags.DEFINE_string(outdir, None, ...)数据最终写入outdir/pendulum.pickle。底层的经验容器是 replay.py 中的Memory类它按 episode 组织数据log_init(obs)开始记录一个新 episode初始化状态列表、动作列表、奖励列表log_experience(obs, act, reward, next_obs, data)追加一步经验并断言当前 obs 与上一记录的 next_obs 一致assert (self.observations[-1][-1] obs).all()从实现细节上防止数据错位entered_states()/exited_states()分别返回进入/离开的状态后者去掉每段轨迹的最后一个状态attempted_actions()/observed_rewards()展平返回所有动作与奖励serialize()/unserialize()基于pickle.dumps将观测、动作、奖励及扩展数据data一起序列化/反序列化。Memory还支持通过data_keys构造器参数携带额外的扩展数据字段为后续研究如记录行为策略的额外统计量留出了接口。将轨迹折算为回报value.py离线训练需要状态-动作 → 目标价值的监督信号。value.py 中的max_q_iteration(memory, gamma)提供了最朴素的Monte Carlo 回报计算从每个 episode 的倒数第二步开始按q_values[i][j] gamma * q_values[i][j1]从后向前累积折扣奖励最终把所有 episode 的回报拼成一个一维数组返回。这里的gamma即折扣因子在 Notebook 中通常取1.0无折扣。训练与评估Notebook 与 evaluate.py训练notebooks/pendulum_train.ipynb训练流程主要在 notebooks/pendulum_train.ipynb 中演示其关键步骤包括加载DATASET_FILES指定的训练/评估 pickle 数据集如/tmp/action_gap_rl/datasets/v2/pendulum_train.pickle与pendulum_eval.pickle并通过down_sample构造不同时间分辨率1IR、10IR的多个数据集视图以研究信息分辨率对学习的影响用load_datasets(dataset_files, horizon, gamma, irresolution, scale)将原始轨迹切成片段、折算回报并按比例缩放如scale1/16定义 Keras 价值模型如CategoricalPolicy、或复用policies/中的策略类以l2_loss/l1_loss为损失函数用sample_batch随机采样 mini-batch 进行离线回归支持通过device_string表示 CPU、/device:GPU:0表示 GPU、/device:TPU:0表示 TPU切换训练设备并设置BATCH_SIZE 1000、ITERATIONS 200注释中给出过 1000 的设置训练结束后对每个策略切换到对应_eval数据集打印 L1/L2 损失并对预测残差做 sanity check。配套的 notebooks/pendulum_collect_data.ipynb 则完成了与collect_data.py等价的采集工作并将数据导出到/tmp/action_gap_rl/datasets/供训练 Notebook 直接消费。另外两个 Notebookmode_regression.ipynb、mode_regression_nn.ipynb聚焦于模式回归即学习价值函数的 argmax 模式用于验证价值面形状与策略模式的关系。评估evaluate.pyevaluate.py 提供命令行评估入口用法为python -m action_gap_rl.evaluate \ --experiment_path/path/to/experiment \ --num_episodes100它按以下逻辑工作加载配置在experiment_path目录中找到最新的config.yaml通过most_recent_file(..., rconfig.yaml)按修改时间选取用yaml.load读取并用 util.py 中的AttrDict转成属性访问式字典config.env、config.policy等构建策略从全局符号表中按config.policy字符串动态取出策略类如ExponentialFamilyPolicy或LNormPolicy传入config实例化并通过一次policy.argmax(...)前向调用完成变量初始化恢复 checkpoint查找model.ckpt-[0-9]模式的最新 checkpoint用tf.train.Checkpoint(policypolicy)恢复权重assert_consumed()确保权重全部对齐找不到则抛RuntimeError在线采样每个 episode 调用sample_episodepolicy.argmax决策最大 200 步用tf.summary.create_file_writer把每轮的return奖励和与lengthepisode 长度写入 TensorBoard summary。其中sample_episode(env, policy, memory, max_episode_length200)使用策略的argmax输出作为确定性动作与训练阶段的随机/回归行为形成对照。策略价值函数实现两类核心模型训练的本质是让模型输出逼近状态-动作价值或等价的目标policies/目录提供了两种可配置的 Keras 模型它们都实现了统一的接口call(states, actions)输出预测值、loss(states, actions, targets)定义回归损失、argmax(states)返回最优动作模式。指数族策略exponential_family.pyexponential_family.py 的核心思想是用一个神经网络输出分布参数把非归一化 log-pdf作为价值预测器。文件顶部定义了Distribution namedtuple(Distribution, params, log_pdf, mode)并通过全局DISTS字典把分布名字符串映射到具体的 log-pdf 与 mode 函数这样配置文件里只需保存字符串名即可。当前内置的分布是quadratic二次型quadratic: Distribution( params[1, 0, 0], # p0 非负p1、p2 覆盖整个实数域 log_pdflambda a, p0, p1, p2: -a**2*p0 a*p1 p2, # 非归一化 log-pdf modelambda p0, p1, _: p1/p0), # 解析 argmaxp1/p0 )params是一个二进制列表1表示该分布参数必须非负网络输出端套softplus0表示参数可覆盖整个实数域。ExponentialFamilyPolicy的网络结构为[可选 soft_hot 嵌入层] [若干 Dense(relu)] Dense(len(params)) 按 params 做 softplus/恒等 的 Lambda其loss为 L2 损失tf.reduce_mean(tf.square(pred - targets))argmax直接调用分布定义中的mode函数对quadratic而言即解析解p1/p0。文件注释还给出了扩展新分布的模板在DISTS中新增条目、保证参数个数一致即可方便研究者自定义分布族。L-Norm 策略l_norm.pyl_norm.py 提供另一种价值参数化LNormPolicy的网络输出单个标量Dense(1)预测值定义为self._body(states) - actions损失函数为loss tf.reduce_mean(tf.abs(-tf.abs(self(states, actions))**self.p - targets)**self.q)其中p、q均来自配置config.p、config.q用于控制损失的范数形态argmax(states)即网络输出本身self._body(states)。这类策略的价值面以L_p范数刻画动作依赖是研究动作间隙结构的一种直观建模方式。共享特征嵌入layers_lib.py 中的 Soft-Hot 层两个策略类都支持config.embed指定的输入变换层实现位于 layers_lib.pysoft_hot_layer(offsets, scales)为每个标量观测生成一组高斯核soft-hot嵌入输出维度为input_dim * soft_hot_dim。其实现是用tf.exp(-(x - offsets)**2 / scales)构造径向基式特征再用tf.reshape展平obs_embedding_kwargs(...)自动从一批数据batch或手工指定的bounds/variance生成offsets与scales。其中stretch(low, high, fraction)会把特征取值区间向外扩张默认spillover0.05容纳少量越界值offsets由np.linspace在拉伸后的区间内均匀布点生成scales取各特征方差从而控制核宽度。在 Notebook 的训练流程中同样可以见到该嵌入层的应用通过layers_lib构造特征变换它与策略网络共同构成观测嵌入 → 价值回归的前馈通路。复现实验的完整路径综合以上模块在本地复现action_gap_rl实验的推荐路径是环境准备按 README 创建 virtualenv 并安装 action_gap_rl/requirements.txt 中的依赖注意 TensorFlow 锁定 2.1.0数据采集运行python -m action_gap_rl.collect_data --outdir你的目录或在 pendulum_collect_data.ipynb 中采集得到pendulum.pickle训练数据与评估数据离线训练在 pendulum_train.ipynb 中指定DATASET_FILES指向第 2 步产物选择策略ExponentialFamilyPolicy/LNormPolicy与设备训练并保存 checkpoint 到实验目录在线评估在实验目录放置config.yaml包含env、policy、hidden_widths、embed、dist_name或p/q等字段运行python -m action_gap_rl.evaluate --experiment_path实验目录 --num_episodesN用 TensorBoard 查看return与length曲线。需要提醒的是Pendulum-v0是 Gym 早期版本的环境 ID在较新的 Gymnasium 生态中已被Pendulum-v1取代运行前请确认你的 Gym 版本与gym.make(Pendulum-v0)的兼容性collect_data.py、evaluate.py 均硬编码了该环境名。此外requirements.txt锁定的 TensorFlow 版本较早建议在隔离的虚拟环境或容器中运行避免影响其他项目。通过阅读 replay.py、value.py、policies/ 三处核心源码再配合 README 的安装步骤你即可完整掌握该研究代码库从环境交互、离线数据集构造到价值回归与策略评估的全链路并在此基础上扩展自己的动作间隙相关实验。【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考