DQN with Noisy Layers (Noisy DQN)¶
论文链接: https://arxiv.org/pdf/1706.01905.
Noisy DQN 是传统深度Q网络(DQN)的一种变体,它在Q网络的权重中引入了噪声,以改善学习过程中的探索能力。 此举旨在解决强化学习中的关键挑战之一:平衡探索(exploration)与利用(exploitation)。
下表列出了 Noisy DQN 算法的一些一般特性:
Noisy DQN 特性 |
值 |
描述 |
|---|---|---|
同轨策略(On-policy) |
❌ |
评估策略与目标策略相同。 |
离轨策略(Off-policy) |
✅ |
评估策略与目标策略不同。 |
无模型(Model-free) |
✅ |
不需要准备环境动态模型。 |
有模型(Model-based) |
❌ |
需要环境模型来训练策略。 |
离散动作(Discrete Action) |
✅ |
处理离散动作空间。 |
连续动作(Continuous Action) |
❌ |
处理连续动作空间。 |
Noisy DQN 的核心理念¶
探索与利用 (Exploration vs. Exploitation): 在标准的 DQN 中,探索通常由 \(\epsilon\)-贪婪策略控制,其中智能体以一定的概率(epsilon)随机选择动作,并在其余时间利用已知最优的动作。 Noisy DQN 试图通过直接将噪声引入网络参数中来解决探索难题,而不是仅仅依赖随机的动作选择。
噪声网络 (Noisy Networks): Noisy DQN 并没有使用固定的 epsilon 进行探索,而是将噪声引入到了Q网络本身的参数中。 这是通过向Q网络的权重添加参数噪声来实现的,这会改变输出的Q值,从而鼓励去探索不同的动作和状态。
噪声线性层 (Noisy Linear Layers): 在 Noisy DQN 架构中,神经网络传统的全连接层被替换为“噪声”层。 这些噪声层在训练期间向层的权重添加噪声,使得智能体的决策过程在本质上更具探索性。
噪声网络公式 (The Noisy Network Formula):对于网络中的每一层,权重被参数化为:
其中:
\(\mu\) 是均值或基础权重;
\(\sigma\) 是控制噪声水平的标准差;
\(\epsilon\) 是从噪声分布(通常为高斯分布)中提取的样本. 噪声 \(\epsilon\) 在每个回合(episode)或每次迭代开始时进行采样,以确保噪声在训练期间是动态的。
Noisy DQN 具有三个主要优点:
改善探索能力: 通过在Q值中引入噪声,智能体被鼓励去探索更广泛的动作,而不是仅仅利用当前已知的最佳动作.
自适应探索: 探索水平可以作为训练的一部分自动调整,从而消除了手动调整探索参数(如 epsilon)的需要.
高效训练: Noisy DQN 可以提高样本效率,因为它利用探索去访问较少遇到的状态,从而有可能在复杂环境中获得更好的性能.
框架¶
Noisy DQN 保留了与 DQN 相同的整体结构(即经验回放、目标网络等),但用Q网络中的噪声层取代了原有的探索机制。
在 XuanCe 中运行 Noisy DQN¶
在 XuanCe 中运行 Noisy DQN 之前,您需要准备一个 conda 环境并按照安装步骤.
运行内置案例¶
完成安装后,您可以打开 Python 控制台并使用以下命令直接运行 Noisy DQN:
import xuance
runner = xuance.get_runner(method='noisydqn',
env='classic_control', # Choices: claasi_control, box2d, atari.
env_id='CartPole-v1', # Choices: CartPole-v1, LunarLander-v2, ALE/Breakout-v5, etc.
is_test=False)
runner.run() # Or runner.benchmark()
使用自定义配置运行¶
如果您想使用不同的配置运行 Noisy DQN,您可以创建一个新的 .yaml 文件,例如 my_config.yaml。
然后,通过以下代码块运行 Noisy DQN:
import xuance as xp
runner = xp.get_runner(method='noisydqn',
env='classic_control', # Choices: claasi_control, box2d, atari.
env_id='CartPole-v1', # Choices: CartPole-v1, LunarLander-v2, ALE/Breakout-v5, etc.
config_path="my_config.yaml", # The path of my_config.yaml file should be correct.
is_test=False)
runner.run() # Or runner.benchmark()
要了解有关配置的更多信息,请访问 配置教程.
使用自定义环境运行¶
如果您想在未包含于 XuanCe 的自有环境中运行 XuanCe 的 Noisy DQN,您需要按照
新环境教程。
然后,准备配置文件
noisydqn_myenv.yaml.
之后,您可以使用以下代码在自己的环境中运行 Noisy DQN:
import argparse
from xuance.common import get_configs
from xuance.environment import REGISTRY_ENV
from xuance.environment import make_envs
from xuance.torch.agents import NoisyDQN_Agent
configs_dict = get_configs(file_dir="noisydqn_myenv.yaml")
configs = argparse.Namespace(**configs_dict)
REGISTRY_ENV[configs.env_name] = MyNewEnv
envs = make_envs(configs) # Make parallel environments.
Agent = NoisyDQN_Agent(config=configs, envs=envs) # Create a DDPG agent from XuanCe.
Agent.train(configs.running_steps // configs.parallels) # Train the model for numerous steps.
Agent.save_model("final_train_model.pth") # Save the model to model_dir.
Agent.finish() # Finish the training.
引用¶
@inproceedings{
plappert2018parameter,
title={Parameter Space Noise for Exploration},
author={Matthias Plappert and Rein Houthooft and Prafulla Dhariwal and Szymon Sidor and Richard Y. Chen and Xi Chen and Tamim Asfour and Pieter Abbeel and Marcin Andrychowicz},
booktitle={International Conference on Learning Representations},
year={2018},
url={https://openreview.net/forum?id=ByBAl2eAZ},
}