Dopamine 中 RainbowNetwork 深度解析:基于卷积网络计算 Agent 回报分布的架构与实现
机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载RainbowNetwork是 Dopamine 项目gh_mirrors/do/dopamine中用于分布强化学习Distributional RL的核心卷积网络其官方 API 文档定义为一句话The convolutional network used to compute agents return distributions.用于计算 Agent 回报分布的卷积网络。它基于 C51Bellemare et al., 2017思想不再让网络输出单个 Q 值标量而是为每个动作输出一整个回报分布。本文将以 RainbowNetwork 官方 API 文档 为骨架结合仓库中 TF 与 JAX 两套实现、C51/Rainbow Agent 及其 Gin 配置、单元测试完整拆解它的网络结构、输出语义、与 Agent 的集成方式及配置参数帮助读者理解并复现这一经典分布强化学习网络。RainbowNetwork 解决的问题从 Q 值到回报分布传统 DQNNature DQN网络只输出每个动作的期望 Q 值q_values。而 RainbowNetwork 输出的是logits形状为[num_actions, num_atoms]的未归一化对数概率probabilities对logits做 softmax 后得到的每个原子的概率q_values用分布支撑support与probabilities加权求和得到的期望值。其中num_atoms表示把回报值域[vmin, vmax]均匀切分成多少个桶原子。这样每个动作的回报不再是单一标量而是一组离散概率质量能够刻画回报的不确定性这也是 C51 系列算法以及 Rainbow、C51 等变体取得显著性能提升的数学基础。在仓库中这一输出签名被固化成一个命名元组。见 dopamine/discrete_domains/atari_lib.pyDQNNetworkType collections.namedtuple(dqn_network, [q_values]) RainbowNetworkType collections.namedtuple( c51_network, [q_values, logits, probabilities] ) ImplicitQuantileNetworkType collections.namedtuple( iqn_network, [quantile_values, quantiles] )RainbowNetworkType内部命名为c51_network可见其与 C51 算法的渊源同时被 dopamine/discrete_domains/legacy_networks.py 复用作为 TF 网络的标准返回类型JAX 版网络也统一返回该类型保证了跨后端接口一致。网络架构Nature 风格卷积骨干 分布输出头TensorFlow 实现tf.keras.Model当前仓库中 TF 版RainbowNetwork类位于 dopamine/discrete_domains/legacy_networks.py继承tf.keras.Model。其构造参数为参数含义num_actions动作空间大小决定输出头第一维num_atoms回报分布原子数桶数support分布的支撑tf.linspace生成长度等于num_atomsname网络参数作用域名称逐层结构如下均在__init__中定义activation_fn tf.keras.activations.reluconv1Conv2D32 个 8×8 卷积核步长 4paddingsameReLUconv2Conv2D64 个 4×4 卷积核步长 2paddingsameReLUconv3Conv2D64 个 3×3 卷积核步长 1paddingsameReLUflatten展平dense1全连接 512 单元ReLUdense2全连接num_actions * num_atoms单元无激活函数作为分布输出头。所有层使用统一的kernel_initializerdef kernel_initializer(): return tf.keras.initializers.VarianceScaling( scale1.0 / np.sqrt(3.0), modefan_in, distributionuniform )即方差缩放初始化scale 1/sqrt(3)、fan_in模式、均匀分布与 Nature DQN 论文的初始化惯例保持一致。call方法的前向计算legacy_networks.pyx tf.cast(state, tf.float32) x x / 255 # 像素归一化到 [0, 1] x self.conv1(x) # 32 x 8x8, stride 4 x self.conv2(x) # 64 x 4x4, stride 2 x self.conv3(x) # 64 x 3x3, stride 1 x self.flatten(x) x self.dense1(x) # 512, ReLU x self.dense2(x) # num_actions * num_atoms logits tf.reshape(x, [-1, self.num_actions, self.num_atoms]) probabilities tf.keras.activations.softmax(logits) q_values tf.reduce_sum(self.support * probabilities, axis2) return RainbowNetworkType(q_values, logits, probabilities)关键点最后一层输出被 reshape 成[batch, num_actions, num_atoms]沿最后一个维度做 softmax对每个动作内部的原子做归一化再与support逐元素相乘、沿原子轴求和得到每个动作的期望 Q 值。JAX 实现Flax LinenJAX 版RainbowNetwork位于 dopamine/jax/networks.py是flax.linen.Module声明为gin.configurable字段为num_actions: intnum_atoms: intinputs_preprocessed: bool False若输入已预处理可跳过归一化其前向函数签名是__call__(self, x, support)——注意support作为运行时参数传入而 TF 版将其保存在构造器中。前向过程与 TF 版一一对应if not self.inputs_preprocessed: x preprocess_atari_inputs(x) # x.astype(jnp.float32) / 255.0 x nn.Conv(features32, kernel_size(8, 8), strides(4, 4), kernel_initinitializer)(x) x nn.relu(x) x nn.Conv(features64, kernel_size(4, 4), strides(2, 2), kernel_initinitializer)(x) x nn.relu(x) x nn.Conv(features64, kernel_size(3, 3), strides(1, 1), kernel_initinitializer)(x) x nn.relu(x) x x.reshape((-1)) # flatten x nn.Dense(features512, kernel_initinitializer)(x) x nn.relu(x) x nn.Dense(featuresself.num_actions * self.num_atoms, kernel_initinitializer)(x) logits x.reshape((self.num_actions, self.num_atoms)) probabilities nn.softmax(logits) q_values jnp.sum(support * probabilities, axis1) return atari_lib.RainbowNetworkType(q_values, logits, probabilities)初始化器同样是variance_scaling(scale1.0/jnp.sqrt(3.0), modefan_in, distributionuniform)与 TF 版完全对齐。其中preprocess_atari_inputs定义在 dopamine/jax/networks.pydef preprocess_atari_inputs(x): Input normalization for Atari 2600 input frames. return x.astype(jnp.float32) / 255.0输入规格Nature DQN 观测无论 TF 还是 JAX 版本网络输入都是 Atari 2600 预处理后的观测帧堆叠。相关常量定义在 dopamine/discrete_domains/atari_lib.pyNATURE_DQN_OBSERVATION_SHAPE (84, 84) # Size of downscaled Atari 2600 frame. NATURE_DQN_STACK_SIZE 4 # Number of frames in the state stack.即输入形状为(84, 84, 4)84×84 灰度帧、4 帧堆叠。这也是JaxRainbowAgent与RainbowAgent的默认observation_shape与stack_size见下文。与 Agent 的集成support 如何构造JAX 版JaxRainbowAgentJaxRainbowAgent位于 dopamine/jax/agents/rainbow/rainbow_agent.py默认参数为networknetworks.RainbowNetwork, num_atoms51, vminNone, vmax10.0,在__init__中它先根据vmin/vmax/num_atoms生成支撑向量再用functools.partial把num_atoms绑定进网络工厂vmax float(vmax) self._num_atoms num_atoms # If vmin is not specified, set it to -vmax similar to C51. vmin vmin if vmin else -vmax self._support jnp.linspace(vmin, vmax, num_atoms) self._replay_scheme replay_scheme ... networkfunctools.partial(network, num_atomsnum_atoms),随后在_build_networks_and_optimizerrainbow_agent.py中把support作为初始化与推理的输入传入self.online_params self.network_def.init( rng, xstate, supportself._support )动作选择select_actionrainbow_agent.py使用network_def.apply(params, state, support).q_values取 argmax即在分布输出之上取期望后做贪心选择。TensorFlow 版RainbowAgentTF 版RainbowAgent位于 dopamine/tf/agents/rainbow/rainbow_agent.py默认networklegacy_networks.RainbowNetwork、num_atoms51、vminNone、vmax10.0即复用上述legacy_networks.RainbowNetwork类。其网络工厂约定为输入(num_actions, num_atoms, support)返回(state, network_type)的生成函数见 legacy_networks.py 中的rainbow_network工厂model RainbowNetwork(num_actions, num_atoms, support) net model(state) return network_type(net.q_values, net.logits, net.probabilities)核心参数与 Gin 配置示例JAX 版 C51/Rainbow 的配置文件位于 dopamine/jax/agents/rainbow/configs 目录。以 rainbow.gin 为例import dopamine.jax.replay_memory.replay_buffer import dopamine.jax.replay_memory.samplers import dopamine.discrete_domains.atari_lib import dopamine.discrete_domains.run_experiment JaxRainbowAgent.num_atoms 51 JaxRainbowAgent.vmax 10. JaxRainbowAgent.gamma 0.99 JaxRainbowAgent.update_horizon 3 JaxRainbowAgent.min_replay_history 20000 # agent steps JaxRainbowAgent.update_period 4 JaxRainbowAgent.target_update_period 8000 # agent stepsC51 变体见 c51.gin与 Rainbow 的主要区别是update_horizon 1不采用 n-step。参数含义汇总参数默认值说明num_atoms51回报分布原子数决定输出头大小num_actions × num_atomsvmax10.0支撑上界support linspace(-vmax, vmax, num_atoms)vminNone支撑下界为 None 时取-vmax与 C51 一致gamma0.99折扣因子update_horizonC51 为 1Rainbow 为 3n 步回报的步数min_replay_history20000开始训练前需要积累的转移样本数update_period4每多少个 agent 步做一次梯度更新target_update_period8000目标网络同步周期实际训练中vmin/vmax的选取需与游戏回报量级匹配在经典控制CartPole、Acrobot、LunarLander、MountainCar的配置中如 c51_cartpole.ginnum_atoms常被调高到 201、vmax到 100并改用networks.ClassicControlRainbowNetwork同为分布输出但用 MLP 骨干并支持min_vals/max_vals归一化见 dopamine/jax/networks.py。训练侧C51 目标分布与分布投影logits/probabilities不仅用于动作选择还直接参与损失计算。在 dopamine/jax/agents/rainbow/rainbow_agent.py 的target_distribution中仓库按 C51 方式构造目标分布目标支撑为rewards gamma_with_terminal * support终止状态将目标支撑置 0用目标网络对下一状态打分取q_values最大的动作对应的probabilities作为下一步分布最后调用project_distribution把目标分布投影回原始支撑。project_distributionrainbow_agent.py在注释中明确标注其实现基于 Bellemare et al. (2017) 论文的公式 (7)先对目标支撑做裁剪clip 到[vmin, vmax]再按三角形核triangular kernel把概率质量分配到相邻两个原子。网络在线分支的logits经 softmax 后与投影目标分布计算交叉熵损失从而端到端学习回报分布。测试验证输出形状与训练路径仓库测试对RainbowNetwork的输出契约有直接验证tests/dopamine/jax/networks_test.py在testOutputShape中把networks.RainbowNetwork以及FullRainbowNetwork、ClassicControlRainbowNetwork、QuantileNetwork纳入参数化测试以num_actions、num_atoms实例化网络并断言输出张量形状符合RainbowNetworkType契约。tests/dopamine/jax/agents/rainbow/rainbow_agent_test.py 与 tests/dopamine/tf/agents/rainbow/rainbow_agent_test.py分别用 Mock 网络复刻logitsreshape → softmax →q_values sum(support * probabilities)的输出逻辑验证 Agent 在给定分布输出下能正确选择使 Q 值最大的动作。这两类测试共同印证了无论后端是 TF 还是 JAXRainbowNetwork的三输出q_values、logits、probabilities契约都是 Agent 训练与决策的稳定接口。与其他 Atari 网络的定位对比在同级 API 文档中Dopamine 还提供了两个姊妹网络三者的差异正体现在输出签名上定义见 atari_lib.py网络输出类型输出内容对应算法NatureDQNNetworkDQNNetworkType仅q_values标量DQNRainbowNetworkRainbowNetworkTypeq_values、logits、probabilitiesC51 / Rainbow 分布强化学习ImplicitQuantileNetworkImplicitQuantileNetworkType分位数取值与分位数位置IQNRainbowNetwork是所有分布值类distributional value-based算法在 Atari 上的默认骨干JaxRainbowAgent、TFRainbowAgent以及FullRainbowNetworkdopamine/jax/networks.py支持开关 distributional 与 noisy nets都直接或间接复用它定义的分布输出范式。MinAtar 环境的MinatarRainbowNetworkdopamine/labs/environments/minatar/minatar_env.py也采用同样的logits→probabilities→q_values三输出结构说明该网络模式在轻量环境上的通用性。小结从 API 文档的一句话定义出发可以完整梳理出RainbowNetwork在 Dopamine 中的全貌一个 Nature 风格的卷积骨干3 层卷积 512 全连接加一个num_actions × num_atoms的分布输出头输入为 84×84×4 的 Atari 帧堆叠输出q_values/logits/probabilities三要素支撑值由num_atoms/vmin/vmax决定TF 与 JAX 两套实现在结构、初始化与归一化策略上完全对齐。它是 C51/Rainbow 系列 Agent 计算回报分布的核心组件也是理解 Dopamine 分布强化学习体系的最佳切入点——掌握它的输入输出契约与配置参数即可在此基础上扩展自定义的分布值网络或新的分布强化学习算法。赞分享机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载相关推荐Wagtail 0.8.5 版本发布解读11 项 Bug 修复及其在当前代码库中的演变Wagtail 0.8.5 版本发布解读11 项 Bug 修复及其在当前代码库中的演变 Wagtail 0.8.5 是 2015 年 2 月 17 日发布的维机器学习深度学习Lotus生成式与判别式模型对比如何选择最适合的方案Lotus生成式与判别式模型对比如何选择最适合的方案 Lotus是一个基于扩散技术的视觉基础模型专注于高质量密集预测任务。本文将深入对比Lotus中的生成式深度卷积神经网络AlexNet解析与实现深度卷积神经网络AlexNet解析与实现 引言 在深度学习发展历程中AlexNet是一个里程碑式的模型。2012年AlexNet在ImageNet图像识别挑人工智能深度学习机器学习教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Ubuntu误删.docx文件恢复实战指南

