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

在Stable Baseline 3中能否为DDPG的高斯噪声引入衰减参数?

在Stable Baselines 3中为DDPG实现噪声衰减

当然可以实现高斯或OU噪声随训练回合衰减的需求。SB3本身没有内置带衰减逻辑的噪声类,但我们可以通过自定义噪声类或手动更新噪声参数的方式,让噪声逐步降低,帮助智能体从探索转向利用,加快策略收敛速度。

一、高斯噪声的衰减实现

方案1:自定义带衰减的高斯噪声类

直接继承SB3的ActionNoise基类,实现带有标准差衰减逻辑的高斯噪声:

import numpy as np
from stable_baselines3.common.noise import ActionNoise

class DecayingNormalActionNoise(ActionNoise):
    def __init__(self, mean: np.ndarray, sigma: np.ndarray, decay_rate: float, min_sigma: float):
        self.mean = mean
        self.sigma = sigma
        self.decay_rate = decay_rate  # 每步/每回合衰减系数
        self.min_sigma = min_sigma    # 噪声标准差的最小值,防止衰减到0

    def __call__(self) -> np.ndarray:
        # 生成高斯噪声
        noise = np.random.normal(self.mean, self.sigma)
        # 衰减标准差,不低于最小值
        self.sigma = max(self.sigma * self.decay_rate, self.min_sigma)
        return noise

初始化DDPG时使用这个自定义噪声:

from stable_baselines3 import DDPG
from stable_baselines3.common.env_util import make_vec_env

# 创建环境
env = make_vec_env("Pendulum-v1", n_envs=1)
# 配置噪声参数
action_dim = env.action_space.shape[0]
mean = np.zeros(action_dim)
initial_sigma = 0.5  # 初始噪声标准差
decay_rate = 0.995   # 每回合衰减5‰
min_sigma = 0.01     # 最小标准差

# 初始化衰减高斯噪声
noise = DecayingNormalActionNoise(mean, initial_sigma, decay_rate, min_sigma)
# 初始化DDPG模型
model = DDPG("MlpPolicy", env, action_noise=noise, verbose=1)
# 开始训练
model.learn(total_timesteps=100000)

方案2:手动在训练循环中更新噪声参数

如果不想自定义类,也可以直接使用SB3原生的NormalActionNoise,在训练循环中手动更新其sigma属性:

from stable_baselines3.common.noise import NormalActionNoise

# 初始化原生高斯噪声
noise = NormalActionNoise(mean=np.zeros(action_dim), sigma=0.5)
model = DDPG("MlpPolicy", env, action_noise=noise, verbose=1)

# 配置衰减参数
total_episodes = 200
decay_rate = 0.99
min_sigma = 0.01

# 分回合训练并衰减噪声
for episode in range(total_episodes):
    # 单回合训练,不重置时间步计数
    model.learn(total_timesteps=env._max_episode_steps, reset_num_timesteps=False)
    # 更新噪声标准差
    model.action_noise.sigma = max(model.action_noise.sigma * decay_rate, min_sigma)

二、OU噪声的衰减实现

OU噪声的衰减逻辑和高斯噪声类似,核心都是逐步降低噪声的标准差。我们可以自定义带衰减的OU噪声类:

import numpy as np
from stable_baselines3.common.noise import OrnsteinUhlenbeckActionNoise
from typing import Optional

class DecayingOUActionNoise(OrnsteinUhlenbeckActionNoise):
    def __init__(self, mean: np.ndarray, sigma: np.ndarray, theta: float = 0.15, dt: float = 1e-2, initial_noise: Optional[np.ndarray] = None, decay_rate: float = 0.995, min_sigma: float = 0.01):
        # 调用父类初始化方法
        super().__init__(mean, sigma, theta, dt, initial_noise)
        self.decay_rate = decay_rate
        self.min_sigma = min_sigma

    def __call__(self) -> np.ndarray:
        # 生成OU噪声
        noise = super().__call__()
        # 衰减标准差
        self.sigma = max(self.sigma * self.decay_rate, self.min_sigma)
        return noise

使用自定义OU噪声初始化DDPG:

noise = DecayingOUActionNoise(
    mean=np.zeros(action_dim),
    sigma=0.5 * np.ones(action_dim),
    decay_rate=0.99,
    min_sigma=0.01
)
model = DDPG("MlpPolicy", env, action_noise=noise, verbose=1)
model.learn(total_timesteps=100000)

关键注意事项

  • 参数调优:decay_rate和min_sigma需要根据任务环境调整。衰减过快可能导致智能体探索不足,无法找到最优策略;衰减过慢则会拖慢收敛速度。
  • 维度匹配:确保噪声的维度和环境的动作空间维度完全一致,避免运行时错误。
  • VecEnv适配:如果使用向量环境,噪声生成逻辑会自动适配多环境场景,无需额外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:43:13