ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

BCQ算法代码精读:VAE生成模型与扰动Actor如何重塑动作分布

BCQ算法代码精读:VAE生成模型与扰动Actor如何重塑动作分布 BCQ算法代码精读VAE生成模型与扰动Actor如何重塑动作分布【免费下载链接】BCQAuthors PyTorch implementation of BCQ for continuous and discrete actions项目地址: https://gitcode.com/gh_mirrors/bc/BCQBCQ算法Batch-Constrained deep Q-Learning批量约束深度Q学习是离线强化学习领域最具代表性的算法之一由 Scott Fujimoto 等人于 ICML 2019 提出。这个名为bc/BCQ的仓库提供了作者用 PyTorch 编写的完整官方实现同时覆盖连续动作MuJoCo 环境与离散动作Atari 环境两大场景是学习离线强化学习代码的最佳范本。本文将逐模块精读这套BCQ算法源码重点拆解 VAE 生成模型与扰动 Actor 两大核心组件是如何协同工作、共同重塑动作分布的。为什么需要 BCQ离线强化学习的最大难题 传统强化学习需要智能体不断与环境交互试错成本高、风险大。离线强化学习Offline RL则希望只用一份静态数据集就能训练出好策略但直接套用 DQN、DDPG 会遭遇致命问题——分布偏移Distribution Shift数据集里没有见过的新奇动作价值网络 Q 会给出虚高的估值策略被这些幻觉估值带偏越学越差甚至彻底崩溃。BCQ 算法的核心思想只有一个让策略只敢在数据集中出现过的动作附近活动通过约束动作分布来压制分布偏移。这个约束正是靠 VAE 生成模型 扰动 Actor 这对组合实现的。BCQ算法核心思路先约束、再挑选 BCQ 的总体流程可以概括为两步走步骤组件作用第一步生成候选动作VAE 生成模型只采样像数据集里的动作把动作分布限制在数据覆盖范围内第二步微调并挑选扰动 Actor Critic在候选动作上做小幅度扰动再用 Q 值选出最优者也就是说VAE 负责画地为牢扰动 Actor 负责锦上添花Critic 负责最终裁决。连续动作版VAE 生成模型与扰动 Actor 的分工 连续动作的实现集中在 continuous_BCQ/BCQ.py核心类BCQ由四块网络拼装而成1️⃣ VAE 生成模型动作分布的守门员VAE 类是一个标准的变分自编码器输入(状态, 动作)输出重构动作。它学到的不是单个动作而是给定状态下动作的条件概率分布。推理时decode方法VAE 从标准正态分布采样潜变量 z并截断到[-0.5, 0.5]区间再解码成动作。由于训练时只见过数据集里的动作VAE 天然只会生成数据支持范围内的动作——这正是约束动作分布的关键# 推理时从潜空间采样并解码只生成像数据集的动作 z torch.randn((state.shape[0], latent_dim)).to(device).clamp(-0.5, 0.5) return max_action * torch.tanh(self.d3(a))训练时VAE 损失由重构误差MSE与 KL 散度两部分组成前者保证生成的动作贴近数据后者保证潜空间规整可采样。2️⃣ 扰动 Actor在约束内锦上添花光有 VAE 还不够——它生成的动作是平均水平不够精准。于是 Actor 类登场它不直接输出动作而是输出一个扰动增量# 扰动模型在 VAE 生成的动作上施加一个 phi 尺度的偏移 a self.phi * self.max_action * torch.tanh(self.l3(a)) return (a action).clamp(-self.max_action, self.max_action)phi默认 0.05是扰动上限超参数保证 Actor 只能在 VAE 生成动作周围 ±5% 的范围内微调。这就在遵循数据与优化策略之间取得了平衡。3️⃣ 训练流程三分天下train 方法中每个 batch 依次更新三个模型训练 VAE用recon_loss 0.5 * KL_loss让生成分布贴近数据训练 Critic把 next_state 复制 10 份用 VAE 生成候选动作、Actor 扰动后取Soft Clipped Double Qlmbda加权 min/max的最大值作为目标 Q缓解价值高估训练 Actor用确定性策略梯度DPG让扰动后的动作朝着 Q 值更大的方向优化。4️⃣ 决策时刻一次采样 100 个候选动作select_action 方法是精华所在将当前状态复制100 份VAE 先生成 100 个候选动作Actor 逐一扰动Critic 打分后取 Q 值最高的那个。这种多候选择优机制进一步提升了动作质量也让动作分布天然具备随机性避免了确定性策略的脆弱问题。离散动作版阈值掩码的简洁之美 ✨离散场景不需要生成模型思路更直接。在 discrete_BCQ/discrete_BCQ.py 中discrete_BCQ类引入一个BCQ阈值默认 0.3网络额外输出一个行为克隆分支imitation用负对数似然学习数据集的动作分布决策时只保留概率占比超过阈值的动作其余动作用-1e8屏蔽在剩余动作里用 Q 值取 argmax天然避免了分布偏移。# 将不常见的动作直接屏蔽再在合法动作中选最优 imt (imt / imt.max(1, keepdimTrue)[0] self.threshold).float() return int((imt * q (1. - imt) * -1e8).argmax(1))支持 Atari卷积网络Conv_Q与 Box2D 玩具任务全连接FC_Q两种网络结构十分贴心。完整代码结构导航 ️拿到仓库后代码组织非常清晰适合按下面顺序阅读文件内容精读建议continuous_BCQ/BCQ.py连续动作版核心VAE、Actor、Critic⭐ 最重要先读continuous_BCQ/DDPG.py行为策略 DDPG用于生成离线数据理解数据来源continuous_BCQ/utils.pyReplayBuffer离线数据集的读写快速浏览continuous_BCQ/main.py训练入口与超参数复现时看discrete_BCQ/discrete_BCQ.py离散动作版核心阈值掩码⭐ 必读discrete_BCQ/DQN.py行为策略 DQN快速浏览快速复现三步跑通 BCQ算法 以连续动作为例MuJoCo 环境在 continuous_BCQ 目录下依次执行训练行为策略python main.py --train_behavioral --gaussian_std 0.1生成离线数据集python main.py --generate_buffer --max_timesteps 100000离线训练 BCQpython main.py整个过程无需与环境在线交互BCQ 只会读那份固定的离线数据集——这正是离线强化学习的魅力所在。想体验离散版本只需在 discrete_BCQ 目录重复同样的三步即可。核心超参数速查表 超参数默认值作用phi0.05扰动 Actor 的最大偏移幅度lmbda0.75Soft Clipped Double Q 的加权系数BCQ_threshold0.3离散版动作屏蔽阈值tau0.005目标网络软更新速率总结一套思路两种实现 回看整个仓库BCQ算法的高明之处在于用生成模型定义数据支持的分布再用扰动模型在分布内优化最后用多候选 Q 值择优。连续版靠 VAE 扰动 Actor 重塑动作分布离散版靠阈值掩码实现同样的约束——两套实现互相印证是深入理解离线强化学习不可多得的好教材。建议从 continuous_BCQ/BCQ.py 的BCQ主类读起配合本文的拆解很快就能吃透这套经典算法。【免费下载链接】BCQAuthors PyTorch implementation of BCQ for continuous and discrete actions项目地址: https://gitcode.com/gh_mirrors/bc/BCQ创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表