在Hugging Face,我们为深度强化学习研究人员和爱好者做出了贡献,为此生态系统做出了贡献。最近,我们已经集成了稳定的基线3等深度强化学习框架。
今天,我们很高兴地宣布,我们将决策变换器这种离线强化学习方法整合到了🤗 transformers库和Hugging Face Hub中。我们在改进深度强化学习领域的可访问性方面有一些令人兴奋的计划,并期待在未来几周和几个月内与您分享。
- 什么是离线强化学习?
- 介绍决策变换器
- 在🤗 Transformers中使用决策变换器
- 结论
- 下一步是什么?
- 参考文献
什么是离线强化学习?
深度强化学习(RL)是一种构建决策制定代理的框架。这些代理旨在通过试错与环境进行交互并接收奖励作为唯一的反馈来学习最优行为(策略)。
代理的目标是最大化其累积奖励,称为回报。因为RL基于奖励假设:所有目标都可以描述为最大化预期的累积奖励。
深度强化学习代理通过批量经验进行学习。问题是,它们是如何收集经验的呢?:
在线和离线设置下强化学习的比较,图片来源于本文
在在线强化学习中,代理直接收集数据:它通过与环境交互收集一批经验。然后,它立即使用这些经验(或通过一些回放缓冲区)进行学习(更新其策略)。
但这意味着你要么直接在真实世界中训练你的代理,要么拥有一个模拟器。如果你没有一个,你需要构建它,这可能非常复杂(如何在环境中反映复杂的现实世界?),昂贵,并且不安全,因为如果模拟器存在缺陷,代理将利用它们以获得竞争优势。
另一方面,在离线强化学习中,代理只使用从其他代理或人类示范收集的数据。它不与环境交互。
具体过程如下:
- 使用一个或多个策略和/或人类互动创建一个数据集。
- 在这个数据集上运行离线RL来学习一个策略
这种方法有一个缺点:反事实查询问题。如果我们的代理决定做一些我们没有数据的事情怎么办?例如,在交叉口右转,但我们没有这个轨迹。
这个主题已经存在一些解决方案,但如果您想了解更多关于离线强化学习的信息,您可以观看这个视频
介绍决策变换器
决策变换器模型由“决策变换器:通过序列建模进行强化学习”(Chen L.等人)引入。它将强化学习抽象为一个条件序列建模问题。
主要思想是,我们不再使用RL方法(如拟合值函数)训练策略,该方法将告诉我们为了最大化回报(累积奖励)应该采取什么行动,而是使用序列建模算法(Transformer)。给定一个期望的回报、过去的状态和行动,Transformer将生成未来的行动以实现这个期望的回报。它是一个自回归模型,以期望的回报、过去的状态和行动为条件生成未来的行动,以实现期望的回报。
这是强化学习范式的完全转变,因为我们使用生成轨迹建模(建模状态、行动和奖励序列的联合分布)来替代传统的RL算法。这意味着在决策变换器中,我们不是最大化回报,而是生成一系列实现期望回报的未来行动。
具体过程如下:
- 我们使用最后K个时间步骤将决策变换器与3个输入一起馈送:
- 未来回报
- 状态
- 行动
- 如果状态是向量,则使用线性层将符号嵌入;如果是帧,则使用CNN编码器。
- 输入通过GPT-2模型进行处理,模型通过自回归建模预测未来的行动。
决策Transformer架构。状态、动作和回报被输入到特定模态的线性嵌入中,并添加了位置编码的时步编码。令牌被输入到一个GPT架构中,使用因果自注意力掩码预测动作。[1]图。
在🤗 Transformers中使用决策Transformer
决策Transformer模型现在可以作为🤗 transformers库的一部分使用。此外,我们还分享了九个在Gym环境中进行连续控制任务的预训练模型检查点。
通过在Gym Walker2d环境中使用离线RL学习的“专家”决策Transformer模型。
安装包
pip install git+https://github.com/huggingface/transformers
加载模型
使用决策Transformer相对简单,但由于它是一个自回归模型,在每个时间步骤中准备模型的输入时需要注意一些问题。我们准备了一个Python脚本和一个Colab笔记本,演示了如何使用此模型。
在🤗 transformers库中简单地加载预训练的决策Transformer:
from transformers import DecisionTransformerModel
model_name = "edbeeching/decision-transformer-gym-hopper-expert"
model = DecisionTransformerModel.from_pretrained(model_name)
创建环境
我们为Gym Hopper、Walker2D和Halfcheetah提供了预训练检查点。Atari环境的检查点将很快提供。
import gym
env = gym.make("Hopper-v3")
state_dim = env.observation_space.shape[0] # 状态大小
act_dim = env.action_space.shape[0] # 动作大小
自回归预测函数
模型执行自回归预测;也就是说,在当前时间步骤t上进行的预测是依次在前几个时间步骤的输出上进行条件。这个函数相当复杂,所以我们将在注释中尽量解释它。
# 从模型中使用自回归预测获取动作的函数,使用先前20个时间步骤的窗口。
def get_action(model, states, actions, rewards, returns_to_go, timesteps):
# 此实现不考虑过去的回报
states = states.reshape(1, -1, model.config.state_dim)
actions = actions.reshape(1, -1, model.config.act_dim)
returns_to_go = returns_to_go.reshape(1, -1, 1)
timesteps = timesteps.reshape(1, -1)
# 预测是基于最多20个先前时间步骤的
states = states[:, -model.config.max_length :]
actions = actions[:, -model.config.max_length :]
returns_to_go = returns_to_go[:, -model.config.max_length :]
timesteps = timesteps[:, -model.config.max_length :]
# 将所有令牌填充到序列长度,如果我们处理批次,则需要这样做
padding = model.config.max_length - states.shape[1]
attention_mask = torch.cat([torch.zeros(padding), torch.ones(states.shape[1])])
attention_mask = attention_mask.to(dtype=torch.long).reshape(1, -1)
states = torch.cat([torch.zeros((1, padding, state_dim)), states], dim=1).float()
actions = torch.cat([torch.zeros((1, padding, act_dim)), actions], dim=1).float()
returns_to_go = torch.cat([torch.zeros((1, padding, 1)), returns_to_go], dim=1).float()
timesteps = torch.cat([torch.zeros((1, padding), dtype=torch.long), timesteps], dim=1)
# 执行预测
state_preds, action_preds, return_preds = model(
states=states,
actions=actions,
rewards=rewards,
returns_to_go=returns_to_go,
timesteps=timesteps,
attention_mask=attention_mask,
return_dict=False,)
return action_preds[0, -1]
评估模型
为了评估模型,我们需要一些额外的信息;在训练过程中使用的状态的均值和标准差。幸运的是,这些信息可以在Hugging Face Hub上的每个检查点模型卡中找到!
我们还需要为模型设置一个目标回报。这就是离线强化学习中条件化回报的威力所在:我们可以使用目标回报来控制策略的性能。在多人游戏设置中,这可能非常强大,我们希望调整对手机器人的性能,使其对玩家来说具有适当的难度。作者在他们的论文中展示了一张很好的图表!
决策Transformer在指定目标(期望)回报条件下的采样(评估)回报累积。上:Atari。下:D4RL VoAGI-replay数据集。图来自[1]。
TARGET_RETURN = 3.6 # 在训练过程中进行了归一化
MAX_EPISODE_LENGTH = 1000
state_mean = np.array(
[1.3490015, -0.11208222, -0.5506444, -0.13188992, -0.00378754, 2.6071432,
0.02322114, -0.01626922, -0.06840388, -0.05183131, 0.04272673,])
state_std = np.array(
[0.15980862, 0.0446214, 0.14307782, 0.17629202, 0.5912333, 0.5899924,
1.5405099, 0.8152689, 2.0173461, 2.4107876, 5.8440027,])
state_mean = torch.from_numpy(state_mean)
state_std = torch.from_numpy(state_std)
state = env.reset()
target_return = torch.tensor(TARGET_RETURN).float().reshape(1, 1)
states = torch.from_numpy(state).reshape(1, state_dim).float()
actions = torch.zeros((0, act_dim)).float()
rewards = torch.zeros(0).float()
timesteps = torch.tensor(0).reshape(1, 1).long()
# 在环境中执行步骤
for t in range(max_ep_len):
# 为当前时间步骤添加零动作作为输入
actions = torch.cat([actions, torch.zeros((1, act_dim))], dim=0)
rewards = torch.cat([rewards, torch.zeros(1)])
# 预测要采取的动作
action = get_action(model,
(states - state_mean) / state_std,
actions,
rewards,
target_return,
timesteps)
actions[-1] = action
action = action.detach().numpy()
# 基于此动作与环境进行交互
state, reward, done, _ = env.step(action)
cur_state = torch.from_numpy(state).reshape(1, state_dim)
states = torch.cat([states, cur_state], dim=0)
rewards[-1] = reward
pred_return = target_return[0, -1] - (reward / scale)
target_return = torch.cat([target_return, pred_return.reshape(1, 1)], dim=1)
timesteps = torch.cat([timesteps, torch.ones((1, 1)).long() * (t + 1)], dim=1)
if done:
break
您可以在我们的Colab笔记本中找到更详细的示例,包括代理程序视频的创建。
结论
除了决策Transformer,我们还希望支持深度强化学习社区的更多用例和工具。因此,非常乐意听取您对决策Transformer模型的反馈,以及我们可以与您共同构建的任何对强化学习有用的内容。欢迎随时与我们联系。
接下来是什么?
在接下来的几周和几个月中,我们计划支持生态系统中的其他工具:
- 集成RL-baselines3-zoo
- 将RL-trained-agents models上传到Hub:一个使用stable-baselines3的大型预训练强化学习代理集合
- 集成其他深度强化学习库
- 实现用于Atari的卷积决策Transformer
- 还有更多内容即将到来 🥳
保持联系的最佳方式是加入我们的Discord服务器,与我们和社区进行交流。
参考文献
[1] 陈丽丽等人,“决策变换器:通过序列建模的强化学习”,《神经信息处理系统进展》第34卷(2021年)。
[2] Agarwal, Rishabh, Dale Schuurmans, and Mohammad Norouzi. “离线强化学习的乐观视角”,机器学习国际会议,PMLR,2020年。
致谢
我们要感谢这篇论文的第一作者Kevin Lu和Lili Chen,感谢他们的建设性对话。