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

如何在Stable Baselines3自定义环境中添加奖励到TensorBoard日志

Stable Baselines3 奖励指标TensorBoard记录方法

基础内置奖励记录(无需额外定制代码)

你已经在PPO初始化时正确配置了tensorboard_log参数,仅需要在调用learn()方法时指定tb_log_name参数,Stable Baselines3就会自动记录每个episode的平均奖励、episode长度等核心指标到TensorBoard。
示例代码:

# 训练时添加tb_log_name参数指定实验标识
model.learn(
    total_timesteps=100000, # 按你的训练需求调整总步数
    tb_log_name="ppo_custom_env_exp1" # TensorBoard中显示的实验名称
)

启动TensorBoard查看日志的命令:

tensorboard --logdir ./tensorboard/

运行命令后访问终端输出的本地地址(默认是http://localhost:6006),即可在scalars面板查看内置的奖励曲线,对应指标名为rollout/ep_rew_mean。

自定义奖励分量记录

如果你的总奖励由多个子项组成,需要单独记录各个子项的变化趋势,需要通过自定义回调函数实现:

步骤1:自定义环境返回奖励分量

在你自定义环境的step()方法中,将需要单独记录的奖励分量存入返回的info字典中,示例:

def step(self, action):
    # 你的原有环境逻辑代码
    survival_reward = 0.1
    target_reward = 10 if reach_target else 0
    action_penalty = 0.05 * abs(action)
    total_reward = survival_reward + target_reward - action_penalty

    # 将自定义奖励分量存入info
    info = {
        "survival_reward": survival_reward,
        "target_reward": target_reward,
        "action_penalty": action_penalty
    }
    return obs, total_reward, terminated, truncated, info

步骤2:实现自定义回调类

继承SB3的BaseCallback类,在每步训练时提取info中的奖励分量写入日志:

from stable_baselines3.common.callbacks import BaseCallback

class CustomRewardLogCallback(BaseCallback):
    def __init__(self, verbose=0):
        super().__init__(verbose)
    
    def _on_step(self) -> bool:
        # 兼容单环境/向量化多环境场景
        for info in self.locals["infos"]:
            # 仅在episode结束时记录聚合指标,不需要聚合可去掉该判断
            if "episode" in info:
                # 记录episode总奖励(和内置指标重复,仅作示例)
                self.logger.record("custom/ep_total_reward", info["episode"]["r"])
                # 记录自定义奖励分量
                if "survival_reward" in info:
                    self.logger.record("custom/survival_reward", info["survival_reward"])
                if "target_reward" in info:
                    self.logger.record("custom/target_reward", info["target_reward"])
                if "action_penalty" in info:
                    self.logger.record("custom/action_penalty", info["action_penalty"])
        return True

步骤3:训练时传入回调

在调用learn()方法时传入实例化的回调对象即可:

reward_callback = CustomRewardLogCallback()
model.learn(
    total_timesteps=100000,
    tb_log_name="ppo_custom_env_exp1",
    callback=reward_callback
)

自定义的奖励指标会出现在TensorBoard的custom分类下,可和内置指标同时查看对比。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:45:02