PPO 元参数的调整:每个参数作用的高级概述

人工智能 深度学习 强化学习
2021-11-07 23:07:03

我正在使用 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:同上,不知道所有这些参数的作用/是否应该调整它们。

概括

总而言之,如果能获得一些帮助,那就太好了:

  • 应该调整哪些参数
  • 应该如何调整这些参数?是否有关于如何调整它们/在什么情况下的“高级直觉”?
1个回答

关于内存字典的一些调查:当前类型是latest,这意味着您使用的不是内存重放,而是最新的内存。切换到回放可能会有所帮助。此外,include_next_state意味着您存储元组(状态、动作、奖励、下一个状态)。但它不是一个真正的参数,因为在 PPO 中它必须设置为False,否则会引发错误。你的解释capacity看起来不错。

关于更新模式规范字典,您当前的设置意味着:每 10 ( frequency) 集 ( unit),您从内存中拉出一批 10 ( batch_size) 集 ( unit)(拉方法通过内存字典定义),然后执行此批次的优化步骤。请注意,它unit定义了优化频率的单位和从内存中获取的对象的类型。