分阶段策略梯度(PPG)¶
论文链接: https://proceedings.mlr.press/v139/cobbe21a
分阶段策略梯度(Phasic Policy Gradient,PPG)是一种先进的强化学习算法,旨在提高策略优化的效率。 该算法建立在 PPO 框架之上,通过引入两阶段训练机制, 将策略优化与辅助价值函数学习解耦。
PPG 的特征 |
是否具备 |
说明 |
|---|---|---|
同策略(On-policy) |
✅ |
评估策略与目标策略相同。 |
异策略(Off-policy) |
❌ |
评估策略与目标策略不同。 |
无模型(Model-free) |
✅ |
无须预先构建环境动力学模型。 |
基于模型(Model-based) |
❌ |
需要使用环境模型训练策略。 |
离散动作 |
✅ |
可处理离散动作空间。 |
连续动作 |
✅ |
可处理连续动作空间。 |
方法¶
在传统 PPO 中,价值函数被用作策略梯度的基线,并与策略共同训练。 然而,这种耦合可能会限制学习过程的有效性, 因为策略优化可能干扰价值函数的学习,反之亦然。
PPG 通过引入分阶段学习机制解决这一问题, 将策略优化和价值函数学习划分为两个相互独立的阶段。
PPG 包含以下两个阶段:
策略阶段:
使用 PPO 优化策略,重点是最大化回报。
价值函数在策略优化过程中充当基线,但在该阶段不进行训练。
在策略阶段,使用标准 PPO 目标函数优化策略 \(\pi_{\theta}\):
其中:
\(r_t(\theta) = \frac{\pi_{\theta}(a_t|s_t)}{\pi_{\theta_{old}}(a_t|s_t)}\) 为新旧策略的概率比;
\(A_t\) 为优势估计;
\(\epsilon\) 为裁剪参数。
辅助阶段:
使用辅助损失项训练价值函数。
该阶段使价值函数能够更加准确地预测回报,从而提高其作为基线的有效性。
在辅助阶段,通过最小化辅助损失更新价值函数 \(V_{\phi}\):
其中:
\(R_t\) 为目标回报;
\(L_{consistency}\) 用于约束策略动作与价值预测之间的一致性;
\(\beta\) 为一致性损失项的权重。
上述两个阶段交替进行, 使价值函数和策略能够在不直接相互干扰的情况下更加有效地学习。
在 XuanCe 中运行 PPG¶
在 XuanCe 中运行 PPG 之前,需要先准备一个 conda 环境,并按照
安装步骤安装 xuance。
运行内置示例¶
完成安装后,可以打开 Python 控制台,并使用以下命令直接运行 PPG:
import xuance
runner = xuance.get_runner(method='ppg',
env='classic_control', # 可选项:classic_control、box2d、atari。
env_id='CartPole-v1', # 可选项:CartPole-v1、LunarLander-v2、ALE/Breakout-v5 等。
is_test=False)
runner.run() # 也可以使用 runner.benchmark()
使用自定义配置运行¶
如需使用不同配置运行 PPG,可以新建一个 .yaml 文件,例如 my_config.yaml。
然后使用以下代码运行 PPG:
import xuance as xp
runner = xp.get_runner(method='ppg',
env='classic_control', # 可选项:classic_control、box2d、atari。
env_id='CartPole-v1', # 可选项:CartPole-v1、LunarLander-v2、ALE/Breakout-v5 等。
config_path="my_config.yaml", # 请确保 my_config.yaml 文件的路径正确。
is_test=False)
runner.run() # 也可以使用 runner.benchmark()
如需进一步了解配置方法,请参阅 配置教程。
在自定义环境中运行¶
如需在 XuanCe 尚未包含的自定义环境中运行 PPG,
需要按照新环境教程
中的步骤定义新环境。
然后,准备配置文件
ppg_myenv.yaml。
完成上述操作后,可以使用以下代码在自定义环境中运行 PPG:
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 PPG_Agent
configs_dict = get_configs(file_dir="ppg_myenv.yaml")
configs = argparse.Namespace(**configs_dict)
REGISTRY_ENV[configs.env_name] = MyNewEnv
envs = make_envs(configs) # 创建并行环境。
Agent = PPG_Agent(config=configs, envs=envs) # 创建一个来自 XuanCe 的 PPG 智能体。
Agent.train(configs.running_steps // configs.parallels) # 对模型进行多个步骤的训练。
Agent.save_model("final_train_model.pth") # 将模型保存到 model_dir。
Agent.finish() # 结束训练。
参考文献¶
@inproceedings{cobbe2021phasic,
title={Phasic policy gradient},
author={Cobbe, Karl W and Hilton, Jacob and Klimov, Oleg and Schulman, John},
booktitle={International Conference on Machine Learning},
pages={2020--2027},
year={2021},
organization={PMLR}
}