Ubuntu误删.docx文件恢复实战指南

简介:本资源是一份面向Linux系统运维人员与Ubuntu初学者的实用故障恢复指南,聚焦rm命令误删文件后的紧急抢救方案。文档详细对比分析ext3grep(适配ext3)与extundelete(支持ext4,兼容主流Ubuntu版本&#xf…

2026/9/23 16:06:43 阅读更多 →
Dify应用开发平台部署教程:Docker Compose部署与模型接入避坑指南

Dify应用开发平台部署教程:Docker Compose部署与模型接入避坑指南

简介:这份PDF教程面向希望快速上手开源LLM应用开发平台的开发者与AI应用爱好者,围绕Dify的本地化部署展开,帮助读者在自有环境中搭建一套可演示、可验证的生成式AI解决方案原型,无需依赖复杂云服务。资源包共1个PDF文件&#xff0…

2026/9/23 16:06:43 阅读更多 →
流程挖掘(RPM)厂商对比评测报告:2025-2026中国市场主流玩家深度分析

流程挖掘(RPM)厂商对比评测报告:2025-2026中国市场主流玩家深度分析

评测说明:本文聚焦"流程挖掘(Robotic Process Mining,RPM)“细分赛道,对中国市场具备代表性的6家厂商进行系统性对比评测。评测对象包括艺赛旗iS-RPM、Celonis、UiPath Process Mining、ABBYY Timeline、Signavio…

2026/9/23 16:06:43 阅读更多 →

最新新闻

howdoi 命令行使用指南:参数、环境变量与工作原理全解析

howdoi 命令行使用指南:参数、环境变量与工作原理全解析

开发工具CLI 【免费下载链接】howdoi instant coding answers via the command line 项目地址: https://gitcode.com/gh_mirrors/ho/howdoi 点击查看 免费下载 本篇指南以 howdoi 项目官方使用文档 docs/usage.md 为主体,结合仓库源码与测试用例&#x…

2026/9/23 16:41:37 阅读更多 →
格拉布斯准则详解:异常检测与离群值判定的统计方法

格拉布斯准则详解:异常检测与离群值判定的统计方法

简介:面向数学建模竞赛(美赛)及数据分析场景的异常值检测参考实现,基于格拉布斯准则完成数据预处理,帮助参赛者快速识别样本中的极端值。资源包共3个文件,包含MATLAB源代码、自动保存备份及txt说明文档&…

2026/9/23 16:41:37 阅读更多 →
小白一键重装系入门到精通:搞定报错Stack Trace的面试通关指南

小白一键重装系入门到精通:搞定报错Stack Trace的面试通关指南

小白一键重装系入门到精通:搞定报错Stack Trace的面试通关指南 屏幕一红,满屏英文,你是不是瞬间大脑宕机? 别慌,那是 StackTrace 在跟你打招呼。 很多转行开发的朋友,最怕的就是看报错日志。 尤其是刚接触 Java 或…

2026/9/23 16:41:37 阅读更多 →
AutoClip 的 Whisper 优先字幕生成策略:从平台字幕依赖到本地高质量转录的架构重构

AutoClip 的 Whisper 优先字幕生成策略:从平台字幕依赖到本地高质量转录的架构重构

AutoClip 的 Whisper 优先字幕生成策略:从平台字幕依赖到本地高质量转录的架构重构 【免费下载链接】autoclip AutoClip : AI-powered video clipping and highlight generation 一款智能高光提取与剪辑的二创工具 项目地址: https://gitcode.com/GitHub_Trendin…

2026/9/23 16:41:37 阅读更多 →
Minimal Mistakes 页面创建指南:从 Sample Page 模板到自定义 About 与内容页

Minimal Mistakes 页面创建指南:从 Sample Page 模板到自定义 About 与内容页

Minimal Mistakes 页面创建指南:从 Sample Page 模板到自定义 About 与内容页 【免费下载链接】minimal-mistakes :triangular_ruler: Jekyll theme for building a personal site, blog, project documentation, or portfolio. 项目地址: https://gitcode.com/gh…

2026/9/23 16:41:36 阅读更多 →
使用 kubeadm 快速搭建生产级 Kubernetes 集群:从工具介绍到完整实战

使用 kubeadm 快速搭建生产级 Kubernetes 集群:从工具介绍到完整实战

教程云原生容器编排 【免费下载链接】kubernetes-handbook Kubernetes 架构与生态:从云原生到 AI 原生基础设施的构建指南 项目地址: https://gitcode.com/gh_mirrors/ku/kubernetes-handbook 点击查看 免费下载 Kubernetes 集群的搭建一直是初学者和运…

2026/9/23 16:40:36 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →