新闻详情

新闻详情

首页 / 资讯中心 / 详情

Dopamine 中的 ImplicitQuantileNetwork:隐式分位数网络架构与 IQN Agent 实现解析

发布时间:2026/11/5 8:28:51来源:尧图网络
Dopamine 中的 ImplicitQuantileNetwork:隐式分位数网络架构与 IQN Agent 实现解析
机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载导读本文以 Dopamine 项目 API 文档中的 ImplicitQuantileNetwork 为核心深入讲解该网络在 Dopamine 中作为隐式分位数IQN智能体核心组件的架构设计与前向计算流程。你将掌握ImplicitQuantileNetwork的构造参数与各网络层配置、基于随机分位数采样的嵌入表示原理对应论文 Dabney et al., 2018 的式 (4)、分位数估值网络的输出约定quantile_values与quantiles以及它如何被 ImplicitQuantileAgent 用于动作选择与损失计算。读完本文你可以直接在 Dopamine 中定位、修改或复用该网络并理解其与 Nature DQN、Rainbow 网络在结构上的区别。ImplicitQuantileNetwork 在 Dopamine 中的定位ImplicitQuantileNetwork是 Dopamine 中 TFTensorFlow实现的分位数回归网络对应论文Implicit Quantile Networks for Distributional RLDabney et al., 2018。与输出标量 Q 值的 NatureDQNNetwork 以及输出离散分布logits、probabilities的 RainbowNetwork 不同它直接对「状态-动作」的分位数函数建模给定一个状态和一组随机采样的分位数 τ网络输出对应各动作的分位数价值。从源码结构看该网络定义于 legacy_networks.py即遗留 TF 网络模块文件头注释为 Legacy (TF) network architectures并以tf.keras.Model形式实现网络输出类型为ImplicitQuantileNetworkType——一个包含quantile_values与quantiles两个字段的 namedtuple定义在 atari_lib.py。ImplicitQuantileNetworkType collections.namedtuple( iqn_network, [quantile_values, quantiles] )该网络的消费方是 TF 版本的 ImplicitQuantileAgent后者是RainbowAgent的扩展注释中明确其follows the description given in Implicit Quantile Networks for Distributional RL (Dabney et. al, 2018)。构造函数与网络层结构ImplicitQuantileNetwork的__init__接收三个参数legacy_networks.py#L233-L292参数类型说明num_actionsint动作空间大小决定输出层的单元数quantile_embedding_dimint分位数输入的嵌入维度论文式 (4) 中的 nnamestr网络变量作用域名称Keras 内部用于变量命名共享的特征提取主干与 Nature DQN / Rainbow 一致网络先对输入帧执行归一化与三层卷积特征提取输入转换为tf.float32后除以 255Atari 帧像素值 [0, 255] 归一化到 [0, 1]conv1Conv2D(32, [8, 8], strides4, paddingsame, relu)conv2Conv2D(64, [4, 4], strides2, paddingsame, relu)conv3Conv2D(64, [3, 3], strides1, paddingsame, relu)flatten展平为状态特征向量dense1Dense(512, relu)作为后续分位数交互的全连接层。所有卷积/全连接层统一使用VarianceScaling(scale1.0/sqrt(3.0), modefan_in, distributionuniform)初始化器这与 RainbowNetwork 的初始化方式一致保证训练初期数值稳定。分位数嵌入层延迟创建的关键设计IQN 最核心的设计在于call(state, num_quantiles)中动态构造的分位数嵌入层dense_quantilelegacy_networks.py#L294-L342。源码注释明确说明其延迟创建原因Create the quantile layer in the first call. This is because number of output units depends on the input shape. Therefore, we can only create the layer during the first forward call, not during.__init__().也就是说dense_quantile的输出维度取决于输入状态经过卷积展平后的特征长度state_vector_length该值在__init__阶段不可知因此通过if not hasattr(self, dense_quantile)在首次前向时惰性实例化if not hasattr(self, dense_quantile): self.dense_quantile tf.keras.layers.Dense( state_vector_length, activationself.activation_fn, kernel_initializerself.kernel_initializer(), ) quantile_net self.dense_quantile(quantile_net)前向计算流程状态特征与分位数嵌入的逐元素融合call(state, num_quantiles)的完整数据流如下对应 legacy_networks.py#L308-L342归一化与特征提取state转 float32、除以 255经三层卷积 flatten 得到状态特征向量x其长度为state_vector_length。状态特征平铺state_net_tiled tf.tile(x, [num_quantiles, 1])将 batch 维复制num_quantiles份形状为(num_quantiles * batch_size, state_vector_length)使得每个状态可以与多个分位数样本配对。随机分位数采样quantiles tf.random.uniform([num_quantiles * batch_size, 1], minval0, maxval1)即对每个 (状态, 分位数样本) 对从 U(0,1) 均匀采样一个 τ。注意这里每个样本的分位数都是独立随机采样的这也是 IQN 被称为隐式的原因——分位数分布不是显式参数化的而是通过对 τ 的连续采样隐式逼近整个分布。分位数特征构造论文式 (4)对每个分位数 τ 构造嵌入向量源码实现为quantile_net tf.tile(quantiles, [1, self.quantile_embedding_dim]) pi tf.constant(math.pi) quantile_net ( tf.cast(tf.range(1, self.quantile_embedding_dim 1, 1), tf.float32) * pi * quantile_net ) quantile_net tf.cos(quantile_net)即φ_i(τ) cos(π · i · τ)其中i 1, ..., quantile_embedding_dim。这是论文中定义的余弦基函数嵌入将一维分位数 τ 映射到高维特征空间。嵌入投影与逐元素相乘quantile_net经dense_quantile输出维度等于state_vector_lengthrelu 激活投影后与平铺的状态特征做逐元素乘法x tf.multiply(state_net_tiled, quantile_net)。这一步是 IQN 的关键分位数信息通过逐元素门控乘法注入状态表示使网络能够输出该状态下指定分位数的价值。输出层融合后的特征经dense1512 单元与dense2num_actions单元后得到形状为(num_quantiles * batch_size, num_actions)的quantile_values并返回ImplicitQuantileNetworkType(quantile_values, quantiles)。一个值得注意的实现细节由于输入输出均基于 Keras 模型call中创建的dense_quantile层变量同样归属于模型因此Online/Target两个网络实例见下文各自拥有独立的分位数嵌入层参数不会共享。输出约定与 Q 值还原网络的返回类型ImplicitQuantileNetworkType包含quantile_values形状(num_quantiles × batch_size, num_actions)即每个 (τ 样本, 状态, 动作) 的分位数价值quantiles形状(num_quantiles × batch_size, 1)即本次前向实际采样到的 τ 值训练损失需要用到它们来构造分位数回归的权重。在 ImplicitQuantileAgent._build_networks 中动作选择所用的 Q 值通过对分位数样本求均值还原# Shape of self._net_outputs.quantile_values: # num_quantile_samples x num_actions. self._q_values tf.reduce_mean(self._net_outputs.quantile_values, axis0) self._q_argmax tf.argmax(self._q_values, axis0)即Q(s, a) ≈ mean_τ Z_τ(s, a)对num_quantile_samples个随机分位数的估值取平均作为动作选择的依据。源码注释还给出了一个直观例子若某动作在分位数 0.2、0.4、0.6 处的估值为 0.1、0.15、0.15则该动作的 Q 值为三者均值。与 ImplicitQuantileAgent 的配合网络如何参与训练ImplicitQuantileAgent将网络实例化为Online与Target两个副本implicit_quantile_agent.py#L120-L121并分别以不同采样数调用调用点使用的网络采样数用途self.state_phOnlinenum_quantile_samples当前状态 Q 值估计与动作选择self._replay.statesOnlinenum_tau_samples训练在线分位数估值self._replay.next_statesTargetnum_tau_prime_samples训练目标分位数估值self._replay.next_statesdouble_dqn 时为 Online取决配置num_quantile_samples计算目标动作 argmaxAgent 默认超参数implicit_quantile_agent.py#L33-L42kappa1.0、num_tau_samples32、num_tau_prime_samples32、num_quantile_samples32、quantile_embedding_dim64注释标明这些取值取自 Dabney et al. (2018)。其中quantile_embedding_dim论文式 (4) 的 n直接决定dense_quantile输入的余弦基函数数量num_tau_samples论文式 (3) 的 N与num_tau_prime_samplesN控制训练时分位数回归的采样规模num_quantile_samples式 (3) 的 k控制 Q 值还原时的采样数。训练时_build_train_opimplicit_quantile_agent.py#L222-L333会构造形状为batch_size × num_tau_prime_samples × num_tau_samples × 1的 Bellman 误差张量并用分位数 Huber 损失kappa截止加权——这与论文第 2.3 节的描述一致。值得说明的是IQN 网络本身只负责前向估值分位数回归损失的具体计算位于 Agent 的损失逻辑中。通过 gin 配置驱动网络运行Dopamine 使用 gin 配置框架驱动实验。TF 版 IQN 的默认配置 implicit_quantile.gin 展示了如何实例化并调优该网络相关的全部超参数ImplicitQuantileAgent.kappa 1.0 ImplicitQuantileAgent.num_tau_samples 64 ImplicitQuantileAgent.num_tau_prime_samples 64 ImplicitQuantileAgent.num_quantile_samples 32 RainbowAgent.gamma 0.99 RainbowAgent.update_horizon 3 RainbowAgent.min_replay_history 20000 # agent steps RainbowAgent.update_period 4 RainbowAgent.target_update_period 8000 # agent steps RainbowAgent.epsilon_train 0.01 RainbowAgent.epsilon_eval 0.001 RainbowAgent.epsilon_decay_period 250000 # agent steps # IQN currently does not support prioritized replay. RainbowAgent.replay_scheme uniform RainbowAgent.tf_device /gpu:0 # /cpu:* use for non-GPU version RainbowAgent.optimizer tf.train.AdamOptimizer() tf.train.AdamOptimizer.learning_rate 0.00005 tf.train.AdamOptimizer.epsilon 0.0003125 atari_lib.create_atari_environment.game_name Pong atari_lib.create_atari_environment.sticky_actions True create_agent.agent_name implicit_quantile配置要点解读与 Rainbow 的超参对齐配置注释说明超参数取自 Dabney et al. (2018)但为了与 RainbowHessel et al., 2018做公平对比进行了必要的修改例如update_horizon3、min_replay_history20000。训练/评估采样数不同gin 中训练用采样数被调整为 64而 Q 值还原仍用 32与 Agent 构造函数默认值均为 32不同——gin 配置会覆盖构造函数默认值这也是阅读代码时需要注意的地方。使用均匀回放replay_scheme uniform注释明确 IQN currently does not support prioritized replay即 IQN 当前版本不支持优先回放这是它与完整 Rainbow 的重要区别之一。环境配置game_name Pong启用粘性动作sticky actions概率 0.25遵循 Machado et al., 2017 的建议。该网络同样被 JAX 分支所对应实现引用见 jax/agents/implicit_quantile 目录但本文聚焦 TF 分支的ImplicitQuantileNetwork。与 NatureDQNNetwork / RainbowNetwork 的对比小结维度NatureDQNNetworkRainbowNetworkImplicitQuantileNetwork输出标量 Q 值q_values分布q_values, logits, probabilities分位数quantile_values, quantiles分位数/原子处理无固定支持集supportnum_atoms桶随机采样 τ 余弦嵌入维度quantile_embedding_dim关键结构差异直接 dense 输出 Qdense 输出num_actions × num_atoms后 softmax状态特征与分位数嵌入逐元素相乘后再输出输出层单元数num_actionsnum_actions × num_atomsnum_actions但按分位数样本平铺三者共享相同的三层卷积主干与 512 单元全连接层区别集中在价值如何参数化Nature DQN 参数化期望值Rainbow 参数化固定支撑上的离散分布而 IQN 参数化一个可由任意 τ 查询的分位数函数。延伸阅读网络输出类型定义atari_lib.py网络实现legacy_networks.py旧式函数式封装implicit_quantile_networklegacy_networks.pyTF Agent 完整训练/损失逻辑implicit_quantile_agent.pygin 配置implicit_quantile.gin同模块其他网络 NatureDQNNetwork、RainbowNetwork赞分享机器学习深度学习【免费下载链接】dopamineDopamine is a research framework for fast prototyping of reinforcement learning algorithms.项目地址https://gitcode.com/gh_mirrors/do/dopamine点击查看免费下载相关推荐Dopamine 中的 IQN 智能体JaxImplicitQuantileAgent 隐式分位数网络实现全解析Dopamine 中的 IQN 智能体JaxImplicitQuantileAgent 隐式分位数网络实现全解析 导读 本文围绕 Dopamine 仓库中的隐强化学习机器学习深度学习Renovate 的 Batect Manager 使用指南自动追踪 Docker 镜像与 Batect Bundle 依赖Renovate 的 Batect Manager 使用指南自动追踪 Docker 镜像与 Batect Bundle 依赖 Renovate 内置的 bat机器学习深度学习Docuseal JavaScript SDK 完整指南基于 Node.js 调用签名 API 管理提交、签署人与模板Docuseal JavaScript SDK 完整指南基于 Node.js 调用签名 API 管理提交、签署人与模板 本篇技术指南围绕 Docuseal 官机器学习深度学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/4 15:56:54

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/4 22:55:41

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/4 17:01:23

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/4 12:33:12

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/5 4:24:57

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/5 4:24:57

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