You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RLlib恢复策略输出动作超出动作空间范围问题咨询

问题分析与解决方法

核心原因

RLlib训练时会自动对动作空间做归一化映射——把0-30的连续动作空间缩放到模型输出的-1到1范围,同时在和环境交互时自动反归一化还原动作。但直接用policy.from_checkpoint加载策略后,默认只会返回模型的原始输出(-1到1),不会自动执行反归一化步骤。

手动添加后处理步骤

你可以通过策略的动作空间信息手动还原动作范围,代码示例:

import ray.rllib.algorithms.ppo as ppo

# 加载目标检查点的策略
policy = ppo.PPOTorchPolicy.from_checkpoint("/path/to/your/checkpoint")

# 获取动作空间的上下边界
action_space = policy.action_space
low_bound = action_space.low
high_bound = action_space.high

# 获取模型原始输出(范围-1到1)
raw_output = policy.compute_single_action(your_observation)[0]

# 反归一化到实际动作空间(0-30)
scaled_action = low_bound + (raw_output + 1.0) * 0.5 * (high_bound - low_bound)

查看RLlib的预处理/后处理配置

RLlib的动作处理逻辑由ActionDistribution和空间归一化配置控制,你可以通过以下方式查看:

  • 检查训练时的算法配置,确认动作归一化状态(默认开启):
    from ray.rllib.algorithms.ppo import PPOConfig
    config = PPOConfig()
    print(config.normalize_actions)  # 输出True表示开启动作归一化
    print(config.preprocessor_pref)  # 查看预处理策略偏好
    
  • 查看策略绑定的动作分布类,确认反归一化逻辑:
    print(policy.dist_class)
    # 连续动作空间通常用DiagGaussian或SquashedGaussian,后者会先把输出限制在-1到1,再映射到实际动作空间
    

ONNX导出后的处理

ONNX只保存模型的原始计算图,不会包含RLlib的后处理逻辑,所以导出后输出还是-1到1。你需要在ONNX推理完成后,手动执行上面的反归一化代码,把输出映射到0-30的范围。

内容的提问来源于stack exchange,提问作者eilwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:52:37