• Stable Baselines/RL算法/A2C

    Stable Baselines官方文档中文版 Github CSDN 尝试翻译官方文档,水平有限,如有错误万望指正

    Asynchronous Advantage Actor Critic (A3C)的同步、确定性变体。它使用多个workers来避免使用重播缓存。

  • 要点核心

  • 适用情况

    • 迭代策略:✔️

    • 多进程:✔️

    • Gym空间:

      | Space | Action | Observation | | ——————- | ——— | —————- | | Discrete | ✔️ | ✔️ | | Box | ✔️ | ✔️ | | MultiDiscrete | ✔️ | ✔️ | | MultiBinary | ✔️ | ✔️ |

  • 案例

    用4进程在CartPole-v1上训练A2C agent

    1. import gym
    2. from stable_baselines.common.policies import MlpPolicy
    3. from stable_baselines.common.vec_env import SubprocVecEnv
    4. from stable_baselines import A2C
    5. # multiprocess environment
    6. n_cpu = 4
    7. env = SubprocVecEnv([lambda: gym.make('CartPole-v1') for i in range(n_cpu)])
    8. model = A2C(MlpPolicy, env, verbose=1)
    9. model.learn(total_timesteps=25000)
    10. model.save("a2c_cartpole")
    11. del model # remove to demonstrate saving and loading
    12. model = A2C.load("a2c_cartpole")
    13. obs = env.reset()
    14. while True:
    15. action, _states = model.predict(obs)
    16. obs, rewards, dones, info = env.step(action)
    17. env.render()
  • 参数

    1. stable_baselines.a2c.A2C(policy, env, gamma=0.99, n_steps=5, vf_coef=0.25, ent_coef=0.01, max_grad_norm=0.5, learning_rate=0.0007, alpha=0.99, epsilon=1e-05, lr_schedule='constant', verbose=0, tensorboard_log=None, _init_setup_model=True, policy_kwargs=None, full_tensorboard_log=False)

    A2C(Adavantage Actor Critic)模型类, https://arxiv.org/abs/1602.01783

    | 参数 | 数据类型 | 意义 | | —————————— | ———————————— | —————————————————————————————— | | policy | ActorCriticPolicy or str | 所用策略模型(MlpPolicy, CnnPolicy, CnnLstmPolicy, …) | | env | Gym environment or str | 学习所用环境(如果注册在Gym,可以是str) | | gamma | float | 贴现因子 | | n_steps | int | 运行环境每次更新所用时间步(例如:当n_env是同时运行的环境副本数量时,batch=n_steps*n_env) | | vf_coef | float | 用于损失函数的价值函数系数 | | ent_coef | float | 损失函数的信息熵系数 | | max_grad_norm | float | 梯度裁剪的最大值 | | learning_rate | float | 学习率 | | alpha | float | RMSProp衰减参数(默认:0.99) | | epsilon | float | RMSProp epsilon(稳定RMSProp更新中分母的平方根计算)(默认1e-5) | | lr_schedule | str | 更新学习率的调度程序类型(‘linear’, ‘constant’, ‘double_linear_con’, ‘middle_drop’ or ‘double_middle_drop’) | | verbose | int | 日志信息级别:0None;1训练信息;2tensorflow调试 | | tensorboard_log | str | tensorboard的日志位置(如果时None,没有日志) | | _init_setup_model | bool | 实例化创建过程中是否建立网络(只用于载入) | | policy_kwargs | dict | 创建过程中传递给策略的额外参数 | | full_tensorboard_log | bool | 当使用tensorboard时,是否记录额外日志(这个日志会占用大量空间) |

    • action_probability(observation, state=None, mask=None, actions=None, logp=False)

      如果actionsNone,那么从给定观测中获取模型的行动概率分布。

      输出取决于行动空间:

      • 离散:每个可能行动的概率
      • Box:行动输出的均值和标准差

      然而,如果actions不是None,这个函数会返回给定行动与参数(观测,状态,…)用于此模型的概率。对于离散行动空间,它返回概率密度;对于连续行动空间,则是概率密度。这是因为在连续空间,概率密度总是0,更详细的解释见 http://blog.christianperone.com/2019/01/

      | 参数 | 数据类型 | 意义 | | —————- | ————— | —————————————————————————————— | | observation | np.ndarray | 输入观测 | | state | np.ndarray | 最新状态(可以时None,用于迭代策略) | | mask | np.ndarray | 最新掩码(可以时None,用于迭代策略) | | actions | np.ndarray | (可选参数)为计算模型为每个给定参数选择给定行动的似然。行动和观测必须具有相同数目(None返回完全动作分布概率) | | logp | bool | (可选参数)当指定行动,返回log空间的概率。如果action是None,则此参数无效 |

      返回:np.ndarray)模型的(log)行动概率

    • get_env()

      返回当前环境(如果没有定义可以是None

      返回:Gym Environment)当前环境

    • get_parameter_list()

      获取模型参数的tensorflow变量

      包含连续训练(保存/载入)所用的所有必要变量

      返回:listtensorflow变量列表

    • get_parameters()

      获取当前模型参数作为变量名字典 -> ndarray

      返回:(OrderedDict)变量名字典 -> 模型参数的ndarray

    • learn(total_timesteps, callback=None, seed=None, log_interval=100, tb_log_name=’A2C’, reset_num_timesteps=True)

      返回一个训练好的模型

      | 参数 | 数据类型 | 意义 | | —————————- | ——————————- | —————————————————————————————— | | total_timesteps | int | 训练用样本总数 | | seed | int | 训练用初始值,如果None:保持当前种子 | | callback | function (dict, dict) | 与算法状态的每步调用的布尔函数。采用局部或全局变量。如果它返回false,训练被终止 | | log_interval | int | 记录日志之前的时间步数 | | tb_log_name | str | 运行tensorboard日志的名称 | | reset_num_timesteps | bool | 是否重置当前时间步数(日志中使用) |

      返回:(BaseRLModel) 训练好的模型

    • *classmethod load(load_path, env=None, kwargs)*

      从文件中载入模型

      | 参数 | 数据类型 | 意义 | | ————- | ———————— | —————————————————————————————— | | load_path | str or file-like | 文件路径 | | env | Gym Envrionment | 载入模型运行的新环境(如果你只是从训练好的模型来做预测可以是None) | | kwargs | | 载入过程中能改变模型的额外 |

  • load_parameters(load_path_or_dict, exact_match=True)

    从文件或字典中载入模型参数

    字典关键字是tensorflow变量名,可以用get_parameters函数获取。如果exact_matchTrue,字典应该包含所有模型参数的关键字,否则报错RunTimeError。如果是False,只有字典包含的变量会被更新。

    此函数并不载入agent的超参数

    警告:

    此函数不更新训练器/优化器的变量(例如:momentum)。因为使用此函数的这种训练可能会导致低优化结果

    | 参数 | 数据类型 | 意义 | | ————————- | ———————— | —————————————————————————————— | | load_path_or_dict | str or file-like | 保存参数或变量名字典位置->载入的是ndarrays | | exact_match | bool | 如果是True,期望载入关键字包含模型所有变量的字典;如果是False,只载入字典中提及的参数。默认True |

  • predict(observation, state=None, mask=None, deterministic=False)

    获取从参数得到的模型行动

    | 参数 | 数据类型 | 意义 | | ——————- | ————— | —————————————————— | | observation | np.ndarray | 输入观测 | | state | np.ndarray | 最新状态(可以时None,用于迭代策略) | | mask | np.ndarray | 最新掩码(可以时None,用于迭代策略) | | deterministic | bool | 是否返回确定性的行动 |

    返回:(np.ndarray, np.ndarray) 模型的行动和下一状态(用于迭代策略)

  • pretrain(dataset, n_epochs=10, learning_rate=0.0001, adam_epsilon=1e-08, val_interval=None)

    用行为克隆预训练一个模型:在给定专家数据集上的监督学习

    目前只支持Box和离散空间

    | 参数 | 数据类型 | 意义 | | ——————- | ——————- | ————————————————————————— | | dataset | ExpertDataset | 数据集管理器 | | n_epochs | int | 训练集上的迭代次数 | | learning_rate | float | 学习率 | | adam_epsilon | float | adam优化器的$\epsilon$ 值 | | val_interval | int | 报告每代的训练和验证损失。默认最大纪元数的十分之一 |

    返回:(BaseRLModel) 预训练好的模型

  • save(save_path)

    保存当前参数到文件

    | 参数 | 数据类型 | 意义 | | ————- | ———————————- | ———— | | save_path | str or file-like object | 保存位置 |

  • set_env(env)

    检查环境的有效性,如果是一致的,将其设置为当前环境

    | 参数 | 数据类型 | 意义 | | —— | ———————- | —————————- | | env | Gym Environment | x学习一个策略的环境 |

  • setup_model()

    创建训练模型所必须的函数的tensorflow图表