我正在使用 tensorforce 实现的 PPO 算法:https ://github.com/reinforceio/tensorforce 。它效果很好,我对结果非常满意。
但是,我注意到有许多元参数可用于 PPO 算法:
# the tensorforce agent configuration ------------------------------------------
network_spec = [
dict(type='dense', size=256),
dict(type='dense', size=256),
]
agent = PPOAgent(
states=environment.states,
actions=environment.actions,
network=network_spec,
# Agent
states_preprocessing=None,
actions_exploration=None,
reward_preprocessing=None,
# MemoryModel
update_mode=dict(
unit='episodes',
# 10 episodes per update
batch_size=10,
# Every 10 episodes
frequency=10
),
memory=dict(
type='latest',
include_next_states=False,
capacity=200000
),
# DistributionModel
distributions=None,
entropy_regularization=0.01,
# PGModel
baseline_mode='states',
baseline=dict(
type='mlp',
sizes=[32, 32]
),
baseline_optimizer=dict(
type='multi_step',
optimizer=dict(
type='adam',
learning_rate=1e-3
),
num_steps=5
),
gae_lambda=0.97,
# PGLRModel
likelihood_ratio_clipping=0.2,
# PPOAgent
step_optimizer=dict(
type='adam',
learning_rate=1e-3
),
subsampling_fraction=0.2,
optimization_steps=25,
execution=dict(
type='single',
session_config=None,
distributed_spec=None
)
)
所以我的问题是:有没有办法直观地理解所有这些元参数的含义/效果,并使用这种直观的理解来提高训练性能?
到目前为止,我已经得出了 - 从阅读 PPO 论文和周围的文献,并使用代码 - 得出以下结论。任何人都可以完成/正确吗?
network_spec的效果:这是“主网络”的大小。非常经典:需要足够大才能获得有价值的预测,也不能太大,否则很难训练。
update_mode中参数的影响:这是执行网络更新的频率。
batch_size是用于批量更新的数量。不确定效果,也不确定这在实践中究竟意味着什么(所有样本都是从仅 10 批内存重放中获取的)?
频率是执行更新的频率。我猜频率高会使训练更慢但更稳定(作为来自更多不同批次的样本)?
单位:不知道这是做什么的
memory:这是重放内存缓冲区。
类型:不确定这是做什么或如何工作的。
include_next_states:不确定这是做什么或如何工作的
容量:我认为这是存储了多少元组(状态、动作、奖励)。我认为这是一个重要的元参数。根据我的经验,如果这与一集中的动作数量相比太少,那么学习效果就会非常糟糕。我猜这是因为它必须足够大以存储许多剧集,否则网络会从相关数据中学习——这很糟糕。
DistributionMode:猜猜这是控件分布的模型?不知道那里的参数是做什么的。
PGModel:不知道那里的参数是做什么的。知道是否应该调整一些/哪些会很有趣。
PGLRModel:同上,不知道所有这些参数的作用/是否应该调整它们。
PPOAgend:同上,不知道所有这些参数的作用/是否应该调整它们。
概括
总而言之,如果能获得一些帮助,那就太好了:
- 应该调整哪些参数
- 应该如何调整这些参数?是否有关于如何调整它们/在什么情况下的“高级直觉”?