使用 revive_filter 算法控制 Mujoco-HalfCheetah 运动¶
我们可以用集成在REVIVE SDK中revive_filter算法进行环境学习。简单来说,revive_filter算法从离线数据集中学习了一个具有泛化能力的环境转移奖励模型, 这个环境转移奖励模型可以在后续任务中起到过滤作用,从而得到更可靠的环境转移。在生成环境转移的时候,我们的环境模型会生成批量的环境转移候选集, 然后通过环境转移奖励模型从候选集中选取最可靠的一个环境转移作为最终结果。但需要注意,根据不同参数设定,该算法会不同程度上导致内存与显存的开销增加,并且降低训练速度。 算法性能也受关键超参数影响,它们在文末有详细解释。
在环境学习过程中,该算法会生成2个模型,一个是环境模型,一个是环境转移奖励模型。 环境模型作为状态转移模型用来生成下一时刻状态,环境转移奖励模型用来判断环境模型预测的状态是否合理。 下面我们将演示如何将该算法应用于 使用 REVIVE SDK 控制 Mujoco-HalfCheetah 运动 的任务当中, 最终使其学得更好的策略。
在以下算法示例中,我们所使用的决策流图会发生变化,这就涉及到 异构决策流 的功能。
在以下示例中,环境学习与策略学习的决策流图是不同的,它们的区别在于环境学习过程中不学习 action
节点,
而策略学习则需要学习 action
节点。下面将展示训练环境模型与策略模型的决策流图。
环境训练的决策流图:
metadata:
columns:
...
graph:
delta_x:
- obs
- action
delta_obs:
- obs
- action
next_obs:
- obs
- delta_obs
expert_functions:
next_obs:
'node_function' : 'delta_obs.get_next_obs'
策略训练的决策流图:
metadata:
columns:
...
graph:
action:
- obs
delta_x:
- obs
- action
delta_obs:
- obs
- action
next_obs:
- obs
- delta_obs
expert_functions:
next_obs:
'node_function' : 'delta_obs.get_next_obs'
专家函数 get_next_obs
的实现如下:
import torch
import numpy as np
def get_next_obs(data):
obs = data["obs"]
delta_obs = data["delta_obs"]
if len(obs.shape) == 1:
obs = obs.reshape(1, -1)
delta_obs = delta_obs.reshape(1, -1)
next_obs = obs + delta_obs
if len(data["obs"].shape) == 1:
next_obs = next_obs.reshape(-1)
return next_obs
该专家函数放置于 delta_obs.py
文件中。
此外,启动该功能我们需要在 config.json
中做如下配置:
{
...
"venv_algo_config": {
"revive_f": [
{
"name": "bc_epoch",
"type": "int",
"default": 1500
},
{
"name": "revive_epoch",
"description": "Number of epcoh for the training process",
"abbreviation": "mep",
"type": "int",
"default": 1500
},
{
"name": "bc_lr",
"type": "float",
"default": 1e-3
},
{
"name": "bc_steps",
"type": "int",
"default": 10
},
{
"name": "matcher_record_len",
"type": "int",
"default": 50
},
{
"name": "fix_std",
"type": "float",
"default": 0.125
},
...
],
...
},
"venv_algo_config":{
"sac":{
{
"name": "penalty_type",
"type": "str",
"default": "filter"
},
{
"name": "penalty_sample_num",
"type": "int",
"default": 50
},
{
"name": "reward_uncertainty_weight",
"type": "float",
"default": 0.75
},
{
"name": "ensemble_choosing_interval",
"type": "int",
"default": 5
},
{
"name": "ensemble_size",
"type": "int",
"default": 10
},
{
"name": "candidate_num",
"type": "int",
"default": 20
},
{
"name": "filter",
"type": "bool",
"default": false
},
...
}
该例子中,我们先用 revive_f
算法训练了环境模型,然后用 sac
算法训练了策略模型。其中有一些参数需要注意:
在训练环境时:
fix_std
判别器模型是在环境模型的对抗学习中不断更新的,这里控制了这一环境模型输出的标准差大小,建议设置为 0.125,0.15 等,但具体任务仍需要调参对比。matcher_record_len
是用来控制保存环境转移奖励模型的数量。此参数越大,保存模型所占用空间也越大。revive_epoch
是用来控制对抗训练的训练轮数。bc_epoch
是用来控制模仿学习的训练轮数。bc_lr
是用来控制模仿学习的学习率。
训练策略时:
penalty_type
是用来控制奖励惩罚的类型。目前只有filter
与None
可选。None
表示不使用任何惩罚项,filter
表示使用环境转移奖励模型打分作为惩罚依据(但需要注意,此功能只有当环境训练算法为revive_f
时才会生效)。penalty_sample_num
是用来控制计算算法中奖励惩罚时的样本数量。reward_uncertainty_weight
是用来控制算法中奖励惩罚的权重,建议设置为 0.75,但具体任务仍需要调参对比。ensemble_choosing_interval
是用来对保存的模型进行排序后按照设定的间隔选取进而形成集成模型。ensemble_size
是用来控制环境转移奖励模型的数量。此参数越大,占用内存与显存也会越大,相应地训练速度也会变慢。candidate_num
是用来控制环境模型输出时采样的候选数量。只有当filter
为 true 时时,该参数才会生效。需要注意,此参数越大,占用内存与显存也会越大,相应地训练速度也会变慢。filter
是用来控制是否使用环境转移奖励模型辅助输出。注意,如果此参数为true
,则训练速度会变慢。
训练完策略后,我们将策略放到环境中进行在线测试。50条轨迹可以达到平均 return 能达到 8500 分左右。比 revive_p算法的结果 7000 分提升了 20%左右。
Note
默认情况下,为了运行效率,不使用环境转移奖励模型辅助输出。
详细算法参考文章: Reward-Consistent Dynamics Models are Strongly Generalizable for Offline Reinforcement Learning 。