机器学习深度学习【免费下载链接】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),仅供参考